schema { subscription: RootSubscriptionType mutation: RootMutationType query: RootQueryType } type RootQueryType { """ Returns a cursor-paginated page of non-deleted tests with all-time results for each test's primary goal. Without `order`, tests come newest id first; pass `nextPageCursor` back as `cursor` for the next page. Use `abTestRefList` for lightweight selectors and `abTestResultCounts` for goal- or date-scoped results. Requires A/B testing view access. """ abTestList( "Site id from `sites`; omit to include all accessible sites." site: Int "Opaque `nextPageCursor` from this list query; omit for the first page." cursor: String "Number of tests to return, at least 1; defaults to 10, with no maximum enforced." limit: Int "Substring matched against test name, page URL, or test id; omit for no search filter." search: String "Filter by `DRAFT`, `RUNNING`, or `STOPPED`; omitted, null, or `DELETED` leaves statuses unfiltered." status: AbTestStatus "Sort settings; omitted sorts by id descending, while an empty object uses creation time descending." order: AbTestListOrder ): AbTestsListMeta! """ Returns all non-deleted tests and their variant ids for a site, ordered by test name then id. Use this unpaginated list for selectors instead of loading metrics with `abTestList`. Requires A/B testing view access. """ abTestRefList("Site id from `sites`; required to scope the selector list." site: Int!): [AbTestRef!]! "Identical to `abTestList`, with the same arguments, ordering, cursor, and results. Requires A/B testing view access." abTestDashboardList( "Site id from `sites`; omit to include all accessible sites." site: Int "Opaque `nextPageCursor` from this list query; omit for the first page." cursor: String "Number of tests to return, at least 1; defaults to 10, with no maximum enforced." limit: Int "Substring matched against test name, page URL, or test id; omit for no search filter." search: String "Filter by `DRAFT`, `RUNNING`, or `STOPPED`; omitted, null, or `DELETED` leaves statuses unfiltered." status: AbTestStatus "Sort settings; omitted sorts by id descending, while an empty object uses creation time descending." order: AbTestListOrder ): AbTestsListMeta! """ Returns the most recently created RUNNING or STOPPED tests, newest first, with all-time results for each test's primary goal; there is no cursor. Use `abTestList` for filters and pagination. Requires A/B testing view access. """ abTestHomeRecent( "Site id from `sites`; omit to include all accessible sites." site: Int "Number of tests to return, at least 1; defaults to 3, with no maximum enforced." limit: Int ): [AbTest!]! """ Returns a numbered page of non-deleted tests, newest created first, optionally filtered by primary goal; `startDate` and `endDate` limit the attached results, not which tests are listed. Use `abTestList` for cursor pagination and search. Requires A/B testing view access; a shared goal link can also list that goal's tests. """ abTestListPaginated( "Site id from `sites`; omit to include all accessible sites." site: Int "Page size, at least 1; required in practice because omitted or null values fail validation." limit: Int "Primary goal id from `goalRefList`; omit to include tests for all goals." goalId: Int "Inclusive metrics start in Unix seconds (UTC); omit for no lower date filter." startDate: Int "Inclusive metrics end in Unix seconds (UTC); omit for no upper date filter." endDate: Int "Page number starting at 1; required, with no upper limit enforced." page: Int! ): AbTestsListPaginatedMeta! """ Returns one non-deleted test's editor data without loading metrics; a missing id is an error. Use `abTestResultDetail` for the default selected goal and `abTestResultCounts` for metrics. Requires A/B testing view access; shared access is also supported. """ abTestEditorDetail("Test id from `abTestList` or `abTestRefList`; deleted tests are excluded." id: Int!): AbTest! """ Returns one non-deleted test's structure and primary goal as `selectedGoal`, without metrics. Use `abTestResultCounts` for goal/date-scoped metrics; a missing test or primary goal is an error. Requires A/B testing view access; shared access is also supported. """ abTestResultDetail("Test id from `abTestList` or `abTestRefList`; deleted tests are excluded." id: Int!): AbTest! """ Returns totals and ordered per-variant metrics for one non-deleted test and a goal on its site. Use `abTestResultDetail` for structure or `abTestDistribution` for time buckets; variants default to name ascending. Missing tests or goals are errors. Requires A/B testing view access; shared access is also supported. """ abTestResultCounts( "Test id from `abTestList` or `abTestRefList`; deleted tests are excluded." id: Int! "Goal id from `goalRefList` for the test site; a missing or different-site goal is an error." goalId: Int! "Inclusive metrics start in Unix seconds (UTC); omit for no lower date filter." startDate: Int "Inclusive metrics end in Unix seconds (UTC); omit for no upper date filter." endDate: Int "Per-variant sort settings; defaults to variant name ascending." order: AbTestVariantOrder ): AbTestResultCounts! """ Returns chronological day, week, or month metric buckets for a non-deleted test and same-site goal. Use `abTestResultCounts` for totals; dates are clamped to publication and stop dates, and an inverted range returns an empty list. Weeks start on Monday and months on the first, after any partial first bucket. Requires A/B testing view access; shared access is also supported. """ abTestDistribution( "Test id from `abTestList` or `abTestRefList`; deleted tests are excluded." id: Int! "Goal id from `goalRefList` for the test site; a missing or different-site goal is an error." goalId: Int! "Inclusive start in Unix seconds (UTC); defaults to publication when available and is clamped to it." startDate: Int """ Inclusive end in Unix seconds (UTC); defaults to the stop time, or to the start for a test that is not stopped, so pass it for RUNNING tests. """ endDate: Int "Bucket size: `DAY`, `WEEK`, or `MONTH`; the first and last buckets may cover partial periods." timeUnit: TimeUnit! ): [AbTestDistribution!]! """ Returns counts of non-deleted tests by status across the sites the caller can access. Use this instead of paging through `abTestList` to count tests. Passing `site` checks access to it but does not reliably limit the counts to that site. Requires A/B testing view access. """ abTestStatusCounts( "Site id from `sites`; an inaccessible id returns an error, but the counts are not reliably limited to it." site: Int ): AbTestStatusCountsResult! """ Returns one accessible site export and its current generation and notification status. Use `aiExports` for recent requests or read this operation again after creation; the download URL is null until completion and after expiry. Requires a logged-in session, JSON export access or the export-everything override, site access, and view access to every included feature; missing or inaccessible exports return an error. """ aiExport( "Site ID from `sites` containing the export." siteId: Int! "Export ID from `createAiExport` or `aiExports`; not a site ID." id: Int! ): AiExport """ Returns accessible exports from the site's latest 100 requests, ordered by creation time then ID descending. Requests containing features the caller cannot view are omitted after the limit; there is no cursor. Use `aiExport` to inspect one request and its download availability. Requires a logged-in session, export availability through JSON export access or the export-everything override, site access, and view access to included features. """ aiExports("Site ID from `sites` whose recent export requests to list." siteId: Int!): [AiExport!]! """ Returns the signed-in viewer profile, active account settings, subscriptions, and accessible accounts. Profile fields describe the viewer, while `userId` identifies the active account and `guestId` identifies the viewer. Use `capabilities` for product permissions rather than `features`. Requires authentication. """ me: MeDetails """ Returns the active account API key, secret, and signature, creating credentials on first access if both are absent. Use `regenerateUserApiCredentials` to replace existing credentials. Requires API edit access. """ api: ApiKeys """ Returns a container for tracking settings; select nested fields to retrieve values. Use `me.settings` for saved account preferences. The IP and cookie-blocking fields require tracking options edit access. """ options: Options """ Returns authentication, impersonation, and shared-resource state for the current request. Use `me` for profile and active account data. """ sessionInfo: SessionInfo """ Returns the onboarding checklist tasks with dependency slugs, completion state, and the permission for each task. Reading also records completion for tasks whose conditions are now met. Use `trackGettingStarted` to record views or clicks. Requires authentication. """ gettingStarted: [GettingStarted] """ Returns the active account billing profile, including masked card details and company addresses. Use `defaultPaymentMethod` for the current card from Stripe and `paymentTransactionList` for billing history. Requires billing navigation access. """ billingDetails: BillingDetails """ Returns email notification preferences with defaults for every supported notification. Reading initializes missing signup notification preferences as opted out. Use `setUserNotifications` to change preferences. Requires Crazy Egg email settings navigation access. """ userNotifications: UserNotifications """ Returns a fresh JWT for the active account with its expiration time. The token expires two hours after issuance. Requires authentication. """ interagentJwt: InteragentJwt """ Same result, arguments, and access as `adPerformanceHeader`: the site's enabled ad-account connections with their import and sync status. Requires Ad Performance view access. """ adsLibraryPreviewHeader("Accessible site id from `sites`." siteId: Int!): AdPerformanceHeader """ Same result, arguments, and access as `adPerformanceAdPreview`: one imported ad's identity and normalized creative preview. Requires Ad Performance view access. """ adsLibraryPreviewAdPreview( "Accessible site id from `sites`." siteId: Int! "Crazy Egg ad id from `adPerformanceAdTree` or platform-mode performance results; not the provider's ad id." adId: Int! ): AdPerformanceAdPreviewPayload """ Same result, arguments, and access as `adPerformance`: spend, tracked visits, attributed conversions, rankings, daily charts, and recommendations for a site's ads. Requires Ad Performance view access. """ adsLibraryPreviewPerformance( "Accessible site id from `sites`." siteId: Int! "Unix seconds; uses the UTC date as an inclusive start. Omit for no lower bound; `presetDate` takes precedence." startAt: Int "Unix seconds; uses the UTC date as an inclusive end. Omit for no upper bound; `presetDate` takes precedence." endAt: Int """ Case-insensitive UTC preset that overrides `startAt`/`endAt`: today, yesterday, recent, last 7 days, last 30 days, this month, last month. `recent` includes today; last 7/30 days exclude it. Other values return an error. """ presetDate: String "Providers to include in `PLATFORM` mode; omitted or [] selects all enabled connections. Ignored in `UTM` mode." platforms: [AdPlatformSource!] """ Crazy Egg campaign ids from `adPerformanceAdTree`; unioned with ad-group/ad filters. First 500 unique ids used; ignored in `UTM` mode. """ campaignIds: [Int!] """ Crazy Egg ad-group ids from `adPerformanceAdTree`; unioned with campaign/ad filters. First 500 unique ids used; ignored in `UTM` mode. """ adGroupIds: [Int!] """ Crazy Egg ad ids from `adPerformanceAdTree`; unioned with campaign/ad-group filters. First 500 unique ids used; ignored in `UTM` mode. """ adIds: [Int!] """ Goal id from `goalCardList` or `controls.availableGoals`; 0 counts all goals. When omitted, a goal with conversions in the range is chosen and reported in `controls.selectedGoalId`, or all goals when none has any. """ goalId: Int """ `PLATFORM` matches imported ads and includes spend; `UTM` groups tracking parameters without spend. Defaults to `PLATFORM`. """ dataMode: AdPerformanceDataMode "Earliest or latest eligible ad visit before conversion; defaults to `LAST_TOUCH`." attributionModel: AdPerformanceAttributionModel """ Lookback from conversion to eligible ad visit, in days: 1, 7, 30, or 90. Defaults to 1; other values fall back to 1. """ conversionWindowDays: Int ): AdPerformance """ Returns a site's enabled ad-account connections (Meta, Google, Reddit) with import and sync status, ordered by provider then connection id. Use `adPerformance` for metrics and `adPerformanceAdTree` for filter ids. Requires Ad Performance view access. """ adPerformanceHeader("Accessible site id from `sites`." siteId: Int!): AdPerformanceHeader """ Returns an imported ad's identity and normalized creative for rendering a preview, or an error when the ad is not on the site. May fetch fresh Meta media from Meta and save it; unsupported formats return `previewSupported: false` with whatever text and media are available. Requires Ad Performance view access. """ adPerformanceAdPreview( "Accessible site id from `sites`." siteId: Int! "Crazy Egg ad id from `adPerformanceAdTree` or platform-mode performance results; not the provider's ad id." adId: Int! ): AdPerformanceAdPreviewPayload """ Returns a site's ad spend, tracked ad visits, attributed conversions and revenue, top-ad rankings, daily charts, and recommendations for a date range. Parts that time out or fail return zeros or empty lists, so check `slices` before trusting them. Use `adPerformanceHeader` for sync status only. Requires Ad Performance view access. """ adPerformance( "Accessible site id from `sites`." siteId: Int! "Unix seconds; uses the UTC date as an inclusive start. Omit for no lower bound; `presetDate` takes precedence." startAt: Int "Unix seconds; uses the UTC date as an inclusive end. Omit for no upper bound; `presetDate` takes precedence." endAt: Int """ Case-insensitive UTC preset that overrides `startAt`/`endAt`: today, yesterday, recent, last 7 days, last 30 days, this month, last month. `recent` includes today; last 7/30 days exclude it. Other values return an error. """ presetDate: String "Providers to include in `PLATFORM` mode; omitted or [] selects all enabled connections. Ignored in `UTM` mode." platforms: [AdPlatformSource!] """ Crazy Egg campaign ids from `adPerformanceAdTree`; unioned with ad-group/ad filters. First 500 unique ids used; ignored in `UTM` mode. """ campaignIds: [Int!] """ Crazy Egg ad-group ids from `adPerformanceAdTree`; unioned with campaign/ad filters. First 500 unique ids used; ignored in `UTM` mode. """ adGroupIds: [Int!] """ Crazy Egg ad ids from `adPerformanceAdTree`; unioned with campaign/ad-group filters. First 500 unique ids used; ignored in `UTM` mode. """ adIds: [Int!] """ Goal id from `goalCardList` or `controls.availableGoals`; 0 counts all goals. When omitted, a goal with conversions in the range is chosen and reported in `controls.selectedGoalId`, or all goals when none has any. """ goalId: Int """ `PLATFORM` matches imported ads and includes spend; `UTM` groups tracking parameters without spend. Defaults to `PLATFORM`. """ dataMode: AdPerformanceDataMode "Earliest or latest eligible ad visit before conversion; defaults to `LAST_TOUCH`." attributionModel: AdPerformanceAttributionModel """ Lookback from conversion to eligible ad visit, in days: 1, 7, 30, or 90. Defaults to 1; other values fall back to 1. """ conversionWindowDays: Int ): AdPerformance """ Returns the site's imported ads from enabled connections as a provider account, campaign, ad group, and ad tree whose ids feed the `campaignIds`, `adGroupIds`, and `adIds` filters of `adPerformance`. Holds at most 2000 ads without pagination and sets `truncated` when more exist; children sort by name then id. Requires Ad Performance view access. """ adPerformanceAdTree("Accessible site id from `sites`." siteId: Int!): AdPerformanceAdTreePayload "Identifies the account and database instances used by this development API before local seeding." localSeedTarget( "Also identify the ClickHouse events table when seeding conversions." includeEvents: Boolean "Also identify the ClickHouse traffic table when seeding Analytics." includeAnalytics: Boolean ): LocalSeedTarget! """ Returns cursor-paged surveys and CTAs, newest created first, excluding deleted records. Use addonDetail for one UUID; omitting the type includes only types the caller may view. Requires survey view access or CTA view access. """ addonList( "Site ID from sites; omit to include accessible sites." siteId: Int "Opaque nextPageCursor from addonList; omit for the first page." cursor: String "Page size, search text, add-on type, and publication status." filter: AddonFilter! ): AddonListMeta! """ Returns an existing add-on by UUID; missing or unauthorized records return an error. Use addonList to discover IDs; linked audit records may resolve deleted add-ons. Requires survey view access or CTA view access matching the type; matching shared links are allowed. """ addonDetail("Add-on UUID from addonList or addonDetail." id: String!): Addon """ Returns the theme JSON object from the most recently created add-on of a type at a site, preferring nonblank draft content. Returns null if no add-on or usable theme exists. Requires survey create access or CTA create access matching the type. """ addonLatestTheme( "Site ID from sites." siteId: Int! "Add-on type whose most recently created theme to reuse." type: AddonType! ): JSON """ Returns the JSON Schema (`schema`) and a representative content object (`example`) for add-on `content` and `draftContent` of the requested type; `contractRevision` identifies that contract. JSON-encode the object before sending it as `content`. The `addon-draft-create` skill is the long-form authoring reference. Requires survey create access or CTA create access matching the type. """ addonContentContract("SURVEY or CTA; selects the schema and example." type: AddonType!): AddonContentContract! """ Returns the shared survey and CTA template catalog, newest created first, plus whether the session may manage templates. Use addonTemplateDetail for one template. Requires survey view access or CTA view access. """ addonTemplatesList: AddonTemplateListMeta! """ Returns one reusable template, or null when its integer ID does not exist. Use addonTemplatesList to discover template IDs. Requires survey view access or CTA view access. """ addonTemplateDetail("Template ID from addonTemplatesList." id: Int!): AddonTemplate """ Returns one suggestion and marks it clicked if it is not already used or clicked. Use addonSuggestionsList to discover suggestions for a site. Requires survey view access. """ addonSuggestionDetail("Suggestion ID from addonSuggestionsList." id: Int!): AddonSuggestion """ Returns recent suggestions for a site, defaulting to three, and marks eligible suggestions viewed. Use addonSuggestionDetail to open a particular suggestion. Requires survey view access. """ addonSuggestionsList( "Survey suggestion category; currently only SURVEY." type: AddonSuggestionType! "Site ID from sites." siteId: Int! "Maximum suggestions to return; defaults to 3." limit: Int ): [AddonSuggestion]! """ Returns total, draft, active, and inactive counts for accessible add-ons, optionally scoped to a site and type. Use addonList for the records; absent counts resolve to zero. Requires survey view access or CTA view access. """ addonStatusCounts( "Site ID from sites; omit to include accessible sites." site: Int "Optional type filter; omitted types are narrowed to those the caller may view." type: AddonType ): AddonStatusCountsResult! """ Returns AI referral session and page-view counts for exactly one site or imported Google Analytics property, recognizing ChatGPT, Claude, Gemini, Perplexity, Microsoft Copilot, and Grok by host or subdomain. Defaults to the previous 30 complete UTC dates and accepts 1 to 60 inclusive dates within available history. Sources without sessions are omitted; the rest sort by sessions descending, then name. Use `analytics` for all referrers. Requires web analytics view access and access to the source. """ analyticsAiReferrals( "Site ID from `sites`; supply exactly one of `siteId` and `googleAnalyticsPropertyId`." siteId: Int "Imported property ID from `gaProperties`; mutually exclusive with `siteId`." googleAnalyticsPropertyId: Int "Inclusive YYYY-MM-DD date; default 30 days before today in UTC. Window must span 1 to 60 dates." startDate: String """ Inclusive YYYY-MM-DD date; default yesterday in UTC. Site data uses UTC dates; GA uses imported report dates. """ endDate: String ): AnalyticsAiReferrals """ Returns aggregate metrics and ranked dimensions for a site or imported Google Analytics property. Use `analyticsDimension` for one dimension or `analyticsOverTime` for its series. Supply a preset or window within available history; ranking defaults to descending page views for pages and visitors otherwise, with per-dimension cursors. Missing metrics resolve to null. Requires web analytics view access. """ analytics( "Site ID from `sites` for SITE, or property ID from `gaProperties` for GA_PROPERTY." sourceId: Int! "SITE selects Crazy Egg data; GA_PROPERTY selects imported Google Analytics data." sourceType: AnalyticsSource! """ Optional case-insensitive substring filter on every dimension's raw values (page domain plus path, referrer domain, country or language code); aggregate totals ignore it. """ searchTerm: String """ Unix seconds for the window start. Supply with `endAt` when no preset is given; site dates use UTC and GA dates use the property's time zone. """ startAt: Int """ Unix seconds. SITE aggregates exclude this instant; dimension rows include its UTC date. GA includes this local date. Supply with `startAt` unless `presetDate` is used. """ endAt: Int """ Case-insensitive preset that overrides `startAt`/`endAt`: `today`, `yesterday`, `recent` (today plus six prior days), `last 7 days`, `last 30 days` (both end yesterday), `this month`, or `last month`; others error. """ presetDate: String """ Defaults to PAGE_VIEWS for pages and VISITORS otherwise. Pages accept NAME, PAGE_VIEWS, or AVG_TIME_ON_PAGE; other columns fall back to PAGE_VIEWS. """ orderBy: OrderColumn "Ranking direction, default DESC. Metric ties use ascending names, with domain and path ordering for pages." orderDir: OrderDir "Per-dimension boundaries from `analytics.nextCursor`; omit for the first request." cursor: AnalyticsCursorArg """ Top time-series count, default 5, with remaining values grouped as `others`. Used by `analyticsOverTime`; ranked-row queries do not use it. """ numSegments: Int "Bucket size, default DAY. Site dates use UTC; GA dates use the property's time zone." granularity: TimeUnit ): Analytics """ Returns one ranked dimension under `dimension`; use `analytics` for multiple dimensions. Supply a preset or window within available history. Defaults to descending page views for pages and visitors otherwise; reuse `nextCursor` to continue, and a null cursor means no rows were returned. Requires web analytics view access. """ analyticsDimension( "Breakdown to return; page and entry-page series always measure page views." dimension: AnalyticsDimension! "Site ID from `sites` for SITE, or property ID from `gaProperties` for GA_PROPERTY." sourceId: Int! "SITE selects Crazy Egg data; GA_PROPERTY selects imported Google Analytics data." sourceType: AnalyticsSource! """ Optional case-insensitive substring filter. Countries and languages match display names and referrers match name or domain after the row limit; other dimensions match raw values before it. """ searchTerm: String """ Unix seconds for the window start. Supply with `endAt` when no preset is given; site dates use UTC and GA dates use the property's time zone. """ startAt: Int """ Unix seconds; rows include this calendar date, in UTC for SITE or the property's time zone for GA. Supply with `startAt` unless `presetDate` is used. """ endAt: Int """ Case-insensitive preset that overrides `startAt`/`endAt`: `today`, `yesterday`, `recent` (today plus six prior days), `last 7 days`, `last 30 days` (both end yesterday), `this month`, or `last month`; others error. """ presetDate: String "Maximum fetched rows, default 250. Use a nonnegative count, or -1 for no row limit." limit: Int """ Defaults to PAGE_VIEWS for pages and VISITORS otherwise. Pages accept NAME, PAGE_VIEWS, or AVG_TIME_ON_PAGE; other columns fall back to PAGE_VIEWS. """ orderBy: OrderColumn "Ranking direction, default DESC. Metric ties use ascending names, with domain and path ordering for pages." orderDir: OrderDir """ Boundary from `analyticsDimension.nextCursor`; omit initially. Only pages, entry pages, referrers, and UTM dimensions paginate; other dimensions ignore cursors. """ cursor: AnalyticsCursorDataArg """ Top time-series count, default 5, with remaining values grouped as `others`. Used by `analyticsOverTime`; ranked-row queries do not use it. """ numSegments: Int ): AnalyticsSingle """ Returns the top dimension count series and an `others` group for a preset or window within available history. Use `analyticsDimension` for ranked rows; sibling aggregate fields are null. Page and entry-page series always measure page views; optional goal conversions apply only to site sources. Requires web analytics view access. """ analyticsOverTime( "Breakdown to return; page and entry-page series always measure page views." dimension: AnalyticsDimension! "Count for non-page series; page and entry-page series always use PAGE_VIEWS." metric: AnalyticsMetric! "Site ID from `sites` for SITE, or property ID from `gaProperties` for GA_PROPERTY." sourceId: Int! "SITE selects Crazy Egg data; GA_PROPERTY selects imported Google Analytics data." sourceType: AnalyticsSource! """ Unix seconds for the window start. Supply with `endAt` when no preset is given; site dates use UTC and GA dates use the property's time zone. """ startAt: Int """ Unix seconds; dimension series include this calendar date in the source time zone. Optional conversions count events before this instant plus one day. """ endAt: Int """ Case-insensitive preset that overrides `startAt`/`endAt`: `today`, `yesterday`, `recent` (today plus six prior days), `last 7 days`, `last 30 days` (both end yesterday), `this month`, or `last month`; others error. """ presetDate: String """ Top time-series count, default 5, with remaining values grouped as `others`. Used by `analyticsOverTime`; ranked-row queries do not use it. """ numSegments: Int "Bucket size, default DAY. Site dates use UTC; GA dates use the property's time zone." granularity: TimeUnit "Optional goal ID from `goalRefList` for this site's conversions; used only for SITE sources." goalId: Int ): Analytics """ Returns goal conversion event counts in chronological buckets for a site and preset or window within available history. Use `analyticsOverTime` to combine a dimension series with conversions. Presets use UTC and conversion counts read site goals even though `sourceType` is required. Requires web analytics view access. """ analyticsConversionsOverTime( "Goal ID from `goalRefList` belonging to the site in `sourceId`." goalId: Int! "Site ID from `sites`; conversions read goals for this site." sourceId: Int! "Required selector; conversion counts still read site goal events for `sourceId`." sourceType: AnalyticsSource! "Unix seconds for the window start; supply with `endAt` when no preset is given." startAt: Int """ Unix seconds; counts events before this instant plus one day. Supply with `startAt` unless `presetDate` is used. """ endAt: Int """ Case-insensitive preset that overrides `startAt`/`endAt`: `today`, `yesterday`, `recent` (today plus six prior days), `last 7 days`, `last 30 days` (both end yesterday), `this month`, or `last month`; others error. """ presetDate: String "Conversion bucket size, default DAY; presets and buckets use UTC." granularity: TimeUnit ): [ConversionDay!]! """ Returns the first stored announcement only if it is enabled; null means that record is disabled or no record exists. Reads the saved message per request without a locale filter. Use this for the current system message and `changelog` for release history. No logged-in session is required. """ announcement: AnnouncementDetails """ Returns the account's audit log entries between `startAt` and `endAt`, newest first by default; actions done by Crazy Egg admins appear only to admin callers. Page with `nextPageCursor`: `hasNextPage` is true for any non-empty page, so stop at an empty page. `BILLING_CHANGE`, `SNAPSHOTS_VIEWED`, and `INSTALL` also return matching app page visits as `InternalUrlVisited` entries. Requires audit log view access. """ auditableActionList( "Time bounds, action types, acting users, and page controls for this audit feed." filter: AuditableActionListFilter! "Opaque `nextPageCursor` from `auditableActionList`; omit for the first page." cursor: String ): AuditableActionListResults """ Returns stored billing history, including a synthetic account-creation row, without contacting the payment provider. Defaults to creation time ascending; the cursor excludes IDs already returned, and a full page may still be the last page. Use `paymentTransaction` for one history ID. Requires billing navigation access. """ paymentTransactionList( """ Opaque `nextPageCursor` from `paymentTransactionList`; omit for the first page. It excludes every ID already returned. """ cursor: String "Page size from 1 to 200; defaults to 50." limit: Int """ Billing history ordering; defaults to `CREATED_AT` ascending. Keep the same order across cursor requests. """ order: PaymentTransactionListOrder ): PaymentTransactionListMeta """ Returns one stored billing-history entry for the active account without contacting the payment provider. Use an ID from `paymentTransactionList`; a missing entry returns an error rather than null. Requires billing navigation access. """ paymentTransaction( """ Billing-history entry ID from `paymentTransactionList`; the synthetic account-creation ID 0 has no detail record. """ id: Int! ): PaymentTransaction! """ Returns account-specific plans, interval prices, and available billing intervals for the legacy plan picker. Use `pricingExperience` to select the appropriate pricing presentation and `tieredPricingPlans` for tier price IDs. Requires authentication. """ pricingGrid: PricingGridResult! """ Returns the pricing presentation selected from the active account plan and payment provider. `ANALYTICS_GROWTH` includes plan cards and comparison data; `LEGACY` returns empty lists, so use `pricingGrid`. Requires authentication. """ pricingExperience: PricingExperienceResult! """ Previews a plan change through Stripe without applying it. A trial change can end the trial and charge immediately; lower-price changes or delayed renewals can defer billing. When `requiresCheckout` is true, amounts are null; otherwise pass the returned `prorationDate` to `updateSubscriptionItems` when present. Requires authentication. """ previewSubscriptionUpdate( """ Stripe price ID from `pricingGrid` or a tier `stripeId` from `tieredPricingPlans`; not the numeric payment plan ID. """ planPriceId: String! ): SubscriptionUpdatePreview! """ Retrieves the active billing account default card summary from Stripe. Null means no default card or the referenced customer or card no longer exists. Use `setDefaultPaymentMethod` to replace it. Requires authentication. """ defaultPaymentMethod: DefaultPaymentMethod """ Returns active tiered plan catalogs with monthly and yearly tiers and companion price IDs, optionally filtered by pricing variant. Plans sort by product name; use a tier price ID for checkout or plan changes and `pricingGrid` for the legacy plan picker. Requires authentication. """ tieredPricingPlans( """ Optional pricing variant such as `a` or `b`; trims whitespace and ignores case. Omit for all variants; plans without a variant remain included. """ abTest: String ): [TieredPricingPlan!]! """ Returns up to three positive all-time usage totals for the account in cancellation display priority order, without site filtering. Use this for the cancellation summary; it does not change the subscription or contact the payment provider. Requires billing edit access. """ cancellationMetrics: [CancellationMetric!]! """ Returns the current brand guidelines revision, or null before the first revision. Prefer `siteAsset` with BRAND_GUIDELINES for new clients. Requires a logged-in session and site access. """ brandGuideline("Site ID from `sites`." siteId: Int!): BrandGuideline @deprecated(reason: "Use siteAsset with type BRAND_GUIDELINES") """ Returns brand guidelines revisions newest first, before the exclusive revision boundary when supplied. Prefer `siteAssetRevisions` with BRAND_GUIDELINES for new clients. Requires a logged-in session and site access. """ brandGuidelineRevisions( "Site ID from `sites`." siteId: Int! """ Return revisions strictly below this positive revision from `brandGuidelineRevisions`; omit for the newest revisions. """ beforeRevision: Int "Maximum revisions, default 20; values are clamped to 1-100." limit: Int ): [BrandGuideline!]! @deprecated(reason: "Use siteAssetRevisions with type BRAND_GUIDELINES") """ Returns the latest revision of each stored asset type for a site, ordered by type. Use `siteAsset` for one type or `siteAssetRevisions` for history. Returns an error when site assets are not enabled for the account. Requires a logged-in session and site access. """ siteAssets("Site ID from `sites`." siteId: Int!): [SiteAsset!] """ Returns the latest revision of one site asset, or null when none exists. Use `siteAssets` for all types and `siteAssetRevisions` for history. Returns an error when site assets are not enabled for the account. Requires a logged-in session and site access. """ siteAsset( "Site ID from `sites`." siteId: Int! "Asset type to read." type: SiteAssetType! ): SiteAsset """ Returns asset revisions newest first, with an exclusive `beforeRevision` boundary and a bounded limit. Use `siteAsset` for only the current revision. Returns an error when site assets are not enabled for the account. Requires a logged-in session and site access. """ siteAssetRevisions( "Site ID from `sites`." siteId: Int! "Asset type whose revision history to read." type: SiteAssetType! """ Return revisions strictly below this positive revision from `siteAssetRevisions`; omit for the newest revisions. """ beforeRevision: Int "Maximum revisions, default 20; values are clamped to 1-100." limit: Int ): [SiteAsset!] """ Returns, for each requested product area, which actions the caller may take and any quota limits and usage; areas not in the selection are not computed. Check an action's `allowed` and `reason` before calling the operation it gates. Shared-link sessions get the resource owner's capabilities with every action except `nav`, `view`, `csv`, `json`, and `summarize` denied. Requires a signed-in or shared-link session. """ capabilities: Capabilities """ Returns the current account's subscription state, end date, billing interval, and plan details; `plan` is null for temporary subscriptions. Use `capabilities` for per-action permission decisions. Requires a logged-in user. """ subscription: CapabilitySubscription """ Returns product release entries visible to the session's plan and script version, with per-guest seen state and reactions. Entries sort by publication time descending; `newOnly` defaults to the last 12 months and does not mean unseen. Reads stored entries per request without a locale filter. Use `viewChangelogEvents` to mark entries seen. Requires a logged-in session. """ changelog( """ Defaults to true, returning entries published in the last 12 months; false returns all visible entries. Seen state never filters results. """ newOnly: Boolean ): [ChangelogEvent!]! """ Returns every notification channel (email address, API URL, Slack channel, or Zapier) set up for one site, optionally filtered by type, sorted by destination ascending by default and without pagination. Pass a channel's `id` as `channelId` to `notificationCreate` or `notificationEdit`. Requires notifications navigation access. """ channelsList( "Site id from `sites`." siteId: Int! "Optional delivery channel type filter; omit to include every type." type: ChannelType "Sort descriptor; defaults to destination ascending." order: ChannelListOrder ): [Channel!]! """ Returns CTA view, click, and conversion event counts with an ascending, zero-filled daily series across inclusive UTC calendar dates. The ID must identify a CTA and startAt must be less than endAt. Use addonDetail for lifetime counters. Requires CTA view access; shared sessions are allowed. """ ctaResult( "CTA UUID from addonList with type CTA." id: ID! "Start time in Unix seconds, earlier than endAt; its UTC calendar date is included." startAt: Int! "End time in Unix seconds, later than startAt; its UTC calendar date is included." endAt: Int! ): CtaResults! """ Returns product summaries for an accessible site, comparing the supplied current and previous windows. Use `analytics` for web-analytics dimensions and series; this response combines counts from several product areas. Time boundaries vary by section, and A/B visitor and conversion totals cover the account. Requires home view access. """ dashboard( "Site ID from `sites`; the caller must have access to this site." siteId: Int! "Unix seconds for the current-window start." startAt: Int! "Unix seconds for the current-window end; section-specific boundaries may be inclusive or exclusive." endAt: Int! "Unix seconds for the comparison-window start; not calculated automatically." previousStartAt: Int! "Unix seconds for the comparison-window end; not calculated automatically." previousEndAt: Int! ): Dashboard! """ Returns one error occurrence by its UUID, with linked recording details subject to retention. Use `uniqueError` for the fingerprint summary or `errorList` for its occurrences. Missing or inaccessible occurrences return an error. Requires errors view access. """ error( "Occurrence UUID from `errorList.errors.id`; not `fingerprintMd5` or a recording ID." id: String! "Site ID from `sites`; must contain the requested error or fingerprint." siteId: Int! ): Error """ Returns the latest occurrence details and current workflow status for one fingerprint MD5. Use `error` for an occurrence UUID or `uniqueErrorStats` for windowed counts. Missing or inaccessible fingerprints return an error. Requires errors view access. """ uniqueError( "Fingerprint MD5 from `uniqueErrorList` or `errorList`; identifies a group, not an occurrence UUID." fingerprintMd5: String! "Site ID from `sites`; must contain the requested error or fingerprint." siteId: Int! ): UniqueError """ Returns counts and affected-user, page, and browser metrics for one fingerprint and required window. Use `uniqueError` for workflow status. An existing fingerprint with no matching occurrences returns zero counts; a missing fingerprint returns an error. Requires errors view access. """ uniqueErrorStats( "Fingerprint MD5 from `uniqueErrorList` or `errorList`; identifies a group, not an occurrence UUID." fingerprintMd5: String! "Site ID from `sites`; must contain the requested error or fingerprint." siteId: Int! "Window start in Unix seconds, inclusive." startAt: Int! "Window end in Unix seconds, inclusive." endAt: Int! ): UniqueErrorStats """ Returns an occurrence count for one fingerprint and required window, without fetching records. Use `errorList` for page-number pagination; its optional search is not applied here. Requires errors view access. """ errorListTotal( "Site ID from `sites`; must contain the requested error or fingerprint." siteId: Int! "Fingerprint MD5 from `uniqueErrorList` or `errorList`; identifies a group, not an occurrence UUID." fingerprintMd5: String! "Window start in Unix seconds, inclusive." startAt: Int! "Window end in Unix seconds, inclusive." endAt: Int! ): Int! """ Returns occurrences for one fingerprint and required window, with recording permissions. Pagination starts at page 1 and follows `order`, defaulting to newest creation time. Use `uniqueErrorList` for grouped fingerprints; an empty page returns an empty list. Requires errors view access. """ errorList( "Site ID from `sites`; must contain the requested error or fingerprint." siteId: Int! "Fingerprint MD5 from `uniqueErrorList` or `errorList`; identifies a group, not an occurrence UUID." fingerprintMd5: String! "Occurrence sort; its fields default to `CREATED_AT` and `DESC`." order: ErrorsOrder! "Occurrences per page; must be at least 1." limit: Int! "One-based page number, at least 1." page: Int! "Window start in Unix seconds, inclusive." startAt: Int! "Window end in Unix seconds, inclusive." endAt: Int! """ Optional case-insensitive substring filter on fingerprint text, URL, or error name; `*` matches any characters. """ search: String ): ErrorListResults """ Returns fingerprint groups in one workflow status for a required window, including counts and visitor ratios. Use `errorList` for individual occurrences. Reuse `nextPageCursor` to exclude seen fingerprints; `order` defaults to latest seen first and `hasNextPage` means the page filled its limit. Requires errors view access. """ uniqueErrorList( "Site ID from `sites`; must contain the requested error or fingerprint." siteId: Int! "Fingerprint sort; its fields default to `LAST_SEEN` and `DESC`." order: UniqueErrorsOrder! "Fingerprint groups per page, from 1 to 200." limit: Int! "Window start in Unix seconds, inclusive." startAt: Int! "Window end in Unix seconds, inclusive." endAt: Int! "Workflow status bucket to include: `UNRESOLVED`, `RESOLVED`, or `MUTED`." status: ErrorStatusEnum! "Opaque `nextPageCursor` from `uniqueErrorList`; omit for the first page and keep all filters unchanged." cursor: String """ Optional case-insensitive substring filter on fingerprint text, URL, or error name; `*` matches any characters. """ search: String ): UniqueErrorListResults """ Returns aggregate counts and affected-user, page, and browser metrics for a status, required window, and optional search. Use `uniqueErrorStats` for one fingerprint or `uniqueErrorList` for rows. Empty aggregates become zero. Requires errors view access. """ uniqueErrorListStats( "Site ID from `sites`; must contain the requested error or fingerprint." siteId: Int! "Window start in Unix seconds, inclusive." startAt: Int! "Window end in Unix seconds, inclusive." endAt: Int! "Workflow status bucket to include: `UNRESOLVED`, `RESOLVED`, or `MUTED`." status: ErrorStatusEnum! """ Optional case-insensitive substring filter on fingerprint text, URL, or error name; `*` matches any characters. """ search: String ): UniqueErrorListStatsResults """ Returns fingerprint notes newest first, followed by a synthetic initial UNRESOLVED entry with a null ID. Use `uniqueError` for current status. Missing first-occurrence data returns an error instead of an empty history. Requires errors view access. """ uniqueErrorNotes( "Fingerprint MD5 from `uniqueErrorList` or `errorList`; identifies a group, not an occurrence UUID." fingerprintMd5: String! "Site ID from `sites`; must contain the requested error or fingerprint." siteId: Int! ): [UniqueErrorNote!]! """ Returns the account's folders for one site and type, restricted to accessible sites and sorted case-insensitively by title. This list is unpaginated; use `folder` for one snapshots folder. Requires snapshots view access. """ folders( "Site and folder type to list; returns all matching accessible folders without pagination." filter: FolderListFilter! ): FolderList """ Returns one snapshots folder belonging to the current account on an accessible site. Use `folders` to discover ids; other folder types are not returned by this lookup. Requires snapshots view access. """ folder( "Snapshots folder `id` from `folders`; the folder must belong to the current account on an accessible site." id: Int! ): Folder """ Returns accessible saved funnel definitions, optionally limited to a site; use `funnelResult` to calculate metrics. Defaults to newest creation time, with cursor pagination that excludes previously seen IDs; unscoped lists omit deleted sites. `hasNextPage` means the page filled its limit. Requires funnels view access. """ funnelList( "Opaque `nextPageCursor` from `funnelList`; omit for the first page and keep filters and order unchanged." cursor: String "Funnel definitions per page, from 1 to 200; defaults to 25." limit: Int "Site ID from `sites`; omit to list all accessible funnels on non-deleted sites." siteId: Int "Optional funnel-name or goal-name substring search; `*` matches any characters." search: String "Defaults to CREATED_AT descending; use NAME for alphabetical ranking." order: FunnelListOrder ): FunnelListMeta! """ Returns one accessible saved funnel definition; use `funnelResult` with its steps to calculate metrics. Shared sessions can read only their own funnel. Missing or inaccessible funnels return an error. Requires funnels view access. """ funnelDetail("Saved funnel ID from `funnelList` or `funnelCreate`; not a goal ID." id: Int!): Funnel """ Returns saved funnels on a site that reference any supplied goal, ordered by newest creation time by default. Use `funnelList` for a paginated search; this operation returns all matches without a cursor. Requires goals view access. """ funnelsUsingGoals( "Site ID from `sites` containing the goals and funnels." siteId: Int! "Goal IDs from `goalRefList`; matches funnels referencing any supplied ID." goalIds: [Int!]! "Defaults to CREATED_AT descending; use NAME for alphabetical ranking." order: FunnelListOrder ): [Funnel!]! """ Calculates ordered goal-conversion counts, step values, and next-step rates for a site and required window. Use `funnelDetail` for saved definitions; this operation accepts steps directly and saves nothing. Goals must be accessible and belong to the site; an optional leading visit step uses site-wide visitor/session counts. Buckets sort chronologically and rates are percentages; drop-off is 100 minus the rate. Requires funnels view access. """ funnelResult( "Site ID from `sites`; every goal step must belong to this site." siteId: Int! "Inclusive conversion-window start in Unix seconds, interpreted in UTC." startAt: Int! "Inclusive conversion-window end in Unix seconds, interpreted in UTC." endAt: Int! "Bucket size for `timeUnitResults`: `DAY`, `WEEK` (starting Monday), or `MONTH`." timeUnit: TimeUnit! """ Ordered steps: an optional leading `VISIT` step without `id`, followed by `GOAL` steps with IDs from `goalRefList`. URL matching comes from each goal's triggers, not from this input. """ steps: [FunnelStep!]! ): FunnelQueryResult! """ Returns account-level Google Analytics properties ordered by name, with stored import status. Use the returned IDs with `setEnabledGaProperties` to select imports. Shared sessions and sessions restricted to particular sites receive an empty list. Requires a logged-in session; shared sessions are allowed. """ gaProperties: [GaProperty] """ Returns a cursor page of non-deleted goals with conversion counts for the last seven UTC days, including today. Use `goalCardList` when recent conversions are not needed. Pages default to id descending; pass `nextPageCursor` back as `cursor` while `hasNextPage` is true. Sorting by `CONVERSIONS` or `AB_TESTS` returns all remaining goals in one page and ignores `limit`. Requires goal view access. """ goalListSummary( "Site id from the `sites` query; omit to list goals from all account sites." site: Int "Keeps goals whose name contains this text; `*` matches any characters. Blank means no filter." search: String "`nextPageCursor` from the previous page of this query; omit for page one." cursor: String "Page size from 1 to 200; defaults to 50, and -1 returns every remaining goal." limit: Int "Sort field and direction; defaults to `ID` descending." order: GoalListOrder ): GoalSummaryListMeta! """ Returns every non-deleted goal as a lightweight reference, ordered by name, without pagination. Use it to pick a goal id; use `goalSelectorList` to also get trigger filters, or `goalRef` for one known id. Requires goal view access. """ goalRefList("Site id from the `sites` query; omit to list goals from all account sites." site: Int): [GoalRef!]! """ Returns every matching non-deleted goal with its trigger filters, ordered by name, without pagination. Use `goalRefList` when filters are not needed or `goalCardList` for paging and A/B test counts. Trigger lists include soft-deleted triggers. Requires goal view access. """ goalSelectorList( "Site id from the `sites` query; omit to list goals from all account sites." site: Int "Keeps goals whose name contains this text; `*` matches any characters. Blank means no filter." search: String ): [GoalLinked!]! """ Returns a cursor page of non-deleted goals with full trigger settings and A/B test counts, newest id first. Use `goalListSummary` for recent conversion counts; pass `nextPageCursor` back as `cursor` while `hasNextPage` is true. Requires goal view access. """ goalCardList( "Site id from the `sites` query; omit to list goals from all account sites." site: Int "Keeps goals whose name contains this text; `*` matches any characters. Blank means no filter." search: String "`nextPageCursor` from the previous page of this query; omit for page one." cursor: String "Page size from 1 to 200; defaults to 50, and -1 returns every remaining goal." limit: Int ): GoalCardListMeta! """ Returns one goal with its trigger filters, including soft-deleted goals so stored links still resolve. Use `goalRef` when filters are not needed or `goalDetail` for value settings and A/B test counts. An unknown or inaccessible id returns `Goal not found`. Requires goal view access. """ goalLinked( "Goal id from `goalRefList`, `goalCardList`, or a stored reference; deleted goals are accepted." id: Int! ): GoalLinked! """ Returns one lightweight goal reference, including soft-deleted goals. Use `goalLinked` for trigger filters or `goalsByIds` for several ids. An unknown or inaccessible id returns `Goal not found`. Requires goal view access. """ goalRef( "Goal id from `goalRefList`, `goalCardList`, or a stored reference; deleted goals are accepted." id: Int! ): GoalRef! """ Returns lightweight references for several goals, including soft-deleted ones, in the order the ids were given. Use it instead of repeated `goalRef` calls. Duplicate ids appear once, and unknown or inaccessible ids are left out without an error. Requires goal view access. """ goalsByIds( "Goal ids from `goalRefList`, `goalCardList`, or stored references; deleted goals are accepted." ids: [Int!]! ): [GoalRef!]! """ Returns one non-deleted goal with full trigger filters, value settings, and A/B test counts; read it before `goalEdit` to get the current triggers. Use `goalRef` or `goalLinked` for soft-deleted goals and `goalCounts` for conversion metrics. An unknown, inaccessible, or deleted id returns `Goal not found`. Requires goal view access. """ goalDetail( "Goal id from `goalRefList` or `goalCardList`." id: Int! "Ignored by this query; use `goalCounts` for date-filtered metrics." startDate: Int "Ignored by this query; use `goalCounts` for date-filtered metrics." endDate: Int "Ignored by this query, although an unrecognized preset returns an error." presetDate: String ): Goal! """ Returns conversion totals, unique converting visitors, and value for one non-deleted goal, with a row per active trigger plus id -1 for conversions from deleted or unrecognized triggers. Use `goalDistribution` for a time series. The range defaults to the goal's creation day through today in UTC, and values are converted to the site's display currency. Requires goal view access. """ goalCounts( "Goal id from `goalRefList` or `goalCardList`." id: Int! """ Unix seconds; defaults to the goal's creation time. Earlier times are raised to creation time, and the range starts at the beginning of that UTC day. """ startDate: Int """ Unix seconds; defaults to now. Times before creation are raised to creation time, and the range ends at the end of that UTC day. """ endDate: Int ): GoalCounts! """ Returns conversion buckets by day, week, or month for one non-deleted goal, oldest first, each with a row per active trigger plus id -1. Use `goalCounts` for one total. Every bucket in the range is returned, with zeros when empty; the first bucket starts at the range start and the last ends at the range end. Values use the site's display currency. Requires goal view access. """ goalDistribution( "Goal id from `goalRefList` or `goalCardList`." id: Int! """ Unix seconds; defaults to the goal's creation time. Earlier times are raised to creation time, and the range starts at the beginning of that UTC day. """ startDate: Int """ Unix seconds; defaults to now. Times before creation are raised to creation time, and the range ends at the end of that UTC day. """ endDate: Int "Bucket size: `DAY`, `WEEK`, or `MONTH`; after the first bucket, weeks start on Monday and months on the 1st." timeUnit: TimeUnit! ): [GoalDistribution!]! """ Returns a numbered page of conversion metrics grouped by the page where each conversion happened, for one non-deleted goal. Use `goalConversionBreakdown` to group by referrer, country, device, or UTM values instead. Rows default to total conversions descending, then page URL ascending; values use the site's display currency. Requires goal view access. """ goalPageConversions( "Required despite being nullable: goal id from `goalRefList` or `goalCardList`." id: Int "Ignored; the goal's own site is used." siteId: Int """ Unix seconds; defaults to the goal's creation time. Earlier times are raised to creation time, and the range starts at the beginning of that UTC day. """ startDate: Int """ Unix seconds; defaults to now. Times before creation are raised to creation time, and the range ends at the end of that UTC day. """ endDate: Int "Keeps pages whose URL contains this text, case-insensitively; trimmed. Empty keeps all pages." search: String "Page number starting at 1; defaults to 1." page: Int "Rows per page; defaults to 25. Must be at least 1; there is no maximum." perPage: Int """ Omit for `TOTAL_CONVERSIONS` descending. A supplied object defaults to `TOTAL_CONVERSIONS` and `ASC`, so set `sort` explicitly. """ order: GoalPageConversionsOrder ): GoalPageList """ Returns a numbered page of conversion metrics grouped by one visitor or traffic dimension for one non-deleted goal. Use `goalPageConversions` to group by conversion page with URL search. Rows default to total conversions descending, then dimension value ascending; missing values are grouped as `(not set)`, and values use the site's display currency. Requires goal view access. """ goalConversionBreakdown( "Required despite being nullable: goal id from `goalRefList` or `goalCardList`." id: Int "Ignored; the goal's own site is used." siteId: Int """ Unix seconds; defaults to the goal's creation time. Earlier times are raised to creation time, and the range starts at the beginning of that UTC day. """ startDate: Int """ Unix seconds; defaults to now. Times before creation are raised to creation time, and the range ends at the end of that UTC day. """ endDate: Int "Attribute to group conversions by." dimension: GoalConversionDimension! "Page number starting at 1; defaults to 1." page: Int "Rows per page; defaults to 25. Must be at least 1; there is no maximum." perPage: Int """ Omit for `TOTAL_CONVERSIONS` descending. A supplied object defaults to `TOTAL_CONVERSIONS` and `ASC`, so set `sort` explicitly. """ order: GoalConversionBreakdownOrder ): GoalConversionBreakdownList """ Returns the account's images with the given `source`, optionally for one site, in no guaranteed order. Use `imageDetail` for one ID. Bound the list with `filter.limit`; passing `cursor` currently fails, and `hasNextPage` is true only when exactly 50 images are returned. Requires a logged-in session. """ imageList( "Site ID from `sites`; omit to include every accessible site." siteId: Int "Opaque `nextPageCursor` from `imageList`; requests that pass a cursor currently fail, so omit it." cursor: String """ Page-size options; supply `{limit: 10}` to bound results. Omitting this object leaves the list unbounded. """ filter: ImageFilter "Exact stored source label to include, for example `surveys`; defaults to `surveys`." source: String ): ImageListMeta! """ Returns one image visible to the current account, or an error if it is absent or inaccessible. Use `imageList` to discover IDs; `siteId` is accepted but ignored. Requires a logged-in session. """ imageDetail( "Image UUID from `imageList`, `imageUpload` or `imageUploadUrls`." id: ID! "Ignored; the image is looked up by `id` within the current account." siteId: Int ): Image! """ Returns the account's notification rules for goal conversions, survey responses, and site errors, newest first by default, skipping deleted rules and sites the caller cannot access. Page by passing `nextPageCursor` back as `cursor`; `hasNextPage` only means this page was full. Requires notifications navigation access. """ notificationsList( "Opaque `nextPageCursor` from `notificationsList`; omit for the first page." cursor: String "Page size from 1 to 200; defaults to 25." limit: Int "Site id from `sites`; omit to include all sites visible to the caller." siteId: Int "Only return rules for this resource type; combine with `resourceId` to target one resource." resource: NotificationResource "Resource id as a string: goal id from `goalCardList`, survey id from `addonList`, or site id from `sites`." resourceId: String "Sort descriptor; defaults to creation time descending." order: NotificationsListOrder """ Substring match on goal or survey name, `Errors on `, resource type, channel type, or destination; `*` matches any characters. """ search: String "Optional delivery channel type filter." type: ChannelType ): NotificationsListMeta """ Returns upload POST targets valid for 10 minutes for user-captured page screenshots and element data. An editable `snapshotId` takes precedence and returns `elements`; otherwise supply an HTTP(S) `sourceUrl` and lowercase device to obtain `fingerprints`. Use `pageCameraSetScreenshotStatus` after uploading an existing capture. Requires snapshot edit access. """ pageCameraGetUploadPolicy( """ Editable snapshot ID from `pageCameraSnapshots` or `snapshotsList`; when present, takes precedence over `sourceUrl` and `device`. """ snapshotId: Int "Absolute HTTP or HTTPS page URL; required with `device` when `snapshotId` is omitted." sourceUrl: String "Lowercase `desktop`, `phone` or `tablet`; required with `sourceUrl` when `snapshotId` is omitted." device: String ): GetUploadPolicyMeta! """ Returns session and quota state for the page camera capture client; an unauthenticated call fails rather than returning `loggedIn: false`. Use before selecting a capture flow, and use `checkSnapshotsQuota` for a numeric overage estimate. Requires a logged-in session. """ pageCameraIsLoggedIn: LoggedInResult! """ Returns accessible manual snapshots that use user-uploaded screenshots and element data; read-only sessions get an empty list. The list is unpaginated with no guaranteed order; use `snapshotsList` to browse both automatic and manual snapshots. Requires snapshot view access. """ pageCameraSnapshots: [Snapshot!]! """ Writes a page camera diagnostic message with the current user agent and user ID, returning null on success. Use for capture diagnostics; it does not return snapshot data. Requires snapshot create access. """ pageCameraDebug("Diagnostic text written to server logs; the successful response is null." message: String!): String """ Returns whether a user belongs to an owner's account and whether they can create sites or edit the site named by `domain`. When the user is not in the owner's account only `accountExists: false` is set. Requires page editor navigation access. """ pageEditorListPermissions( "Registrable site domain, such as `example.com`." domain: String! "Owner id from `me.userId`; defaults to the current account id when omitted." ownerId: Int "User id from `teamMembers`; defaults to the acting user when omitted." userId: Int ): PageEditorListPermissionsMeta! """ Reports whether the Crazy Egg script is installed for the site of a page editor page. Returns `installed: true` when the site is already marked installed; otherwise runs a live script check of the page URL for `device`. Requires page editor navigation access. """ pageEditorCheckScript( "Page UUID from `pageEditorCreatePage` or `pageEditorGetEditor`." pageId: String! "Device for the live script check when installation is not already known." device: SnapshotDevice! ): PageEditorScriptCheckResponse """ Returns the UUID of the current account's editor with the most recently published version, or of the most recently opened editor when none has published versions. Returns null when the account has no editors; load the editor with `pageEditorGetEditor`. Requires page editor navigation access. """ pageEditorLatest: String """ Returns an editor with its pages and saved versions, or null when the editor does not exist. Updates the editor's last-opened time and assigns an unowned editor to the current account when the caller is signed in. Requires a page editor token or a logged-in user. """ pageEditorGetEditor( "Editor UUID from `pageEditorCreatePage` or `pageEditorLatest`." editorId: String! ): PageEditorResponse """ Returns the requested capabilities of the account that owns an editor rather than the caller's. Returns null when the editor does not exist or has no owner yet; use `capabilities` for the caller's own account. Requires a page editor token for the editor, or a logged-in user who owns the editor or can edit the site of one of its pages. """ pageEditorCapabilities( "Editor UUID from `pageEditorCreatePage` or `pageEditorLatest`." editorId: String! ): Capabilities """ Returns an editor's brand guideline settings for one site as a JSON-encoded object with `checks`, `voices`, `voiceTestContent`, and `profile`. Built-in checks and voices replace saved entries with the same `id` and are added when missing, so a site with nothing saved still returns Crazy Egg defaults. Use `pageEditorSaveBrandGuidelines` to replace the settings. Requires a page editor token for the editor, or a logged-in user who owns the editor or can edit the site. """ pageEditorGetBrandGuidelines( "Editor UUID from `pageEditorCreatePage` or `pageEditorLatest`." editorId: String! "Site hostname such as `www.example.com`; settings are stored per registrable domain (`example.com`)." site: String! ): String """ Returns one non-deleted tracked page and its latest desktop and phone runs. Use `pageSpeedRuns` for capture history or `pageSpeedPages` for a site's pages. Missing or inaccessible pages return an error. Requires page speed view access. """ pageSpeedPage("Tracked page ID from `pageSpeedPages` or `pageSpeedPageCreate`; not a run ID." id: Int!): PageSpeedPage """ Returns all non-deleted tracked pages for an accessible site, ordered by latest scheduling time then ID descending, with unscheduled pages last. Includes each page's latest desktop and phone runs; use `pageSpeedRuns` for full history. There is no pagination. Requires page speed view access. """ pageSpeedPages("Site ID from `sites`; the caller must have access to the site." siteId: Int!): [PageSpeedPage!]! """ Returns discovered pages in importance order, excluding tracked non-deleted pages before limiting results. May request fresh page discovery when data is missing; the response includes status and retry timing for polling. Use `pageSpeedPages` for registered pages. Requires page speed edit access and an editable site. """ pageSpeedSuggestedPages( "Site ID from `sites`; the caller must be able to edit the site." siteId: Int! "Maximum suggestions, default 15; values are clamped to 1 through 50." limit: Int ): SiteMapPagesResult! """ Checks which supplied URLs already have a non-deleted tracked page for an editable site. Returns one row per input in input order; `pageId` is null when unmatched. Trims whitespace and adds a missing HTTP scheme before exact URL matching; this does not create pages. Requires page speed edit access. """ pageSpeedPageDuplicates( "Site ID from `sites`; the caller must be able to edit the site." siteId: Int! "From 1 to 25 page URLs; whitespace is trimmed and a missing HTTP scheme is added." urls: [String!]! ): [PageSpeedPageDuplicate!]! """ Returns all captured runs for one non-deleted tracked page, ordered by scheduled time then ID descending, with unscheduled runs last. Use `pageSpeedRunAnalysis` for interpreted metrics or `pageSpeedRunAudits` for audit details. Missing or inaccessible pages return an error. Requires page speed view access. """ pageSpeedRuns("Tracked page ID from `pageSpeedPages`; not a run ID." pageSpeedPageId: Int!): [PageSpeedRun!]! """ Returns interpreted metrics and actionable recommendations for an accessible run. Use `pageSpeedRunAudits` for passed, warning, failed, and errored audit rows. Missing raw results yield unscored metrics and empty recommendations; a missing run returns an error. Requires page speed view access. """ pageSpeedRunAnalysis( "Run ID from `pageSpeedRuns` or a page's `latestRuns`; not the tracked page ID." pageSpeedRunId: Int! ): PageSpeedRunAnalysis! """ Returns categorized audit rows for an accessible run, omitting manual and not-applicable audits and performance metric rows. Audits sort failed, error, warning, informative warning, then passed; detail lists are capped at five items. Use `pageSpeedRunAnalysis` for metrics and recommendations. A missing run returns an error. Requires page speed view access. """ pageSpeedRunAudits( "Run ID from `pageSpeedRuns` or a page's `latestRuns`; not the tracked page ID." pageSpeedRunId: Int! ): PageSpeedRunAudits! """ Returns recommended playlists together with the site's custom playlists, sorted case-insensitively by name, with each filter in the requested version. Custom playlists whose stored filter fails validation are omitted. Use `playlistsMostRecent` for the current user's usage order. Requires recordings view access. """ playlistsList( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! """ Filter version; 2 is the only supported version and is used when omitted, null, 0, or negative. Other values return an error. """ version: Int ): [Playlist!]! """ Returns the current viewer's recently used playlists for a site, ordered by last use descending. Backfills with unused recommended playlists when history is shorter than `limit`; use `playlistsList` for filters and the complete catalog. Requires recordings view access. """ playlistsMostRecent( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! """ Result limit from 1 to 100; omitted, null, or out-of-range values use 5. May return fewer when no more recommendations exist. """ limit: Int ): [PlaylistUsage!]! """ Returns shared country names and codes for form options. United States, United Kingdom, Australia, and Canada come first, followed by alphabetical names; the list is static and does not vary by account or locale. Requires a logged-in session. """ countries: [CountryOption!]! """ Returns supported currency codes and display names for money conditions. Use these values when constructing currency-based filters; this static list does not vary by account or locale. Requires a logged-in session. """ supportedCurrencyCodes: [CurrencyOption!]! """ Returns supported language codes and display names for language conditions. Use these codes for audience filters; this static list does not vary by account or locale. Requires a logged-in session. """ languages: [LanguageOption!]! """ Returns font families from the cached Google Fonts catalog, optionally filtered by a case-insensitive family-name substring. Results rank by popularity, then family name, with no cursor; this reads cached data without refreshing it. Requires a logged-in session. """ googleFonts( """ Case-insensitive font-family substring; defaults to empty text for all cached families. Whitespace is trimmed. """ search: String "Maximum returned font families, defaults to 50; must be at least 1 and is capped at 100." limit: Int ): [GoogleFont!]! """ Returns a cursor-paged recordings feed for one site with watch state and per-recording permissions. Use `order` for sorted matches, including watched or short recordings excluded by `recordingsDataForAi`. Cursors are opaque and accumulate previously seen ids. Requires recordings view access. """ recordingsList( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! """ JSON-encoded string. Envelope: `{"version":2,"operator":"AND","conditions":[...]}`, where `operator` is uppercase `AND` or `OR` and `conditions` is a non-empty list of nested groups or leaves. A leaf has `criteria`, `comparison` only when the criterion takes one, and `value` or `values` (plus `multiple_values` where required). Call `recordingsCriteriaDefinition` for the criteria catalog; the `recordings-filter` skill is the long-form reference. Example: {"version":2,"operator":"AND","conditions":[{"criteria":"date_range","value":{"special":"last 30 days"}}]} """ filters: String! "Opaque `nextPageCursor` from `recordingsList`; omit or pass null to start. Accumulates seen ids." cursor: String "Page size from 1 to 200; defaults to 50." limit: Int "Sort descriptor; pass `{}` for newest first. Recorded time breaks ties for other sort fields." order: RecordingsListOrder! ): RecordingsListMeta """ Returns cursor-paged groups keyed by normalized first or last page, ordered by recording count descending and then latest recording descending. Use `recordingsInGroup` for the recordings inside one group; `includeFirst` can prepend a matching group on the first request. Cursors are opaque and accumulate seen group ids. Requires recordings view access. """ recordingsGroups( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! "Group on normalized first page (`FIRST`) or last page (`LAST`); use the same choice for group lookup." groupBy: RecordingGroupBy! """ JSON-encoded string. Envelope: `{"version":2,"operator":"AND","conditions":[...]}`, where `operator` is uppercase `AND` or `OR` and `conditions` is a non-empty list of nested groups or leaves. A leaf has `criteria`, `comparison` only when the criterion takes one, and `value` or `values` (plus `multiple_values` where required). Call `recordingsCriteriaDefinition` for the criteria catalog; the `recordings-filter` skill is the long-form reference. Example: {"version":2,"operator":"AND","conditions":[{"criteria":"date_range","value":{"special":"last 30 days"}}]} """ filters: String! "Opaque `nextPageCursor` from `recordingsGroups`; omit or pass null to start. Accumulates seen ids." cursor: String "Page size from 1 to 200; defaults to 50." limit: Int """ Group id from `recordingsGroups` to prepend if it matches on the first request; counts toward `limit`. Ignored with a cursor. """ includeFirst: String ): RecordingsGroupsMeta """ Returns matching recording counts per UTC recording date, newest date first, for at most `limit` dates. To reach older dates, move the `date_range` condition in `filters`; use `recordingsCount` for one total and `recordingsGroups` for page groups. Requires recordings view access. """ recordingsDateGroups( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! """ JSON-encoded string. Envelope: `{"version":2,"operator":"AND","conditions":[...]}`, where `operator` is uppercase `AND` or `OR` and `conditions` is a non-empty list of nested groups or leaves. A leaf has `criteria`, `comparison` only when the criterion takes one, and `value` or `values` (plus `multiple_values` where required). Call `recordingsCriteriaDefinition` for the criteria catalog; the `recordings-filter` skill is the long-form reference. Example: {"version":2,"operator":"AND","conditions":[{"criteria":"date_range","value":{"special":"last 30 days"}}]} """ filters: String! "Opaque `nextPageCursor` from a previous `recordingsDateGroups` call; omit or pass null for the newest dates." cursor: String "Number of dates from 1 to 5; defaults to 3." limit: Int ): RecordingsDateGroupsMeta """ Returns one numbered page of recordings inside a normalized first- or last-page group, sorted by `order`. Unlike `recordingsList`, pagination uses `page` rather than a cursor. Requires recordings view access. """ recordingsInGroup( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! "Group on normalized first page (`FIRST`) or last page (`LAST`); use the same choice for group lookup." groupBy: RecordingGroupBy! "Group `id` from `recordingsGroups`; accepts `homepage`, a site-relative path, or a normalized domain/path." group: String! """ JSON-encoded string. Envelope: `{"version":2,"operator":"AND","conditions":[...]}`, where `operator` is uppercase `AND` or `OR` and `conditions` is a non-empty list of nested groups or leaves. A leaf has `criteria`, `comparison` only when the criterion takes one, and `value` or `values` (plus `multiple_values` where required). Call `recordingsCriteriaDefinition` for the criteria catalog; the `recordings-filter` skill is the long-form reference. Example: {"version":2,"operator":"AND","conditions":[{"criteria":"date_range","value":{"special":"last 30 days"}}]} """ filters: String! "Page number starting at 1; defaults to 1." page: Int "Page size from 1 to 200; defaults to 10." limit: Int "Sort descriptor; pass `{}` for newest first. Recorded time breaks ties for other sort fields." order: RecordingsListOrder! ): RecordingsInGroupMeta """ Returns numeric ids, viewer-specific watch state, and permissions for every matching recording in a page group. Use this unpaginated selection for bulk actions without fetching full recording objects; order is unspecified. Requires recordings view access. """ recordingsIdsInGroup( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! "Group on normalized first page (`FIRST`) or last page (`LAST`); use the same choice for group lookup." groupBy: RecordingGroupBy! "Group `id` from `recordingsGroups`; accepts `homepage`, a site-relative path, or a normalized domain/path." group: String! """ JSON-encoded string. Envelope: `{"version":2,"operator":"AND","conditions":[...]}`, where `operator` is uppercase `AND` or `OR` and `conditions` is a non-empty list of nested groups or leaves. A leaf has `criteria`, `comparison` only when the criterion takes one, and `value` or `values` (plus `multiple_values` where required). Call `recordingsCriteriaDefinition` for the criteria catalog; the `recordings-filter` skill is the long-form reference. Example: {"version":2,"operator":"AND","conditions":[{"criteria":"date_range","value":{"special":"last 30 days"}}]} """ filters: String! ): [RecordingIdInGroup!] """ Returns numeric recording ids and raw `sessionId` strings for one UTC recording date. Use this unpaginated selection for date-based bulk actions without fetching full recordings; order is unspecified. Requires recordings view access. """ recordingsIdsInDateGroup( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! "UTC recording date as YYYY-MM-DD, such as a `groups.id` from `recordingsDateGroups`." group: String! """ JSON-encoded string. Envelope: `{"version":2,"operator":"AND","conditions":[...]}`, where `operator` is uppercase `AND` or `OR` and `conditions` is a non-empty list of nested groups or leaves. A leaf has `criteria`, `comparison` only when the criterion takes one, and `value` or `values` (plus `multiple_values` where required). Call `recordingsCriteriaDefinition` for the criteria catalog; the `recordings-filter` skill is the long-form reference. Example: {"version":2,"operator":"AND","conditions":[{"criteria":"date_range","value":{"special":"last 30 days"}}]} """ filters: String! ): [RecordingIdInDateGroup!] """ Returns the total recordings matching a site and filter, or null on plans where recording totals are not computed. Use this for totals instead of counting a page or the capped `recordingsDataForAi` sample. Requires recordings view access. """ recordingsCount( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! """ JSON-encoded string. Envelope: `{"version":2,"operator":"AND","conditions":[...]}`, where `operator` is uppercase `AND` or `OR` and `conditions` is a non-empty list of nested groups or leaves. A leaf has `criteria`, `comparison` only when the criterion takes one, and `value` or `values` (plus `multiple_values` where required). Call `recordingsCriteriaDefinition` for the criteria catalog; the `recordings-filter` skill is the long-form reference. Example: {"version":2,"operator":"AND","conditions":[{"criteria":"date_range","value":{"special":"last 30 days"}}]} """ filters: String! ): Int """ Returns distinct recording tags for one site using a capped autocomplete-style lookup. Use `fragment` for a case-insensitive substring match without fetching full recordings. Requires recordings view access. """ recordingsTags( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! "Case-insensitive tag substring; omitted, null, or empty matches all tags." fragment: String "Maximum number of tags to return; defaults to 100 and is capped at 1000." limit: Int ): [String!] """ Returns a JSON-encoded object `{"version":2,"definitions":[...]}`, the authoritative criteria catalog for recordings `filters`. Each definition gives its `criteria` key, `use_comparison` and `allowed_comparisons`, `use_multiple_values` (send `values` instead of `value`), `multiple_values_options`, `compose_value` (`value` is an object keyed by field name), and `fields` with types, options, and validations. Requires recordings view access; shared-link sessions are allowed. """ recordingsCriteriaDefinition( """ Filter version; 2 is the only supported version and is used when omitted, null, 0, or negative. Other values return an error. """ version: Int ): String """ Returns per-term recording counts across one site or all accessible sites, ordered by count descending. Each match reports whether it matched `identifier` or `visitorId`, and unmatched terms appear in `notFound`; use `visitorsRecordingsDetails` for full recordings. Requires recordings view access. """ visitorsRecordings( "Exact visitor identifiers or visitor ids from `recordingsList`; terms are trimmed and de-duplicated." terms: [String!]! "Site id from `sites`; omitted or null searches all accessible sites." siteId: Int ): VisitorRecordingsResult """ Returns recordings matched exactly by `identifier` or `visitorId` across one site or all accessible sites, plus a tag summary of matching recordings. Use `visitorsRecordings` for counts; this result is unpaginated with unspecified order. Requires recordings view access. """ visitorsRecordingsDetails( "Exact `identifier` or `visitorId` values from `recordingsList`; whitespace is significant." terms: [String!]! "Site id from `sites`; omitted or null searches all accessible sites." siteId: Int ): VisitorsRecordingsMeta! """ Validates a recordings filter, migrates it to the target version, and returns it as a JSON-encoded string. With version 2 as the only version, this returns the validated filter re-encoded, so it can check a payload before saving it. Use `recordingsCriteriaDefinition` for the criteria catalog. Requires recordings view access. """ refreshFilterVersion( """ Filter version; 2 is the only supported version and is used when omitted, null, 0, or negative. Other values return an error. """ version: Int """ JSON-encoded string. Envelope: `{"version":2,"operator":"AND","conditions":[...]}`, where `operator` is uppercase `AND` or `OR` and `conditions` is a non-empty list of nested groups or leaves. A leaf has `criteria`, `comparison` only when the criterion takes one, and `value` or `values` (plus `multiple_values` where required). Call `recordingsCriteriaDefinition` for the criteria catalog; the `recordings-filter` skill is the long-form reference. Example: {"version":2,"operator":"AND","conditions":[{"criteria":"date_range","value":{"special":"last 30 days"}}]} """ filters: String! ): String """ Looks up one recording by `hashedId` and returns it with `skipRecordingCursor`, which can be passed as `cursor` to `recordingsList` to exclude this recording. Use `recordingsList` to discover ids. A missing or inaccessible recording returns an error, as does one whose owner lacks an active recordings subscription. Requires recordings view access; shared-link sessions are allowed. """ recording( """ Public `hashedId` from `recordingsList` or `recording_id` from `recordingsDataForAi`; numeric `id` is not accepted. """ hashedId: String! ): RecordingWithCursor """ Returns a JSON-encoded array sampling at most 70 matching recordings longer than 20 seconds that the current user has not watched; order is unspecified. Entries contain hashed `recording_id`, `first_page_url_normalized`, `last_page_url_normalized`, `browser`, `os`, `device`, `country`, `duration` (seconds), `number_of_visits`, `visited_pages_count`, `referrer_url`, `tags`, `clicks_count`, `scrolls_count`, `events_count`, `errors_count`, `goal_conversion_count`, `final_worth` and `max_worth` (scaled by 10,000), and their `currency`. Use `recordingsList` for sorted or watched matches and `recordingsCount` for totals. Requires recordings view access. """ recordingsDataForAi( "Site id from `sites`; the site must be accessible to the current viewer." siteId: Int! """ JSON-encoded string. Envelope: `{"version":2,"operator":"AND","conditions":[...]}`, where `operator` is uppercase `AND` or `OR` and `conditions` is a non-empty list of nested groups or leaves. A leaf has `criteria`, `comparison` only when the criterion takes one, and `value` or `values` (plus `multiple_values` where required). Call `recordingsCriteriaDefinition` for the criteria catalog; the `recordings-filter` skill is the long-form reference. Example: {"version":2,"operator":"AND","conditions":[{"criteria":"date_range","value":{"special":"last 30 days"}}]} """ filters: String! ): String! """ Runs a full tracking-script audit for a URL and device, returning the first error plus warnings and informational findings. Use checkTitle for page metadata or checkPermission for a smaller preflight. May create or mark an installed site, update snapshot installation state, and refresh the tracking script. Requires an authenticated session; limited to 30 calls per minute per user. """ checkScript( "Page URL or hostname; a missing scheme is added." url: String! "Device profile used to visit and audit the page." device: SnapshotDevice! ): ScriptCheck """ Probes a page for its title, final URL, installation indicator, domain access, and snapshot quota impact. Use checkScript for detailed installation findings; redirects can produce a login-page hint. Requires an authenticated session; limited to 30 calls per minute per user. """ checkTitle( "Page URL or hostname; a missing scheme is added." url: String! """ Snapshots about to be created, added to the existing count for `numberOfSnapshotsOverQuota`; omit to check existing snapshots only. """ newSnapshotsCount: Int ): ScriptCheckExpedited """ Checks the URL's registrable domain for site access or creation permission, probes for a tracking-script indicator, and estimates snapshot quota overflow. Use checkTitle when redirect-aware metadata is needed, or checkScript for full diagnostics. Requires an authenticated session. """ checkPermission( "Page URL or hostname; a missing scheme is added." url: String! """ Snapshots about to be created, added to the existing count for `numberOfSnapshotsOverQuota`; omit to check existing snapshots only. """ newSnapshotsCount: Int ): ScriptCheckPermissionOnly """ Looks up a public share code and needs no login. Returns `REDIRECT` with a URL for export links and for links saved with an `originalUrl` (except Heatmap and Page Speed links), otherwise `RESOURCE` with metadata and an expiring `authToken` for follow-up reads of that resource. Fails when the code is unknown or disabled, the resource or its owner is gone, or the owner's subscription no longer covers it. Successful lookups count as a view. """ sharedResource( "Code from the last path segment of a share link's `fullPath`; disabled or regenerated codes fail." sharingCode: ID! ): SharedResourceResult! """ Returns the public share link for a resource the caller can access, creating an enabled link when none exists. An existing link is returned as is, even when disabled and regardless of `originalUrl`; use `sharedUrls` and the share-link mutations to manage links. Requires sharing create access. """ sharedUrl( "Resource type to share; `UNKNOWN` is not supported for creation." type: SharedUrlType! """ Resource id from the query named by `type`: numeric for most types, fingerprint for errors, add-on id for surveys/CTAs. Use `recordingsIdsInGroup` for numeric recording ids, not hashed player ids. """ itemId: ID! "Site id from `sites`; required for errors, surveys and CTAs, optional to scope a funnel lookup." siteId: Int """ Optional app URL the link opens, a path starting with `/` or an http(s) Crazy Egg URL. `sharedResource` redirects to it for most types and keeps only its `#` fragment for Heatmaps; ignored when the link exists. """ originalUrl: String ): SharedUrlResult """ Returns one page of the account's share links with page metadata, filtered by `status` (enabled by default) and `searchTerm` and sorted by `order`. Links to deleted Heatmaps, A/B tests, goals, funnels, and sites are hidden. Use `sharedUrl` to get or create the link for one resource. Requires sharing manage access. """ sharedUrls( """ Matches title or resource type as a substring, and sharer id, name, or email, share code, or original URL exactly; `%` acts as a wildcard. """ searchTerm: String "Required sort object; an empty object selects creation time descending." order: SharedUrlsOrder! "Page size, an integer of at least 1; no maximum is enforced here." limit: Int! "Page number, starting at 1." page: Int! "Link status to include; defaults to `ENABLED`." status: SharedUrlsStatus! ): SharedUrlListResults """ Returns one preview per requested page of a site, in request order. URLs are canonicalized on the server. Sources: the Spider screenshot (the site's private one only with Recordings-view access), the site's browser capture of the page, then the newest processed Snapshot thumbnail for the device. Otherwise an interactive session gets status CAPTURE with a capture ticket for pages on the site's domain, unless a capture of the page failed in the last 24 hours. Image URLs are presigned and expire after 15 minutes. Requires access to the site; accepts at most 100 requests. """ pageThumbnails( "Site whose pages to look up." siteId: ID! "Pages to look up." requests: [PageThumbnailRequest!]! ): [PageThumbnail!]! """ Returns all accessible sites sorted by case-insensitive name and then ID, including tracking and recording settings. Use the feature-specific site queries for dashboard counts. Requires a logged-in session; shared sessions are allowed and receive reduced details. """ sites: [Site] """ Returns sites with snapshot counts and summed snapshot visit totals, including sites with no snapshots. Use sites for general settings or site for one ID. Requires snapshots view access. """ sitesForSnapshots: [SiteForSnapshots!] """ Returns sites with recording enabled or retained recordings, with recording counts when available. Use sites for the general site list; counts may be null when only presence is checked. Requires recordings view access. """ sitesForRecordings: [SiteForRecordings!] """ Returns sites with at least one goal and their goal counts. Use sites to include sites without goals. Requires goals view access. """ sitesForGoals: [SiteForGoals!] """ Returns accessible sites sorted by name, with separate nondeleted survey and CTA counts. Use addonList to retrieve add-ons for a selected site. Requires survey view access or CTA view access. """ sitesForAddons: [SiteForAddons!] """ Deprecated: use `pageThumbnails`. Returns the stored desktop preview image of each requested page, from the accessible site whose registrable domain is the URL's, as `pageThumbnails` would without a capture. Never captures a page and never saves site or snapshot records. Requires a logged-in session. """ thumbnails( "At most 100 page URLs; one result is returned for each request in the same order." requests: [ThumbnailRequest!]! ): [ThumbnailResult] @deprecated(reason: "Use pageThumbnails; thumbnailUrl is an empty string when no stored image exists.") """ Returns one accessible site by ID, including its tracking and recording settings when available. Missing or unauthorized IDs return an error; use sites to discover IDs. Requires a logged-in session; shared sessions are allowed and receive reduced details. """ site("Site ID from sites." id: Int!): Site! """ Returns pages of the Site's Spider site map and a `status` saying whether asking again will return more. Without `query` or `pageType` these are suggested pages, most important first; pass pages the user already added in `excludeUrls` to get the next ones. With `query` this is URL and title autocomplete, best match first: an exact path segment before a word or substring of the path, the path before the title, tolerating typos; importance only orders pages that match equally well. The first request for an empty map runs a quick crawl (up to about 10 seconds), returns the pages the Site's Recordings and Web Analytics already know, and queues a full crawl and their import, so the answer is partial: while `PENDING`, repeat every 10 to 30 seconds, backing off, until `READY`; on `UNAVAILABLE`, retry after `retryAfterS` or stop when it is null. Pages seen only in Recordings, Web Analytics or Google Analytics imports are returned only to users who may view Recordings. Requires site access. """ siteMapPages( "Site ID from `sites`." siteId: Int! """ Autocomplete text, at most 200 characters, matched case-insensitively against the URL and the page title. Every word must match; words of 4 or more letters also match with a typo. A path (`/pricing`) or a URL with a host (`example.com/pricing`) matches that path and the pages under it. """ query: String "Only confidently classified pages of this type. Quick-crawl pages are unclassified and never match." pageType: SiteMapPageType "Maximum number of pages, default 25. Values outside 1 to 50 are clamped to that range." limit: Int """ At most 200 URLs to leave out before the limit applies, for example pages the user already added. Each is canonicalized like Spider's page URLs (case of scheme and host, default port, trailing slash, fragment, tracking parameters) and also excludes its `http` and `https` forms with and without one leading `www.`. An entry without a scheme (`example.com/pricing`) is read as `http://`; a relative one (`/pricing`) is ignored. """ excludeUrls: [String!] ): SiteMapPagesResult! """ Suggests site-map pages in importance order, excluding source URLs captured by active, unexpired Heatmaps below their visit limit, including scheduled captures, and completed recurring Heatmaps awaiting a successor. Exclusions apply before the limit and use sitemap URL canonicalization. Other completed, stopped, and deleted Heatmaps do not exclude pages. Requires Heatmap edit access and editable access to the site. """ snapshotSuggestedPages( "Site ID from `sites`." siteId: Int! "Maximum suggestions, clamped to 1–50; defaults to 15." limit: Int "Up to 200 additional URLs to omit, such as pages already entered in the creation wizard." excludeUrls: [String!] ): SiteMapPagesResult! """ Returns a cursor-paged list of accessible snapshots in the requested order, defaulting to start time ascending. Use `snapshots` for numbered pages and counts, or `snapshot` for one ID. Pass `nextPageCursor` to exclude previously returned IDs; `hasNextPage` only indicates a full page. Requires snapshot view access. """ snapshotsList( "Snapshot filters; omit individual fields to leave them unrestricted." filter: SnapshotListFilterCursor! "Sort options; defaults inside the object are start time ascending." order: SnapshotListOrder! """ Opaque `nextPageCursor` from `snapshotsList`; omit for the first page and keep filters and order unchanged. """ cursor: String "Page size from 1 to 200; defaults to 50." limit: Int ): SnapshotsListMeta """ Returns a numbered page of accessible snapshots in the requested order, defaulting to start time ascending. Use `snapshotsList` for cursor pagination or `snapshot` for one ID. Metadata totals use the filters, while status counts ignore the status filter. Requires snapshot view access. """ snapshots( "Snapshot filters; omit individual fields to leave them unrestricted." filter: SnapshotListFilter! "Sort options; defaults inside the object are start time ascending." order: SnapshotListOrder! ): SnapshotPaginatedList """ Returns active or failed exports followed by completed download entries, with each group sorted newest first. Use after `exportSnapshots` to find download URLs; the combined list is unpaginated and is not globally date-sorted. Requires snapshot view access. """ snapshotExports: [SnapshotExport] """ Returns one accessible snapshot with derived status and permissions; null means no accessible, undeleted snapshot matches. Use `snapshotStats` for refreshed totals or `snapshotsList` to browse. Requires snapshot view access. """ snapshot("Snapshot ID from `snapshotsList`, `snapshots`, or `createSnapshots`." id: Int!): Snapshot """ Returns current visit and click totals plus derived status for one accessible snapshot. Use `snapshot` for settings; totals are zero until the site is installed, and null means no accessible snapshot with a site matches. Requires snapshot view access. """ snapshotStats("Snapshot ID from `snapshotsList`, `snapshots`, or `createSnapshots`." id: Int!): SnapshotStats """ Returns missing phone and tablet screenshot devices for the same normalized page and site, in phone then tablet order. Use this to choose companion captures; an empty list means neither is missing, while null means the snapshot is inaccessible or absent. Requires snapshot view access. """ snapshotMissingDevices( "Snapshot ID from `snapshotsList`, `snapshots`, or `createSnapshots`." id: Int! ): [SnapshotDevice!] """ Returns the excess over the account snapshot quota after adding the proposed count, without creating anything. Zero means the quota is exactly filled; null means the proposal is below quota or no finite quota is available. Use before `createSnapshots`. Requires snapshot edit access. """ checkSnapshotsQuota( """ Number of proposed new snapshots, including separate device captures; use zero to check current quota excess. """ newSnapshotsCount: Int! ): Int """ Returns saved SAML SSO settings for the active account, or disabled defaults with an existing-members-only fallback rule when none are saved. Use `saveSsoSettings` to change settings or start a validation login. Requires SSO edit access. """ ssoSettings: SsoSettings! """ Returns one survey response group by zero-based index, oldest first by creation time and then response-group ID, plus the filtered total. Use surveyResponseList for cursor pagination. An index outside the result set returns a null response. Requires survey view access; matching shared links are allowed. """ surveyResponses( "Survey UUID from addonList with type SURVEY." id: ID! "Zero-based position, 0 or greater, in the filtered chronological response groups." index: Int! "Inclusive start time in Unix seconds; omit for no lower bound." startDate: Int "Inclusive end time in Unix seconds; omit for no upper bound." endDate: Int ): SurveyResponsesMeta """ Returns cursor-paged survey response groups with their question answers, applying the requested sort after inclusive date filtering. Use surveyResponses for an indexed lookup or surveyResultSummary for aggregates. Requires survey view access; matching shared links are allowed. """ surveyResponseList( "Survey UUID from addonList with type SURVEY." surveyId: ID! "Opaque nextPageCursor from surveyResponseList; omit for the first page." cursor: String "Page size from 1 to 200; defaults to 20." limit: Int "Inclusive start time in Unix seconds; omit for no lower bound." startDate: Int "Inclusive end time in Unix seconds; omit for no upper bound." endDate: Int "Sort field and direction; defaults inside the object are CREATED_AT and DESC." order: SurveyResponsesListOrder! ): SurveyResponseListMeta """ Returns survey view events, response-group counts, and per-question aggregates for an optional inclusive date window. Questions are ordered by position; view counts use calendar dates while responses use timestamps. Use surveyResponseList for individual submissions. Requires survey view access for questions; the root accepts survey or CTA view access and matching shared links. """ surveyResultSummary( "Survey UUID from addonList with type SURVEY." id: ID! "Inclusive start time in Unix seconds; omit for no lower bound." startDate: Int "Inclusive end time in Unix seconds; omit for no upper bound." endDate: Int ): SurveyResultSummary """ Returns the active account holder and linked collaborators, optionally filtered by site access, sorted by display name ignoring case. Names fall back to email, and pending invitations are excluded. Use `accountUsers` for roles, invitations, and team administration. Requires authentication. """ teamMembers( "Site ID from `sites`; omit to include all linked collaborators. The account holder is always included." siteId: Int ): [TeamMember!]! """ Returns the complete active account roster, including the account holder, linked members, and pending invitations. Results follow `order` without pagination; use `teamMembers` for a lightweight collaborator picker. Requires team settings navigation access. """ accountUsers( """ Roster ordering; pass an empty object for email ascending. With `LAST_ACTIVE`, null activity sorts last ascending and first descending. """ order: AccountUsersOrder! ): [AccountTeamMember!]! """ Returns session counts grouped by referrer and UTM values for a site and required window, ordered by count descending. Visits are valid, non-deleted, non-virtual recordings with page counts, excluding recording format version 1. Use `urls` for exact normalized landing-URL matches or `trafficAnalysisUrls` for landing-page comparisons. This list has a row limit and no cursor. Requires traffic analysis view access. """ trafficAnalysis( "Site ID from `sites`; requires access to this site." siteId: Int! "Inclusive session recording-time start in Unix seconds." startAt: Int! "Inclusive session recording-time end in Unix seconds." endAt: Int! "Maximum referrer/UTM groups, default 1000; no cursor pagination." limit: Int "Normalized landing URLs to match exactly; entries are ORed. Omit or pass an empty list for all landing URLs." urls: [String!] ): [TrafficAnalysisResult!]! """ Returns landing-page visit counts and parallel filter totals for a site and required window, prepending an `All` row. Visits follow the recording eligibility rules of `trafficAnalysis`. The selected filter's rows rank first, then by count; the limit applies before landing URLs are deduplicated. Use `trafficAnalysis` for referrer/UTM groups. Requires traffic analysis view access. """ trafficAnalysisUrls( "Site ID from `sites`; requires access to this site." siteId: Int! "Inclusive session recording-time start in Unix seconds." startAt: Int! "Inclusive session recording-time end in Unix seconds." endAt: Int! "Maximum comparison rows fetched before URL deduplication, default 100; excludes the prepended `All` row." limit: Int "Ranking settings; always pass both `filterIndex` and `sort`, because requests that omit `order` or `sort` fail." order: TrafficAnalysisUrlsOrder """ Independent comparison filters; fields inside each filter are ANDed and values within a field are ORed. Empty list compares unfiltered visits. """ filters: [TrafficAnalysisUrlsQuery!] ): [TrafficAnalysisUrlsResult!]! """ Returns the Audience definition contract: the fixed JSON envelope, every supported criterion with its comparisons and value rules, the criteria this account may use, and a valid example. Call it before writing an audience definition and use each criterion's `discoveryQuery` to look up ids and values; the `audience-targeting` skill carries the full JSON Schema. Requires audience view access. """ audienceDefinitionContract: AudienceDefinitionContract! """ Returns the custom user properties registered for a site, ordered by name. Use their names and types in `custom_property` audience conditions; an empty list means none are registered, so `custom_property` cannot be used. Requires audience view access. """ userProperties("Site id from the `sites` query." siteId: Int!): [UserProperty!]! """ Returns the recommended tracking-script installation method and the technologies detected for a page URL. It never returns null: a missing URL or failed lookup sets `issue` to `URL_NOT_FOUND`, pending page analysis sets `NOT_ENOUGH_INFO_YET`, and no supported platform sets `TECH_NO_MATCH`. Requires installation view access. """ techRecommendation( "Public page URL to analyze, for example `https://example.com`; omitted or empty values return `URL_NOT_FOUND`." url: String ): SimpleTechRecommendation } type RootMutationType { """ Records one to four views or clicks of guided task recommendations for the caller and returns how many were stored. Each event saves the recommendation details carried by its token (guided task, recommendation, position, priority, and site or Google Analytics property) with the event type and time; repeated event UUIDs are ignored. Requires a logged-in user. """ recordGuidedTaskEvents( "One to four recommendation interactions; use a distinct event UUID for each interaction." events: [GuidedTaskEventInput!]! ): Int """ Validates and saves newline-separated IP blocking rules for the active account and copies them to existing site settings. Returns normalized text and inline errors; `errors: null` means the save succeeded, while validation errors leave saved rules unchanged. Use `options.userBlockedIps` to read saved rules. Requires tracking options edit access. """ updateBlockedIps( """ Newline-separated IPv4 or IPv6 addresses, `*` wildcards, or hyphen-separated address ranges; `#` starts a comment. An empty string clears the rules. """ ipList: String! ): UpdateBlockedIpsResult """ Stores a metadata key and optional string value for the active account and returns `true`. Most keys replace the previous value, while event markers and a few signup keys are write-once; omitting `value` stores no value. Read entries through `me.userData` or keys through `me.flags`. Requires authentication. """ setUserData( "Metadata key to store; read existing keys from `me.flags` or `me.userData`." name: String! "String value to save; omitted or null stores no value. Event marker keys ignore this value." value: String ): Boolean """ Updates the provided email notification preferences and returns `true` on success. Omitted flags keep their saved values; use `userNotifications` to read the complete set. Requires Crazy Egg email settings edit access. """ setUserNotifications( "Whether to receive end-of-test emails; omitted keeps the saved preference." endOfTest: Boolean "Whether to receive daily update emails; omitted keeps the saved preference." dailyUpdate: Boolean "Whether to receive weekly update emails; omitted keeps the saved preference." weeklyUpdate: Boolean "Whether to receive account limit emails; omitted keeps the saved preference." accountLimits: Boolean "Whether to receive receipt emails; omitted keeps the saved preference." receipt: Boolean "Whether to receive newsletters; omitted keeps the saved preference." newsletter: Boolean "Whether to receive snapshot recommendation emails; omitted keeps the saved preference." snapshotRecommendation: Boolean "Whether to receive weekly export emails; this saves a preference rather than requesting an export." weeklyExport: Boolean "Whether to receive monthly export emails; this saves a preference rather than requesting an export." monthlyExport: Boolean "Whether to receive trial-ended emails; omitted keeps the saved preference." trialEnded: Boolean ): Boolean """ Records views or clicks for onboarding task slugs from `gettingStarted`; requests a tracking script refresh. Returns `true` when every requested event is recorded; this does not mark the tasks complete. Both `event` and `slugs` must be supplied. Requires authentication. """ trackGettingStarted( "Interaction type to record; supply `CLICK` or `VIEW` together with `slugs`." event: TrackGettingStartedEvents "Task slugs from `gettingStarted`; required together with `event`." slugs: [String] ): Boolean """ Updates the active account company billing profile and overwrites the company name and address on every past billing-history entry. Address validation uses the resulting saved address, including fields omitted from this call. Use `billingDetails` to read the profile. Requires billing edit access. """ updateCompanyInfo( "Company name, at most 64 characters; omitted keeps the saved value." companyName: String "Company registration identifier, at most 64 characters; omitted keeps the saved value." companyId: String "Company VAT identifier, at most 64 characters; omitted keeps the saved value." companyVat: String """ Street address, at most 60 characters; required in the resulting address when any address field is set. """ address: String "City, at most 50 characters; required in the resulting address when any address field is set." city: String "State or province, at most 50 characters; required for United States, Canada, and Australia addresses." stateOrProvince: String """ ZIP or postal code, at most 50 characters; required for United States, Canada, and Australia addresses. """ zipOrPostalCode: String """ Full country name, such as `United States`, rather than a country code; required when any address field is set. """ country: String ): Boolean """ Emails the caller's feedback to the Crazy Egg help inbox from the caller's account email, which is also the reply address, and returns the queued email details. Blank messages or messages over 2048 characters fail validation. Requires a logged-in user. """ sendUsFeedbackEmail("Nonblank feedback text, at most 2048 characters." message: String!): SendEmailResult """ Emails a priority support request to Crazy Egg support with `fromEmail` as the reply address and returns the queued email details. Use `sendUsFeedbackEmail` for general feedback. Requires a logged-in user. """ sendPrioritySupportEmail( "Sender name, reply-to email, and message; `isCorporate` is ignored here." email: SimpleEmailParams! ): SendEmailResult """ Emails an add-on details inquiry to Crazy Egg support with `fromEmail` as the reply address and returns the queued email details; `isCorporate` marks it as a corporate add-on inquiry. Use `sendPrioritySupportEmail` for support requests. Requires a logged-in user. """ sendAddonDetailEmail( "Sender name, reply-to email, message, and whether the inquiry is corporate." email: SimpleEmailParams! ): SendEmailResult """ Emails Crazy Egg installation instructions with the account's tracking script tag to a developer, optionally copying the caller, and returns the queued email details. A non-blank `message` is required even though the field is nullable. Requires installation view access. """ sendInstallInstructionsEmail( "Developer email, site URL, personal message, and whether to copy the caller." email: InstructionsEmailParams! ): SendEmailResult """ Creates a folder owned by the current account on an editable site and returns it. Supports snapshots, recordings, A/B testing, and editor folder types; use `updateFolder` to rename a snapshots folder. Requires snapshots edit access. """ createFolder( "Site, folder type, and title for the new folder; ownership comes from the current session." folder: FolderCreateParams! ): Folder """ Updates only the title of an existing snapshots folder and returns it. The folder must belong to the current account on an editable site; other folder types cannot be renamed here. Requires snapshots edit access. """ updateFolder("Existing snapshots folder id and replacement title." folder: FolderUpdateParams!): Folder """ Deletes a snapshots folder owned by the current account on an editable site and returns the deleted folder. Also deletes every snapshot inside the folder and regenerates the tracking script. Requires snapshots edit access. """ deleteFolder( "Snapshots folder `id` from `folders` or `folder`; its snapshots are also soft-deleted." id: Int! ): Folder """ Replaces the enabled Google Analytics property selection and returns only account properties whose enabled state changed, ordered by name. Omitted IDs are disabled; an empty list disables all, and disabling also disables their shared links. Requests imports for submitted properties and clears the new-property markers. Submitting more unique IDs than the plan's property limit returns a quota error. Requires GA import access. """ setEnabledGaProperties( """ Complete desired selection of property IDs from `gaProperties`; omit IDs to disconnect imports, or send [] to disable all. """ propertyIds: [Int!]! ): [GaProperty!]! """ Starts the Segment install flow and returns a browser redirect URL for consent. After installation the browser returns to `returnUrl` with `segment_status=ok`, or `segment_status=error` and `segment_error`. Requires installation view access. """ initializeSegmentIntegration( "Post-install return path starting with /, or an HTTP(S) URL on an allowed application host." returnUrl: String! ): InitializeSegmentIntegrationResult """ Sets a share link's status and note and returns the updated link; the caller must still have access to the shared resource. Disabling a link makes `sharedResource` reject its code; use `regenerateSharedUrl` to replace the code instead. Requires sharing manage access. """ updateSharedUrl( "Share-link id, enabled state, and optional replacement note." sharedUrl: SharedUrlUpdateParams! ): SharedUrlResult """ Applies `updateSharedUrl` to each item independently and returns the successful updates in input order; errors only when none succeed. Every item must include `note` (null clears it). Requires sharing manage access. """ updateSharedUrlList( "Updates for ids from `sharedUrls`; include `note` in each item, using null to clear it." sharedUrls: [SharedUrlUpdateParams!]! ): [SharedUrlResult] """ Replaces a share link's public code so the previous link stops working, and returns the updated link. Optionally replaces `originalUrl`; status is unchanged. Requires sharing manage access. """ regenerateSharedUrl( "Share-link record id from `sharedUrls` or `sharedUrl`." id: Int! """ Optional replacement app URL, a path starting with `/` or an http(s) Crazy Egg URL; omit to keep the current one. """ originalUrl: String ): SharedUrlResult """ Bulk `regenerateSharedUrl` without `originalUrl`: replaces the public codes of the given links and returns them in input order. Missing or inaccessible ids are skipped; errors only when none remain. Requires sharing manage access. """ regenerateSharedUrlList( "Share-link record ids from `sharedUrls` or `sharedUrl`; inaccessible ids are skipped." ids: [Int!]! ): [SharedUrlResult] """ Stores the two images uploaded for a capture ticket from pageThumbnails as the site's browser capture of the page and returns its READY thumbnail. Both must be JPEGs of the device's sizes. The ticket is used up even when the images are rejected; look the page up again for a new one. Requires an interactive session of the account the ticket was issued to. """ commitPageThumbnail("Token of the capture ticket." token: String!): PageThumbnail! """ Records that a capture failed, deletes its uploads and returns the page as a new lookup would: its stored thumbnail, if any, and no new ticket for the page and device for 24 hours. A REDIRECTED failure can instead switch the page to its recordings; the result then carries a RECORDING capture ticket for sessions that may view recordings. Requires an interactive session of the account the ticket was issued to. """ failPageThumbnail( "Token of the capture ticket." token: String! "Why the capture failed, as the capture page reported it." reason: PageThumbnailFailureReason! """ For `REDIRECTED`, the URL the page ended on, as the capture page reported it. Kept only when it is an absolute HTTP(S) URL of at most 2048 characters; ignored for other reasons. """ finalUrl: String ): PageThumbnail! """ Creates a site using the lowercased registrable domain of the URL, enabling session recording and refreshing the tracking script. A missing scheme is added; subdomains belong to the same site, and an existing domain returns an error. Returns the caller's full site list, sorted by name and ID. Requires sites create access. """ addSite( "Site URL or hostname; a scheme is added and the registrable domain becomes the site name." url: String! ): [Site!] """ Enables or disables session recording on an editable site and requests a tracking script refresh. Repeating the current state leaves it unchanged. Use setRecordingSettings to change targeting or sampling. Requires recordings settings access. """ setSiteRecording( "Site ID from sites." siteId: Int! "True to enable recording; false to disable it." enable: Boolean! ): [Site!] """ Soft-deletes an editable site and returns the remaining accessible sites sorted by name and ID. Associated data is not synchronously removed here, and the mutation requests a tracking script refresh. Requires sites delete access. """ deleteSiteAndAssociatedData("Site ID from sites." siteId: Int!): [Site!] """ Creates or updates recording targeting, masking, and sampling settings for an editable site and returns the saved configuration. Marks recording ratios for recalculation and requests a tracking script refresh. Use setSiteRecording to toggle recording itself. Requires recordings settings access. """ setRecordingSettings( "Site ID from `sites`; required even though the schema marks it optional." siteId: Int "True records only pages matching `urlMatchingRules`; false records all pages not blocked." pageTargetingEnabled: Boolean """ True ends recording when a blocked page is reached; false skips that page and allows the session to continue. Defaults to false for new settings. """ endSessionOnBlockedUrl: Boolean """ JSON-encoded string. Pages to record when `pageTargetingEnabled` is true, as `{"rules":[...]}`. Each rule has `u`, a full URL, or a pattern using `*` with `"o":"*"`; legacy `o` values `r` and `h` are converted on read. Null clears the list. Example: {"rules":[{"u":"https://example.com/pricing"},{"u":"example.com/blog/*","o":"*"}]} """ urlMatchingRules: String """ JSON-encoded string. Pages never to record, same `{"rules":[...]}` shape as `urlMatchingRules`; see `endSessionOnBlockedUrl`. Null clears the list. Example: {"rules":[{"u":"example.com/account/*","o":"*"}]} """ blockedUrlMatchingRules: String """ JSON-encoded string. Array of elements to mask in recordings, each with a CSS `selector` and an optional `note`. Null clears the list. Example: [{"selector":".account-number","note":"Card digits"}] """ maskElements: String "AUTO for automatic sampling, RATE for a percentage, or STATIC for a fixed recording count." samplingType: SamplingType """ For RATE, percent of visitors from 0 to 100 (25.5 is 25.5%), truncated to two decimals; for STATIC, target recordings per month, truncated to an integer. Send `samplingType` in the same call; omit for AUTO. """ samplingValue: Float ): RecordingSettings! """ Stores the first 100 supplied colors in site metadata and returns the site. Requests a tracking script refresh. Requires survey edit access, CTA edit access, or site settings edit access, and an editable site. """ setSiteColors( "Site ID from sites." siteId: Int! "Color strings to replace the stored list; only the first 100 entries are saved." colors: [String]! ): Site! """ Validates and deduplicates supplied fonts, stores up to 100 in site metadata, and returns the site. Requests a tracking script refresh. Requires survey edit access, CTA edit access, or site settings edit access, and an editable site. """ setSiteFonts( "Site ID from sites." siteId: Int! """ Replacement font list; duplicates are removed and only the first 100 distinct normalized fonts are stored. """ fonts: [SiteFontInput!]! ): Site! """ Enables or disables Web Analytics for an editable site and returns the site. Enabling an already enabled site keeps its original enablement time; disabling clears it. Requests a tracking script refresh. Requires Web Analytics edit access. """ siteEnableAnalytics( "Site ID from sites." siteId: Int! "True to enable Web Analytics; false to disable it." enable: Boolean! ): Site! """ Updates an editable site's tracking and privacy settings, creating site settings if absent, and returns the site. Omitted settings retain their values; a new record uses its defaults. Requests a tracking script refresh. Requires tracking options edit access. """ updateSiteSettings( "Site ID from sites." siteId: Int! """ True ignores Do Not Track and tracks those visitors too; false skips visitors whose browser sends it. Defaults to true on new settings. """ dnt: Boolean """ Whether an email address entered in a form or survey response becomes the visitor profile ID; defaults to true on new settings. """ autoIdentify: Boolean "Whether tracking cookies use the Secure attribute; defaults to false on new settings." useSecureCookies: Boolean """ Whether Crazy Egg page captures use the Crazy Egg Bot user agent instead of a standard Chrome one; defaults to false on new settings. """ explicitAgent: Boolean "IP exclusion list text stored for this site." ipListText: String """ Supported three-letter currency code such as USD, normalized to uppercase; null or empty inherits the account currency. """ defaultCurrency: String ): Site """ Enables or disables the public tracking API for an editable site and returns the site. Enabling generates an API key if absent, and the mutation requests a tracking script refresh. Requires API edit access. """ updateSitePublicTrackingApi( "Site ID from sites." siteId: Int! "True to enable the site's public tracking API; false to disable it." enabled: Boolean! ): Site """ Replaces an editable site's API key and returns the site with the new key. Use updateSitePublicTrackingApi to change enablement; rotation requests a tracking script refresh. Requires API edit access. """ regenerateSiteApiKey("Site ID from sites." siteId: Int!): Site """ Creates copies of eligible snapshots, stops their originals, and refreshes the tracking script. Returns the new IDs; manual captures, A/B test variants, recurring snapshots and snapshots with a recurring successor are skipped. Use `refreshSnapshots` to recapture without creating copies. Requires snapshot edit access. """ duplicateSnapshots( """ Snapshot IDs from `snapshotsList` or `snapshots`; inaccessible or ineligible snapshots may be skipped. """ snapshotIds: [Int]! ): Affected """ Requests automatic recapture and reprocessing for accessible non-manual snapshots, returning their IDs. Use `pageCameraSetScreenshotStatus` after uploading a manual capture instead. Requires snapshot edit access. """ refreshSnapshots( """ Snapshot IDs from `snapshotsList` or `snapshots`; inaccessible or ineligible snapshots may be skipped. """ snapshotIds: [Int]! ): Affected """ Stops accessible active snapshots that have started, excluding A/B test variants and snapshots with a recurring successor. Returns newly stopped IDs separately from already-stopped IDs; use `resumeSnapshots` to restart eligible snapshots. Requires snapshot edit access. """ pauseSnapshots( """ Snapshot IDs from `snapshotsList` or `snapshots`; inaccessible or ineligible snapshots may be skipped. """ snapshotIds: [Int]! ): StopResult """ Resumes accessible stopped snapshots with unexpired dates and visits remaining, excluding A/B test variants and snapshots with a recurring successor. Refreshes the tracking script and returns only changed IDs; use `resumeSnapshotsNew` for update failure details. Requires snapshot edit access. """ resumeSnapshots( """ Snapshot IDs from `snapshotsList` or `snapshots`; inaccessible or ineligible snapshots may be skipped. """ snapshotIds: [Int]! ): Affected """ Resumes eligible stopped snapshots and returns changed IDs plus any individual save failures. Ineligible or inaccessible IDs are skipped without errors; use `resumeSnapshots` for the legacy response containing only changed IDs. Requires snapshot edit access. """ resumeSnapshotsNew( """ Snapshot IDs from `snapshotsList` or `snapshots`; inaccessible or ineligible snapshots may be skipped. """ snapshotIds: [Int]! ): ResumeSnapshotsResults """ Marks accessible snapshots as deleted and returns their IDs. Also detaches recurring predecessors and refreshes the tracking script; use `pauseSnapshots` to stop collection while keeping snapshots listed. Requires snapshot edit access. """ deleteSnapshots( """ Snapshot IDs from `snapshotsList` or `snapshots`; inaccessible or ineligible snapshots may be skipped. """ snapshotIds: [Int]! ): Affected """ Assigns editable snapshots on the destination folder site to that folder. Returns deduplicated requested IDs when the folder is editable, even if some snapshots are skipped, or an empty list otherwise; use `unfileSnapshots` to remove folder assignments. Requires snapshot edit access. """ moveSnapshots( "Destination folder ID from `folders`; snapshots must belong to the same site." toFolderId: Int! """ Snapshot IDs from `snapshotsList` or `snapshots`; inaccessible or ineligible snapshots may be skipped. """ snapshotIds: [Int]! ): Affected """ Clears folder assignments on accessible editable snapshots. Returns deduplicated requested IDs even when some are skipped; use `moveSnapshots` to assign a destination folder. Requires snapshot edit access. """ unfileSnapshots( """ Snapshot IDs from `snapshotsList` or `snapshots`; inaccessible or ineligible snapshots may be skipped. """ snapshotIds: [Int]! ): Affected """ Switches accessible snapshots between uploaded page camera captures and automatic screenshots, returning only changed IDs. This changes the capture mode without requesting a new capture; use `refreshSnapshots` for automatic recapture. Requires snapshot edit access. """ togglePageCamera( """ Snapshot IDs from `snapshotsList` or `snapshots`; inaccessible or ineligible snapshots may be skipped. """ snapshotIds: [Int]! "True selects user-uploaded page camera captures; false selects automatic screenshots." isPageCamera: Boolean! ): Affected """ Requests exports for snapshots with data and no screenshot error, returning accepted snapshot IDs. Use `snapshotExports` to retrieve download URLs; an empty result means none qualify, and `destinationEmail` requests email delivery. Requires CSV export access, plus JSON export access when `views` includes `AI`. """ exportSnapshots( "Non-empty export view list; `AI` requires JSON export access in addition to CSV export access." views: [SnapshotExportView]! "Export date in `YYYY-MM-DD` format, for example `2026-10-20`." date: String! """ Snapshot IDs from `snapshotsList` or `snapshots`; inaccessible or ineligible snapshots may be skipped. """ snapshotIds: [Int]! "Optional email address that receives the finished export." destinationEmail: String """ Snapshot to export side by side with the single snapshot in `snapshotIds`, as the report's compare mode does. Only `HEATMAP`, `SCROLLMAP` and `CONFETTI` views are drawn for a comparison. """ compareSnapshotId: Int """ JSON object of report filters to apply to the export, as the report's event filter builds them, for example `{"beginTime":1790000000,"endTime":1790600000}`. Omit it to export all data. """ filter: String ): Affected """ Sets only the auto-export cadence and recipients on several snapshots, leaving their other settings alone, and returns the changed IDs or validation errors. Snapshots the session cannot edit are skipped. Turning auto-export on or changing its recipients requires the `autoExport` snapshots permission; AI-origin requests can only turn it off. Requires snapshot edit access. """ updateSnapshotsAutoExport( "Snapshot IDs from `snapshotsList` or `snapshots`." snapshotIds: [Int!]! """ Cadence for every snapshot; null turns auto-export off and omission keeps each stored cadence. A new cadence restarts the schedule. """ autoExport: SnapshotAutoExport """ Replacement list of up to 10 addresses for every snapshot; omission keeps each stored list. AI-origin requests must omit it. """ autoExportEmails: [String!] ): UpdateSnapshotsAutoExportResults """ Renames one editable snapshot and refreshes the tracking script, returning the saved record. Named matching rules are synchronized with the new name; use `updateSnapshot` for other settings or `snapshot` for derived fields and permissions. Requires snapshot edit access. """ renameSnapshot( "Snapshot ID and new name; use this instead of `updateSnapshot` when only renaming." snapshot: SnapshotRenameParams! ): Snapshot """ Updates the settings of one editable snapshot and refreshes the tracking script, returning its ID and name or validation errors. Send every setting, starting from the values `snapshot` returns: an omitted `name` or `reoccurring` is reset. Start and expiration changes are ignored without the matching `permissions` flags; use `renameSnapshot` to change only the name. Requires snapshot edit access. """ updateSnapshot( "Snapshot ID from `snapshotsList`, `snapshots`, or `createSnapshots`." id: Int! "Settings to apply; required option/value pairs must be supplied even when disabled." params: UpdateSnapshotParams! ): UpdateSnapshotResults """ Creates one snapshot per URL/device item using shared settings, returning IDs and names. Validation failures prevent the entire batch and return indexed errors; successful creation may create sites and refreshes the tracking script. Use `duplicateSnapshots` to copy existing settings. Requires snapshot edit access. """ createSnapshots( "Non-empty list of URL/device captures; create a separate item for each screenshot device." params: [CreateSnapshotsParams!]! "Shared settings applied to every item in `params`." settings: CreateSnapshotsSettings! ): CreateSnapshotsResults """ Deletes the signed-in account holder's account after confirming `delete: "delete"` and the viewer ID from `me.guestId`. Cancels subscriptions, removes sites and invitations, and queues a confirmation email naming a final deletion date 28 days later. Only the account holder can delete, and only while the plan is free or the subscription is cancelling, cancelled, or expired; `cancelSubscription` keeps the account. Requires account delete access. """ deleteAccount( "Exact confirmation string `delete`." delete: String! "Signed-in viewer ID from `me.guestId`; it must match the current viewer." userId: Int! ): Boolean """ Updates the signed-in viewer display name and returns the refreshed `me` profile. This changes the viewer even when they are using another account. Requires authentication. """ updateUserName("Nonblank display name for the signed-in viewer." name: String!): MeDetails """ Stores the signed-in viewer preferred language and returns the refreshed `me` profile. Use `updateUserName` to change the display name separately. Requires authentication. """ updatePreferredLanguage( """ Language `code` from the `languages` query, such as `en`; any nonblank string is stored without checking that list. """ language: String! ): MeDetails """ Updates the account's tracking preferences, or one site's tracking settings when `siteId` is supplied, and returns the `me` profile. Omitted settings stay unchanged. Account-level updates regenerate the tracking script; read site-level values from `settings` on `sites`. Requires tracking options edit access. """ updateUserSettings( "Site ID from `sites`; omit to update account preferences instead of site settings." siteId: Int "When true, visitors are tracked even if their browser sends Do Not Track; omitted keeps the saved value." dnt: Boolean """ When true, an email address entered in a form or survey becomes the visitor profile ID; omitted keeps the saved value. """ autoIdentity: Boolean "Supported currency code for tracked monetary values, such as `USD`; normalized to uppercase." defaultCurrency: String """ When true, Crazy Egg visits the site with the `Crazy Egg Bot` user agent instead of a common browser user agent; omitted keeps the saved value. """ explicitAgent: Boolean """ When true, Crazy Egg cookies get the Secure attribute and are sent only over HTTPS; omitted keeps the saved value. """ useSecureCookies: Boolean ): MeDetails """ Updates the active account's onboarding progress and returns the viewer profile. Before onboarding has started, include `startedAt` or `completedAt` or nothing is saved; omitted fields otherwise stay unchanged. Requires installation view access. """ upsertUserOnboarding( """ Onboarding start time in Unix seconds; null clears it. Supply a timestamp field when onboarding has not started. """ startedAt: Int """ Onboarding completion time in Unix seconds; null clears it. Supply a timestamp field when onboarding has not started. """ completedAt: Int "Onboarding flow string; omitted keeps the saved value." flow: String "Onboarding site URL string; omitted keeps the saved value." siteUrl: String "Onboarding site technology string; omitted keeps the saved value." siteTech: String ): MeDetails """ Replaces both active account API credentials and returns the new key, secret, and signature. Previously issued credentials stop working; use `api` to retrieve credentials without replacing them. Requires API edit access. """ regenerateUserApiCredentials: ApiKeys """ Clears both active account API credentials and returns `true` on success. A later call to `api` creates credentials again; use `regenerateUserApiCredentials` to replace them in one call. Requires API edit access. """ disableUserApiCredentials: Boolean """ Soft-deletes the given recordings on an editable site so they no longer appear in recordings queries, and returns the deleted numeric ids in `affected`. Ids the caller cannot access are skipped, and a site the caller cannot edit returns an error. Requires recordings edit access. """ deleteRecordings( "Site id from `sites`; the site must be editable by the caller." site: Int! "Numeric recording ids from `recordingsList` or `recordingsIdsInGroup`; do not pass `hashedId` or `sessionId`." recordingIds: [Int!]! ): Affected """ Marks one recording as watched for the current user, refreshing the watch time if it was already watched. Always returns true, even when the recording is not found or nothing changed; use `watchRecordings` for an affected count. Requires recordings view access. """ watchRecording( "Numeric `id` from `recordingsList` or `recording`; do not pass `hashedId` or `sessionId`." recordingId: Int! ): Boolean """ Marks the given recordings as watched for the current user and returns how many watch markers were inserted or refreshed; existing markers get a new watch time and inaccessible ids are skipped. Returns null when the session cannot change watch state. Requires recordings view access. """ watchRecordings( "Numeric recording ids from `recordingsList` or `recordingsIdsInGroup`; do not pass `hashedId` or `sessionId`." recordingIds: [Int!]! ): Int """ Clears the current user's watch markers on the given recordings and returns how many were removed; the recordings themselves are unchanged. Returns null when the session cannot change watch state. Requires recordings view access. """ unwatchRecordings( "Numeric recording ids from `recordingsList` or `recordingsIdsInGroup`; do not pass `hashedId` or `sessionId`." recordingIds: [Int!]! ): Int """ Adds normalized tags to the accessible recordings and returns one entry per normalized tag with the count of recordings changed. Tags are lowercased, trimmed, truncated to 50 characters, and de-duplicated; existing tags are not duplicated. Returns null when the session cannot change tags. Requires recordings edit access. """ addTagsToRecordings( "Numeric recording ids from `recordingsList` or `recordingsIdsInGroup`; do not pass `hashedId` or `sessionId`." recordingIds: [Int!]! "Tag names; each is lowercased, trimmed, and truncated to 50 characters, and duplicates are dropped." tags: [String!]! ): [TagAndCount!] """ Removes normalized tags from accessible recordings and returns one entry per normalized tag with the count of recordings that lost it. Uses the same normalization as `addTagsToRecordings` and returns null when the session cannot change tags. Requires recordings edit access. """ removeTagsFromRecordings( "Numeric recording ids from `recordingsList` or `recordingsIdsInGroup`; do not pass `hashedId` or `sessionId`." recordingIds: [Int!]! "Tag names; each is lowercased, trimmed, and truncated to 50 characters, and duplicates are dropped." tags: [String!]! ): [TagAndCount!] """ Creates a custom playlist when `playlist.id` is omitted or null, or updates an existing custom playlist for the site. The filter is a non-empty recordings filter, and a new playlist also needs a name; duplicate names may receive a copy suffix. Use `updatePlaylistName` to rename without resubmitting a filter. Requires recordings edit access. """ savePlaylist( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! "Custom playlist parameters; omit `id` to create, or provide an existing custom id to update." playlist: PlaylistParams! ): Playlist """ Renames an existing custom playlist for the site and returns the stored name. Duplicate names may receive a copy suffix; use `savePlaylist` to change the filter as well. Requires recordings edit access. """ updatePlaylistName( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! "Positive custom playlist `id` from `playlistsList` for this site; recommended ids are not accepted." playlist: Int! "Non-blank playlist name, at most 255 characters; a collision may append a copy suffix." name: String! ): String """ Records a custom or recommended playlist as used now by the current user, which moves it to the front of `playlistsMostRecent`; the playlist itself is unchanged. Returns true on success and an error when the playlist does not exist for the site. Requires recordings view access. """ markPlaylistAsUsed( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! "Custom or recommended playlist `id` from `playlistsList` for this site; recommended ids are negative." playlist: Int! ): Boolean """ Deletes a custom site playlist and its usage history, returning true on success. Recommended ids return a not-found error; recordings matched by the filter are not deleted. Requires recordings edit access. """ deletePlaylist( "Site id from `sites`; the site must be accessible to the current viewer." site: Int! "Positive custom playlist `id` from `playlistsList` for this site; recommended ids are not accepted." playlist: Int! ): Boolean """ Adds team members and returns their roster rows in submitted email order after deduplication. Existing Crazy Egg users, and new users when SAML SSO is enabled, join immediately; anyone else gets a pending invitation that expires after 30 days. Sends an invitation email to every address. Requires team settings edit access. """ createAccountUsers( """ Nonempty list of invitee email addresses; whitespace is trimmed and duplicates are ignored case-insensitively. Existing members or invitations are rejected. """ emails: [String!]! """ Role to assign; `ACCOUNT_HOLDER` is treated as `OWNER` without transferring account ownership. Only an owner can assign `OWNER`. """ role: AccountUsersRole! """ Site names from `sites`, not numeric IDs; must be nonempty when `specificSites` is true. Owners ignore this list. """ sites: [String!]! """ Whether to restrict access to the listed `sites`; false grants access to all sites. Ignored for owners, who always have access to all sites. """ specificSites: Boolean! ): [AccountTeamMember!]! """ Removes members or pending invitations from the active account and returns the submitted IDs. Use rows from `accountUsers` whose `canDelete` is true; the account holder and the caller cannot be removed. Removal revokes account access but does not delete the user's own Crazy Egg login. Requires team settings edit access. """ deleteAccountUsers( """ Unique member (`ua_`) or invitation (`i_`) IDs from `accountUsers`; the whole call fails if any row is gone or not deletable. """ ids: [String!]! ): [String!]! """ Updates the role and site access of members or pending invitations and returns their roster rows in the order of `ids`. Send `role`, `specificSites`, and `sites` on every call: omitting `specificSites` resets access to all sites. Owners always have access to all sites. Requires team settings edit access. """ updateAccountUsers( "Member (`ua_`) or invitation (`i_`) IDs from `accountUsers` whose `canUpdate` is true." ids: [String!]! """ Role to assign; send it on every call, even when unchanged. `ACCOUNT_HOLDER` is treated as `OWNER` without transferring account ownership. """ role: AccountUsersRole """ Site names from `sites`, not numeric IDs; must be nonempty when `specificSites` is true. Owners ignore this list. """ sites: [String] """ Whether to restrict access to the listed `sites`; false, null, or omitted resets access to all sites. Ignored for owners. """ specificSites: Boolean ): [AccountTeamMember!]! """ Queues the invitation email again for a pending invitation and returns its ID. A successful resend restarts the 30-day acceptance window; use `createAccountUsers` to add a new member. Requires team settings edit access. """ resendInvitationEmail("Pending invitation ID from `accountUsers`, with the `i_` prefix." id: String!): String! """ Marks release entries as seen by the current guest, leaving existing views unchanged. Returns true if any new view was saved, or false if none was inserted. Use this before `changelogReaction` to establish view state. Requires a logged-in session. """ viewChangelogEvents( "Release entry IDs from `changelog`, supplied as integers; existing guest views are preserved." ids: [Int!]! ): Boolean """ Updates the current guest's reaction on an already viewed release entry and returns that view state. Call `viewChangelogEvents` first; a missing view cannot be created by this operation. Requires a logged-in session. """ changelogReaction( "Release entry ID from `changelog`, supplied as an integer; must already have been marked seen." eventId: Int! "Reaction string saved on the current guest's view; no enum allow-list is enforced." reaction: String! ): ChangelogView! """ Creates or updates the active account's SAML SSO settings. When the request leaves SSO enabled and changes the provider settings, `enabled`, or `required`, nothing is saved yet: `needsValidation` is true, and the user's browser must POST `validationToken` as the `validation_token` form field to `validationUrl` and finish an identity provider sign-in within five minutes, which saves the returned proposal. Otherwise the settings are saved immediately. Requires SSO edit access. """ saveSsoSettings( """ Whether SAML SSO is enabled; false also forces `required` to false. Enabling requires all identity provider fields. """ enabled: Boolean! """ Whether team members must sign in through SAML SSO; false also allows other login methods. Saved as false when `enabled` is false. """ required: Boolean! """ Service provider settings matching the identity provider setup; preserve the ID using `ssoSettings.spConfiguration.entityId` as `entityId`. """ spConfiguration: SsoSpConfigurationInput! """ Identity provider settings; all fields must be nonblank when `enabled` is true. Send the saved values from `ssoSettings` when disabling SSO. """ idpConfiguration: SsoIdpConfigurationInput! """ Email domain only, such as `example.com`; a new domain must belong to one of the account's sites that has received tracking data. Omission clears it. """ emailDomain: String "Organization display name; whitespace is trimmed and omission clears it." organizationName: String """ Ordered, nonempty rules; the first match applies after membership and invitation checks. End with one `ANYONE` condition; omit to preserve saved rules. """ provisioningRules: [SsoProvisioningRuleInput!] ): SaveSsoSettingsResult! """ Validates a page URL before `abTestCreate` or `abTestUpdate` and returns the site for its domain, the devices, and site information; it does not save a test. `INITIAL` never creates a site, while `TRANSITION` and `EDITOR_DONE` create a missing site for the domain and regenerate the tracking script. Check `errors` first, then use the returned `siteId` as the test's `siteId`. Requires A/B testing edit access. """ abTestCheckPage( "Target page URL; whitespace is trimmed and a missing HTTP scheme is added." url: String! "Validation stage: INITIAL avoids site creation; TRANSITION and EDITOR_DONE allow it." checkType: AbTestCheckPageType! ): AbTestCheckPageResult! """ Creates a DRAFT test; start it with `abTestPublish`. Runs the `abTestCheckPage` page check, which can create a missing site for the URL's domain, and requires `devices` to match the audience. The first variant becomes the control, `patchStrategy` defaults to `async`, and screenshots of every variant are queued after saving. Use `abTestsCreate` for several tests. Requires A/B testing create access. """ abTestCreate( "Settings for a new draft; name and a nonempty device set matching the effective audience are required." args: AbTestCreateInput! ): AbTest! """ Replaces the settings and saved `draft` of a DRAFT test; other statuses return an error and change nothing. Re-runs the page check, which can create a missing site, checks `devices` against the audience, and queues fresh screenshots of every variant. `variants` and `notes` in the input are not applied to the test; use the variant mutations and `abTestUpdateNotes`. Use `abTestUpdateDraft` to save wizard progress only. Requires A/B testing edit access. """ abTestUpdate( "Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int! "Draft settings; provide matching audience/devices and use variant mutations for later variant changes." args: AbTestCreateInput! ): AbTest! """ Saves wizard progress on a DRAFT test by replacing only its `draft` JSON; other statuses return an error. It skips the page check and applies neither settings nor the audience to the test, but `audienceDefinition` must be valid and `devices` must match it. Variants are dropped from the saved draft, and screenshots of every variant are queued. Use `abTestUpdate` to apply settings. Requires A/B testing edit access. """ abTestUpdateDraft( "Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int! "Replacement draft metadata; variants are discarded and stored test settings are not applied." args: AbTestCreateInput! ): AbTest! """ Saves settings, notes, and all existing variants of a DRAFT test in one Core database transaction, using the normal audience validation and synchronization. Re-runs the page check and validates supplied patches before committing. Include every stored variant exactly once with its numeric id, keeping the control first; this operation cannot add or remove variants. Non-drafts are rejected under a row lock. Requires A/B testing edit access. Does not publish. """ abTestSaveDraft( "Existing draft test id from abTestEditorDetail or abTestCreate." id: Int! "Complete draft settings and every existing variant, including its id and intended patch or redirect." args: AbTestCreateInput! ): AbTest! """ Sets one variant's `description` on a DRAFT, RUNNING, or STOPPED test without changing its patch, redirect, or weight; use `abTestUpdateVariants` for other variant changes. The response is the updated variant record, so request only `id`, which is the variant id. Requires A/B testing edit access. """ abTestUpdateVariantDescription( "Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int! "Numeric variant id from `abTestRefList` or `abTestEditorDetail.variants`; must belong to this test." variantId: Int! "Replacement descriptive text for the variant; this does not change its patch or redirect." description: String! ): AbTest! """ Replaces the `notes` of a DRAFT, RUNNING, or STOPPED test; `notes` sent in legacy create or update inputs only reach `draft`. Request only stored fields such as `id`, `name`, and `status` in the response. Requires A/B testing edit access. """ abTestUpdateNotes( "Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int! "Replacement notes for the test; an empty string clears the saved text." notes: String! ): AbTest! """ Creates several DRAFT tests by running `abTestCreate` on each input in order and returns them in reverse input order. It stops at the first failure and returns only that error while tests created before it stay saved, so check `abTestList` after an error. Requires A/B testing create access. """ abTestsCreate( "Draft inputs processed in order; earlier creates remain saved if a later input fails." abTests: [AbTestCreateInput!]! ): [AbTest!]! """ Publishes a test that was never published, normally a DRAFT: it becomes RUNNING and records the publish time and user. It needs at least two variants; PATCH tests re-validate every `editorPatch` and SPLIT tests need `redirectUrl` on each non-control variant. PATCH tests saved with `createSnapshots` also get one snapshot per variant and device. An already published test is returned unchanged, so this cannot restart a stopped test. Requires A/B testing edit access. """ abTestPublish("Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int!): AbTest! """ Stops a RUNNING test and records the stop time; other statuses return an error. Tests saved with `createSnapshots` also stop their per-variant snapshots. A stopped test cannot be restarted (`abTestDuplicate` copies it into a new draft), and stopping it again returns it unchanged when it has no per-variant snapshots. Requires A/B testing edit access. """ abTestStop("Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int!): AbTest! """ Soft-deletes a test in any status, hiding it from lists and detail queries; its variants are kept. Tests saved with `createSnapshots` also stop their per-variant snapshots. Deleting an already deleted test without per-variant snapshots returns it unchanged. Request only stored fields such as `id`, `name`, and `status` in the response. Requires A/B testing edit access. """ abTestDelete("Test id from `abTestList` or `abTestCreate`; already deleted ids are also accepted." id: Int!): AbTest! """ Sets the primary goal of a DRAFT or RUNNING test; the goal must belong to the test's site and have triggers. Passing the current goal returns the test unchanged in any status. Use `abTestResultCounts` to view results for another goal without changing the test. Request only stored fields such as `id`, `name`, and `status` in the response. Requires A/B testing edit access. """ abTestChangeGoal( "Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int! "Goal id from `goalRefList` for the test site; a new goal must already have triggers." goalId: Int! ): AbTest! """ Renames a DRAFT, RUNNING, or STOPPED test; the saved `draft` and generated variant names are unchanged. Request only stored fields such as `id`, `name`, and `status` in the response. Requires A/B testing edit access. """ abTestRename( "Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int! "Replacement test name; saved draft metadata and generated variant names are not changed." name: String! ): AbTest! """ Appends variants to a DRAFT or RUNNING test; use `abTestUpdateVariants` to edit existing ones. On PATCH tests each new non-control variant needs a valid `editorPatch`. Screenshots of the new variants are queued, and RUNNING PATCH tests saved with `createSnapshots` also get per-variant snapshots. Requires A/B testing create access. """ abTestAddVariants( "Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int! "New variants appended in input order; the first variant of a test is assigned CONTROL, later ones VARIANT." variants: [AbTestVariantInput!]! ): AbTest! """ Updates variants of a DRAFT or RUNNING test, matched by `id`; ids that are not variants of this test are skipped. Use `abTestAddVariants` to append variants. A supplied `editorPatch` is validated, an omitted `weight` is cleared, and screenshots and per-variant snapshots of the updated variants are recaptured. Requires A/B testing edit access. """ abTestUpdateVariants( "Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int! """ Each entry needs the `id` of a variant of this test, from `abTestEditorDetail` or `abTestRefList`; entries with other ids are skipped. """ variants: [AbTestVariantInput!]! ): AbTest! """ Retires a non-control variant of a DRAFT or RUNNING test, keeping the variant and its results; tests saved with `createSnapshots` also stop that variant's snapshots. Use `abTestDeleteVariant` to remove a variant from a DRAFT instead. Without per-variant snapshots, retiring an already retired variant or one on a STOPPED test returns the test unchanged. Request only stored fields such as `id`, `name`, and `status` in the response. Requires A/B testing edit access. """ abTestRetireVariant( "Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int! "Numeric variant id from `abTestRefList` or `abTestEditorDetail.variants`; must belong to this test." variantId: Int! ): AbTest! """ Permanently removes a variant from a DRAFT test; other statuses return an error. Use `abTestRetireVariant` on DRAFT or RUNNING tests to keep the variant and its results. Request only stored fields such as `id`, `name`, and `status` in the response. Requires A/B testing edit access. """ abTestDeleteVariant( "Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int! "Numeric variant id from `abTestRefList` or `abTestEditorDetail.variants`; must belong to this test." variantId: Int! ): AbTest! """ Sets `autoReweight` and manual traffic weights for the listed variants in any status and returns the test with refreshed metrics. Weights are percentages stored to one decimal place and are not checked to total 100; variants left out keep their weights. Pass an empty `variants` list to change only `autoReweight`. Requires A/B testing edit access. """ abTestSetTrafficSplit( "Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int! "Whether automatic traffic reweighting is enabled; supplied manual weights are saved either way." autoReweight: Boolean! """ Existing variant ids and traffic percentages; omitted variants keep their weights and totals are not validated. """ variants: [AbTestVariantWeightInput!]! ): AbTest! """ Clones a test and its variants into a new draft named as a duplicate, assigns fresh results tracking ids, and returns only the new test id. Requires A/B testing create access. """ abTestDuplicate("Test id from `abTestList`, `abTestRefList`, or `abTestCreate`." id: Int!): AbTestMutationResult! """ Creates a pending site-data export request for a UTC-midnight window of at most 90 days. Generation runs asynchronously and a completion notification is attempted at `notificationEmail`; use `aiExport` to check status and obtain the completed download. Requires a logged-in session, export availability, site access, and view access to every selected feature; web analytics must be within available history. Export availability requires JSON export access or the export-everything override. At most three AI Export requests may be created per account in a rolling 24-hour window across all sites and team members. Accepted requests count regardless of generation status; worker retries do not consume another request. Exceeding the limit returns RATE_LIMITED with an extensions.retry_at UTC timestamp for the next available request. """ createAiExport( "Site, UTC-midnight window, distinct supported features, and completion-notification email." input: AiExportInput! ): AiExport """ Starts connecting a Meta ad account to a site and returns the Meta authorization URL. This call creates nothing: a user must open the URL in a browser and approve access, after which Crazy Egg creates the connection and sends the browser to `returnUrl`. Requires Ad Performance edit access. """ initializeMetaAdsConnection( "Accessible site id from `sites`." siteId: Int! "Where the browser returns after authorization: a path starting with `/` or an http(s) Crazy Egg URL." returnUrl: String! ): InitializeMetaAdsConnectionResult """ Starts connecting a Reddit ad account to a site and returns the Reddit authorization URL. This call creates nothing: a user must open the URL in a browser and approve access, after which Crazy Egg creates the connection and sends the browser to `returnUrl`. Requires Ad Performance edit access. """ initializeRedditAdsConnection( "Accessible site id from `sites`." siteId: Int! "Where the browser returns after authorization: a path starting with `/` or an http(s) Crazy Egg URL." returnUrl: String! ): InitializeMetaAdsConnectionResult """ Permanently deletes an ad connection and all ad data imported through it, returning its id and provider. Errors when the connection is not on the site; find ids with `adPerformanceHeader`. Requires Ad Performance edit access. """ deleteAdPlatformConnection( "Accessible site id from `sites`." siteId: Int! "Crazy Egg connection id from `adPerformanceHeader` or `adsLibraryPreviewHeader` for the selected site." connectionId: Int! ): DeleteAdPlatformConnectionResult """ Creates a goal on a site and returns only its id; fetch the full goal with `goalDetail`. Every trigger filter is validated before anything is saved, so one invalid filter creates nothing. On success the account's tracking script is marked for regeneration and a page screenshot for the goal thumbnail is requested in the background. Requires goal create access. """ goalCreate("Site, name, and triggers of the new goal." params: GoalCreateParams!): GoalMutationResult! """ Replaces the trigger set and labels of a non-deleted goal, and its name when given, and returns only its id; use `goalRename` to change only the name. Every filter is validated before anything is saved. Triggers sent with an `id` are updated, triggers without one are created, and existing triggers left out are soft-deleted. On success the tracking script is marked for regeneration and a new thumbnail screenshot is requested. Requires goal edit access. """ goalEdit("Goal id and its complete new trigger list." params: GoalEditParams!): GoalMutationResult! """ Renames a non-deleted goal without touching its triggers and returns only its id. The name is trimmed and must then be 1 to 255 characters. Requires goal edit access. """ goalRename( "Goal id from `goalRefList` or `goalCardList`." id: Int! "New goal name; trimmed, then 1 to 255 characters." name: String! ): GoalMutationResult! """ Soft-deletes a non-deleted goal and returns its id; `goalRef` and `goalLinked` still resolve it afterward. Also soft-deletes its triggers, detaches draft A/B tests that use it, deletes its other A/B tests and the funnels that use it, removes its notifications, and marks the tracking script for regeneration. Requires goal edit access. """ goalDelete("Goal id from `goalRefList` or `goalCardList`." id: Int!): GoalMutationResult! """ Updates an existing site's fingerprint workflow status and/or appends a note, returning the saved status. Use the fingerprint MD5 from `uniqueErrorList`, not an occurrence UUID; missing summaries return an error. Records the acting guest and current time and appends history in the same transaction; omitted status preserves the existing status. Requires errors edit access. """ updateError( "Site ID from `sites` containing the fingerprint." site: Int! "Fingerprint, optional target status, and optional note for this workflow update." errorStatus: ErrorStatusParams! ): UpdateErrorResponse """ Creates a survey or CTA and returns its UUID and preview token. Send `active: false` to save an unpublished draft, then call `addonDraftPublish` to publish it; `addonContentContract` describes `content`. Content and audience are saved together. Requires survey create access or CTA create access matching the type. """ addonCreate( "Site ID from sites." siteId: Int! "Validate content against addonContentContract before creating it. AI sessions always validate." validateContent: Boolean "Content, name, type, and initial activation state for the new add-on." addon: AddonCreateParams! ): AddonMutationResponse! """ Changes activation of an existing add-on and returns the resulting boolean. Enabling requires prior publication through `addonDraftPublish`; this does not publish pending draft edits. Marks a linked suggestion used and refreshes the tracking script. Requires survey edit access or CTA edit access matching the add-on type. """ addonEnabled( "Site ID from sites." siteId: Int! "Add-on UUID from addonList or addonDetail." id: String! "True to enable a previously published add-on; false to disable delivery." status: Boolean! ): Boolean! """ Soft-deletes an existing add-on and its attached audiences, returning its UUID. Clears related notifications and refreshes the tracking script. Requires survey edit access or CTA edit access matching the add-on type. """ addonDelete( "Site ID from sites." siteId: Int! "Add-on UUID from addonList or addonDetail." id: String! ): String! """ Updates an existing survey or CTA and returns a preview token; use the draft fields for unpublished edits to a published add-on, then `addonDraftPublish`. Site changes are rejected after publication. Returns `status: DELETED` when the record was already soft-deleted. Requires survey edit access or CTA edit access matching the add-on type. """ addonEdit( "Add-on UUID, destination site, and fields to update; omitted fields remain unchanged." addon: AddonEditParams! ): AddonMutationResponse! """ Publishes and enables the add-on, applying saved draft content and audience together for an already published record. First publication uses current content and primary audience; draft fields are cleared. Refreshes the tracking script after saving; regeneration failure can be reported after publication succeeds. Requires survey edit access or CTA edit access matching the add-on type. """ addonDraftPublish( "Add-on UUID from addonList or addonDetail." id: String! "Owning site ID from addonDetail; must match the add-on." siteId: Int! ): AddonMutationResponse! """ Clears saved draft name, content, and audience together for a previously published add-on. Leaves its current published content and activation state in place. Requires survey edit access or CTA edit access matching the add-on type. """ addonDraftDiscard( "Add-on UUID from addonList or addonDetail." id: String! "Owning site ID from addonDetail; must match the add-on." siteId: Int! ): AddonMutationResponse! """ Creates a reusable survey or CTA template rather than a site add-on. Templates cannot contain nonempty audience targeting or activation URLs; an uploaded thumbnail is stored before saving. Requires add-on template management access. """ addonTemplateCreate( "Reusable content and catalog metadata; use addonCreate to create a site add-on." template: AddonTemplateCreateParams! "Optional thumbnail file upload." thumbnail: Upload ): AddonTemplate! """ Updates a reusable template by ID without changing its type. Templates cannot contain nonempty audience targeting or activation URLs; an optional upload replaces the thumbnail. Requires add-on template management access. """ addonTemplateEdit( "Template ID from addonTemplatesList plus replacement content and catalog metadata." template: AddonTemplateEditParams! "Optional replacement thumbnail upload; omit to retain the current thumbnail." thumbnail: Upload ): AddonTemplate! """ Permanently deletes a template and returns its integer ID. Use addonDelete to soft-delete a site add-on instead. Requires add-on template management access. """ addonTemplateDelete( "Template ID from addonTemplatesList or addonTemplateDetail." id: Int! ): AddonTemplateMutationResponse! """ Creates a Stripe customer session for an embedded pricing table. Returns `clientSecret: null` without contacting Stripe when the billing account has no linked Stripe customer; otherwise contacts Stripe to create the session. Use `createCustomCheckoutSession` for a hosted checkout URL. Requires authentication. """ createStripeCustomerSession: StripeCustomerSessionResult """ Creates a hosted Stripe checkout session and returns its URL; completing checkout purchases the plan. Contacts Stripe and can create or link the billing customer, but fails when Stripe already holds a live or unpaid subscription for it. Use `updateSubscriptionItems` to change an existing subscription or `createSubscription` to pay in-app. Requires billing change plan access. """ createCustomCheckoutSession( """ Stripe price ID from `pricingGrid` or a tier `stripeId` from `tieredPricingPlans`; not the numeric payment plan ID. """ planPriceId: String! "Optional referral string; currently ignored by this operation." promotekitReferral: String ): CustomCheckoutSessionResult """ Changes the plan through Stripe; picking the current price again reactivates a subscription that is set to cancel. Downgrades are scheduled for the period end; other changes can charge a prorated amount now or end a trial immediately. Returns a checkout URL when there is no paid subscription to change. Call `previewSubscriptionUpdate` first and confirm any returned client secret. Requires billing change plan access. """ updateSubscriptionItems( """ Stripe price ID from `pricingGrid` or a tier `stripeId` from `tieredPricingPlans`; not the numeric payment plan ID. """ planPriceId: String! """ Proration time in Unix seconds from `previewSubscriptionUpdate.prorationDate`; omit when the preview returns null. """ prorationDate: Int ): UpdateSubscriptionResult """ Starts an in-app Stripe subscription for the plan, or resumes or adjusts the existing one instead of creating a second subscription. Contacts Stripe and can create the customer, set `paymentMethodId` as its default card, or collect an outstanding invoice. New subscriptions have no trial and are charged immediately; confirm a returned `clientSecret` to finish payment. Use `createCustomCheckoutSession` for hosted checkout. Requires billing change plan access. """ createSubscription( """ Stripe price ID from `pricingGrid` or a tier `stripeId` from `tieredPricingPlans`; not the numeric payment plan ID. """ planPriceId: String! """ Stripe payment method ID from the client-side card form. Omit to reuse the customer's default card; required when the account has no Stripe customer yet. """ paymentMethodId: String "Optional referral string; currently ignored by this operation." promotekitReferral: String ): CreateSubscriptionResult """ Replaces the billing account's default card through Stripe and returns the refreshed card summary. Fails when the account has no Stripe customer; otherwise points an active subscription at the new card and detaches the previous card. Use `defaultPaymentMethod` to read the current summary. Requires authentication. """ setDefaultPaymentMethod( "Stripe payment method ID created by the payment client; replaces the billing account default card." paymentMethodId: String! ): SetDefaultPaymentMethodResult """ Switches the subscription to Free, or Free+ for Analytics and Growth plans, from the cancellation flow. Paid plans keep access until the period ends; trials switch immediately. Contacts Stripe and notifies support; fails without a subscription, and Enterprise plans must contact support. On a free plan, or one already cancelling, cancelled, or expired, it returns the status without changes. Use `cancelSubscription` to cancel permanently. Requires billing edit access. """ switchToFree( """ The customer's answer to the cancellation survey, sent to support as one line of at most 128 characters. """ reason: String ): CancelSubscriptionResult """ Cancels the subscription permanently from the cancellation flow: the account moves to the cancelled plan, not Free or Free+, and is kept rather than deleted. Paid plans keep access until the period ends; trials cancel immediately. Contacts Stripe and notifies support; fails without a subscription, and Enterprise plans must contact support. On a free plan, or one already cancelling, cancelled, or expired, it returns the status without changes. Use `switchToFree` to keep a free plan. Requires billing edit access. """ cancelSubscription( """ The customer's answer to the cancellation survey, sent to support as one line of at most 128 characters. """ reason: String ): CancelSubscriptionResult """ Creates a brand guidelines revision if `expectedRevision` matches the latest revision. Unchanged trimmed content returns the existing revision. Prefer `siteAssetRevisionCreate` with BRAND_GUIDELINES for new clients. Requires a logged-in session and site edit access. """ brandGuidelineRevisionCreate( "Site ID from `sites`." siteId: Int! """ The complete Markdown brand guidelines document, not a patch; trimmed, nonempty, at most 50,000 characters. Plain text, not JSON. """ content: String! """ Current revision from `brandGuideline`; use 0 before the first revision. A stale value returns a revision conflict. """ expectedRevision: Int! ): BrandGuideline! @deprecated(reason: "Use siteAssetRevisionCreate with type BRAND_GUIDELINES") """ Appends a brand guidelines revision when `expectedRevision` matches the latest revision; a mismatch returns a revision conflict naming the current revision. Unchanged trimmed content returns the existing revision. LOGO is rejected here. Returns an error when site assets are not enabled for the account. Requires a logged-in session and site edit access. """ siteAssetRevisionCreate( "Site ID from `sites`." siteId: Int! "Only BRAND_GUIDELINES is accepted; use the logo mutations for LOGO." type: SiteAssetType! """ The complete Markdown brand guidelines document, not a patch; trimmed, nonempty, at most 50,000 characters. """ content: String! """ Current revision from `siteAsset`; use 0 when no asset exists. A stale value returns a revision conflict. """ expectedRevision: Int! ): SiteAsset """ Uploads a PNG, JPEG, or WebP image and appends a LOGO revision referencing it. `expectedRevision` must match the current logo revision; a failed revision write removes the new upload. Requires site settings edit access and site edit access. """ siteAssetLogoUpload( "Site ID from `sites`." siteId: Int! "PNG, JPEG, or WebP upload, at most 5 MiB." image: Upload! """ Current revision from `siteAsset`; use 0 when no asset exists. A stale value returns a revision conflict. """ expectedRevision: Int! ): SiteAsset """ Appends a LOGO revision with an empty image reference, preserving history. `expectedRevision` must match the current logo revision; an already empty reference returns the existing revision. Requires site settings edit access and site edit access. """ siteAssetLogoRemove( "Site ID from `sites`." siteId: Int! """ Current revision from `siteAsset`; use 0 when no asset exists. A stale value returns a revision conflict. """ expectedRevision: Int! ): SiteAsset """ Soft-deletes survey response groups and their answers, returning the response-group ID of every affected answer row, so IDs can repeat. Deleting already deleted responses succeeds again; an error is returned when nothing matches. Requires survey edit access. """ surveyResponseDelete( "Survey UUID from addonList with type SURVEY." surveyId: ID! """ Response-group IDs from surveyResponseList.responses.id or surveyResponses.response.id; provide a nonempty list. """ responseGroupIds: [ID!] ): [ID!] """ Marks an editable snapshot for processing after page camera screenshot and element uploads, returning null on success. The capture must be waiting for user files unless `recapture` is true; use `refreshSnapshots` for automatic captures. Requires snapshot edit access. """ pageCameraSetScreenshotStatus( "Editable snapshot ID from `pageCameraSnapshots` or `snapshotsList` whose files have been uploaded." snapshotId: Int! """ Always pass it: `false` for a capture waiting for its first upload, `true` to reprocess regardless of the current screenshot status. Omitting it fails the request. """ recapture: Boolean ): String """ Gives a user manager access to the site of a page or version in the caller's account and returns their updated permissions. Creates the site and adds the user to the account as a manager when missing, then emails the user an access link. Requires account owner access. """ pageEditorGiveAccess( "Version UUID from `pageEditorGetEditor`; required unless `pageId` is supplied and takes precedence over it." versionId: String "Page UUID from `pageEditorCreatePage` or `pageEditorGetEditor`; required unless `versionId` is supplied." pageId: String "Id of the existing Crazy Egg user to give access." userId: Int! "Set when the caller is the Electron desktop editor; passed along with the email. Defaults to false." isElectron: Boolean "Optional redirect value passed along with the email." redirect: String ): PageEditorListPermissionsMeta! """ Publishes a saved version and unpublishes the page's other published versions with an equivalent `segment`. Assigns an unowned editor to the caller, marks the tracking script for an update, and returns all versions of the page oldest first. Fails when the editor owner's account cannot edit the page's site. Requires a logged-in user who owns the editor or can edit the page's site. """ publishVersion( "Version UUID from `pageEditorGetEditor` or `pageEditorCreateVersion`." versionId: String! ): [PageVersionResponse!] """ Unpublishes a saved version and marks the tracking script for an update. Returns all versions of the page oldest first, or null when the editor owner's account cannot edit the page's site. Requires a logged-in user who owns the editor or can edit the page's site. """ unpublishVersion( "Version UUID from `pageEditorGetEditor` or `pageEditorCreateVersion`." versionId: String! ): [PageVersionResponse!] """ Permanently deletes a version and returns true, or returns false without deleting when the editor owner's account cannot edit the page's site. Marks the tracking script for an update when the version was published; use `unpublishVersion` to keep the version. Requires a logged-in user who owns the editor or can edit the page's site. """ pageEditorDeleteVersion( "Version UUID from `pageEditorGetEditor` or `pageEditorCreateVersion`." versionId: String! ): Boolean """ Checks whether the caller can publish a page or version and returns the editor owner id with the outcome. Assigns an unowned editor to the caller, and emails the editor owner an access request when the caller cannot publish. Requires page editor navigation access. """ pageEditorCheckPermissions( "Version UUID from `pageEditorGetEditor`; required unless `pageId` is supplied and takes precedence over it." versionId: String "Page UUID from `pageEditorCreatePage` or `pageEditorGetEditor`; required unless `versionId` is supplied." pageId: String "Set when the caller is the Electron desktop editor; passed along with any email. Defaults to false." isElectron: Boolean "Optional redirect value passed along with any email." redirect: String ): PageEditorCheckPermissionsResponse! """ Checks whether a given user can publish a page or version, assigning an unowned editor to that user. Emails the editor owner an access request when the user cannot publish, or sends the user a validation email when they can and the caller is not signed in. Requires a page editor token for the editor, or a logged-in user who owns the editor or can edit the site of the page or version. """ pageEditorValidateUser( "Version UUID from `pageEditorGetEditor`; required unless `pageId` is supplied and takes precedence over it." versionId: String "Page UUID from `pageEditorCreatePage` or `pageEditorGetEditor`; required unless `versionId` is supplied." pageId: String "Id of the user whose publishing access is checked." userId: Int! "Set when the caller is the Electron desktop editor; passed along with any email. Defaults to false." isElectron: Boolean "Optional redirect value passed along with any email." redirect: String ): PageEditorValidateUserResponse! """ Downloads each image URL into the image library of the page's site, creating the site when missing, and returns the stored images with public URLs in input order. Stops at the first failed download or upload; images stored before it remain. Requires a logged-in user who owns the editor or can edit the page's site. """ pageEditorImageUploadUrls( "Publicly reachable image URLs to download, at most 25 MiB each." images: [String!] "Page UUID from `pageEditorCreatePage` or `pageEditorGetEditor`." pageId: String! ): [Image!] """ Replaces a page's saved editor history string and returns true, or false when the page does not exist. History is separate from saved versions; use `pageEditorCreateVersion` to save changes. Requires a page editor token for the editor, or a logged-in user who owns the editor or can edit the page's site. """ pageEditorUpdateHistory( "Page UUID from `pageEditorCreatePage` or `pageEditorGetEditor`." pageId: String! "Opaque editor history string, stored as given and returned as `history` by `pageEditorGetEditor`." history: String! ): Boolean """ Saves a new unpublished version of a page and returns its UUID with thumbnail upload details. Publish it with `publishVersion`; use `pageEditorUpdateVersion` to change a saved version. Requires a page editor token for the editor, or a logged-in user who owns the editor or can edit the page's site. """ pageEditorCreateVersion( "Page UUID from `pageEditorCreatePage` or `pageEditorGetEditor`." pageId: String! """ JSON-encoded string, stored without validation, in the A/B test `editorPatch` format of the `ab-test-variant-patches` skill: a `default` array of one-change transforms plus optional `style` and `script`. Example: {"default":[{"target":"h1","text":"New headline","finalSelectors":["h1"]}]} """ patch: String! """ JSON-encoded audience definition in the `audienceDefinitionContract` format, stored without validation; omit to store null. Example: {"version":1,"operator":"and","conditions":[]} """ segment: String "Optional version name; omit to store null." name: String ): PageEditorUpdateVersionResponse! """ Overwrites a saved version's `patch`, `segment`, and `name`; omitted `segment` or `name` are cleared. Returns the version UUID with thumbnail upload details and does not change publication. Requires a page editor token for the editor, or a logged-in user who owns the editor or can edit the version's site. """ pageEditorUpdateVersion( "Version UUID from `pageEditorGetEditor` or `pageEditorCreateVersion`." id: String! """ JSON-encoded string, stored without validation, in the A/B test `editorPatch` format of the `ab-test-variant-patches` skill: a `default` array of one-change transforms plus optional `style` and `script`. Example: {"default":[{"target":"h1","text":"New headline","finalSelectors":["h1"]}]} """ patch: String! """ JSON-encoded audience definition in the `audienceDefinitionContract` format, stored without validation; omit to clear it. Example: {"version":1,"operator":"and","conditions":[]} """ segment: String "Version name; omit to clear it." name: String ): PageEditorUpdateVersionResponse! """ Adds a page to an existing editor, or creates a new editor for it when `editorId` is omitted. Returns the editor and page UUIDs, a page editor token for the editor, and thumbnail upload details. Requires a page editor token or a logged-in user; with `editorId`, a token for that editor or a logged-in user who owns it or can edit the site of one of its pages. """ pageEditorCreatePage( "Editor UUID from `pageEditorCreatePage` or `pageEditorLatest`; omit to create a new editor." editorId: String "URL of the page to edit, stored as given; its domain selects the site for publishing." url: String! ): PageEditorCreatePageResponse! """ Overwrites the brand guideline settings an editor stores for one site and returns true; read the current object from `pageEditorGetBrandGuidelines` and save it whole. Built-in checks carry `id`, `name`, `note`, `updatedBy`, `condition`, `definition`, `example`, `testContent`, `enabled`, and `default`; voices carry `id`, `name`, `updatedBy`, `color`, `definition`, `sample`, and `enabled`. Requires a page editor token for the editor, or a logged-in user who owns the editor or can edit the site. """ pageEditorSaveBrandGuidelines( "Editor UUID from `pageEditorCreatePage` or `pageEditorLatest`." editorId: String! "Site hostname such as `www.example.com`; settings are stored per registrable domain (`example.com`)." site: String! """ JSON-encoded object with `checks`, `voices`, `voiceTestContent`, and `profile` (`context`, `audience`), shaped like `pageEditorGetBrandGuidelines` output; entries reusing a built-in `id` read back as the default. Example: {"checks":[],"voices":[],"profile":{"context":"","audience":""}} """ settings: String! ): Boolean """ Records that a check is ignored for an element on a page by adding the element to that check's list in the page's `ignoredChecks`, skipping duplicates, and returns true. Use `pageEditorRemoveIgnoreCheck` to undo it. Requires a page editor token for the editor, or a logged-in user who owns the editor or can edit the page's site. """ pageEditorIgnoreCheck( "Page UUID from `pageEditorCreatePage` or `pageEditorGetEditor`." pageId: String! "Element identifier to ignore the check for, stored as given." element: String! "Id of the check to ignore; used as the key in `ignoredChecks`." checkId: String! ): Boolean """ Removes an element from a check's list in the page's `ignoredChecks`, dropping the check key when its list becomes empty, and returns true. Pass only an element currently ignored for that check. Requires a page editor token for the editor, or a logged-in user who owns the editor or can edit the page's site. """ pageEditorRemoveIgnoreCheck( "Page UUID from `pageEditorCreatePage` or `pageEditorGetEditor`." pageId: String! "Element identifier previously passed to `pageEditorIgnoreCheck`." element: String! "Check id key in the page's `ignoredChecks`." checkId: String! ): Boolean """ Adds an element identifier to the page's `lockedElements`, skipping duplicates, and returns true. Use `pageEditorUnlockElement` to remove the lock. Requires a page editor token for the editor, or a logged-in user who owns the editor or can edit the page's site. """ pageEditorLockElement( "Page UUID from `pageEditorCreatePage` or `pageEditorGetEditor`." pageId: String! "Element identifier to lock, stored as given." element: String! ): Boolean """ Removes an element identifier from the page's `lockedElements` and returns true. Pass only an element that is currently locked. Requires a page editor token for the editor, or a logged-in user who owns the editor or can edit the page's site. """ pageEditorUnlockElement( "Page UUID from `pageEditorCreatePage` or `pageEditorGetEditor`." pageId: String! "Element identifier previously passed to `pageEditorLockElement`." element: String! ): Boolean """ Registers 1 to 25 URLs for Page Speed monitoring and requests a check for each successful page. Requires an editable site and enough account page allowance for the full input; individual URL failures return indexed errors alongside successes. Use `pageSpeedPageCreate` for a single URL. Successful payloads report refreshing with empty `runs`; read pages later for captures. Requires page speed edit access. """ pageSpeedPagesCreate( "Site ID from `sites`; the caller must be able to edit it." siteId: Int! """ From 1 to 25 page URLs; whitespace is trimmed and missing HTTP schemes are added. Requires account allowance for the full input. """ urls: [String!]! ): PageSpeedPagesMutationPayload! """ Registers a page and requests a manual check, returning its page ID with refreshing true and empty `runs`. Requires an editable site and remaining account page allowance; duplicate pages return an error with the existing page ID. Use `pageSpeedPageRefresh` for a registered page. Requires page speed edit access. """ pageSpeedPageCreate( "Site ID from `sites`; the caller must be able to edit it." siteId: Int! "Page URL; whitespace is trimmed and a missing HTTP scheme is added before resolution." url: String! ): PageSpeedPageMutationPayload! """ Requests a forced manual check for an enabled, non-deleted page and advances its next scheduled check. Returns the tracked page ID with refreshing true and empty `runs`; read `pageSpeedRuns` later for captures. Use `pageSpeedRunRetry` to request a check via an existing run. Requires page speed edit access and an editable site. """ pageSpeedPageRefresh( "Tracked page ID from `pageSpeedPages` or `pageSpeedPageCreate`; not a run ID." pageSpeedPageId: Int! ): PageSpeedPageMutationPayload! """ Requests a forced manual check for the page associated with an accessible run. Returns the original run ID, device, and trigger rather than a newly created run; read `pageSpeedRuns` for later captures. The run need not be failed, and this operation does not advance the page schedule. Requires page speed edit access and an editable site. """ pageSpeedRunRetry( "Existing run ID from `pageSpeedRuns`; not a tracked page ID. Any accessible run may be retried." pageSpeedRunId: Int! ): PageSpeedRunMutationPayload! """ Soft-deletes a tracked page and returns its ID. This removes it from page lists and future scheduled checks; existing capture data is retained. Requires page speed edit access and an editable site. """ pageSpeedPageDelete( "Tracked page ID from `pageSpeedPages` or `pageSpeedPageCreate`; not a run ID." pageSpeedPageId: Int! ): Affected """ Stores one multipart image upload and returns its metadata and public URL. Most raster formats are resized to fit 1024 by 1024 pixels; use `imageUploadUrls` for remote URLs. A file and site ID must be supplied. Requires a logged-in session. """ imageUpload( "Site ID from `sites` that the image is stored under." siteId: Int! "Multipart file upload; supply a file even though this argument is nullable in the schema." image: Upload "Source label stored with the image and matched by `imageList.source`; defaults to `surveys`." source: String ): Image! """ Fetches remote images and stores them through the same normalization as `imageUpload`, returning metadata in request order. Requires an accessible site and at most 25 MiB per download. Stops on the first failure without rolling back earlier uploads; no per-image partial result is returned. Requires a logged-in session. """ imageUploadUrls( """ Remote HTTP or HTTPS image URLs, in desired result order; supply a list even though the schema permits omission. Each download is capped at 25 MiB. """ images: [String!] "Source label stored with each image and matched by `imageList.source`, for example `surveys`." source: String! "Site ID from `sites`; must be a site the session can access." siteId: Int! ): [Image!] """ Deletes the stored image file and metadata only when owned by the current account, returning a confirmation string. Use `imageList` or `imageDetail` to find its UUID; `siteId` is ignored, and a missing image returns an error. Requires a logged-in session. """ imageDelete( "Image UUID from `imageList`, `imageDetail`, `imageUpload` or `imageUploadUrls`." id: ID! "Ignored; the image is found by `id` within the current account." siteId: Int ): String! """ Creates an enabled notification rule that sends `action` events for a goal, survey, or site to a channel, and returns it. Uses `channelId` when given, otherwise reuses or creates an email or API channel for `channelDestination`; a rule duplicating an existing channel, resource, and action fails. Requires notifications edit access. """ notificationCreate( "Resource to watch: a goal, survey, or site for error notifications." resource: NotificationResource! "Resource id as a string from `goalCardList`, `addonList`, or `sites` according to `resource`." resourceId: String! "Event to notify on: `CONVERTED` for goals, `RESPONDED`/`COMPLETED` for surveys, `ERROR_OCCURRED` for sites." action: NotificationAction! "Channel type for a new destination; `SLACK` requires an existing `channelId`." channelType: ChannelInputType! "Existing id from `channelsList` for the same site; takes precedence over `channelDestination`." channelId: Int "Email address or API URL when `channelId` is omitted; matching channels are reused." channelDestination: String ): Notification! """ Moves a notification rule to another channel and returns the updated rule; the resource and action stay the same. Pass `channelId` to reuse a channel, or `channelDestination` to reuse or create a channel of the rule's current type (email or API only). Requires notifications edit access. """ notificationEdit( "Notification id from `notificationsList`." notificationId: Int! "Site id from `sites` for the notification." siteId: Int! "Existing id from `channelsList` for the same site; takes precedence over `channelDestination`." channelId: Int "Email address or API URL when `channelId` is omitted; matching channels are reused." channelDestination: String ): Notification! """ Deletes notification rules and returns the ids actually deleted. Zapier rules are skipped and are removed only with their resource; use `notificationToggleEnabled` to pause a rule instead. Requires notifications edit access. """ notificationDelete("Notification ids from `notificationsList`; inaccessible ids are skipped." ids: [Int!]!): Affected """ Enables or disables notification rules and returns only the ids whose state changed. Use it to pause or resume delivery while keeping the rule. Requires notifications edit access. """ notificationToggleEnabled( "Notification ids from `notificationsList`; inaccessible ids are skipped." ids: [Int!]! "True to enable delivery, false to disable it; unchanged rules are omitted from affected ids." enabled: Boolean! ): Affected """ Creates a saved funnel definition; use `funnelResult` to calculate its metrics without changing the definition. Every goal must be accessible and belong to `siteId`; `visitStep` prepends a synthetic visit baseline. Returns the saved funnel with goals in supplied order. Requires funnels edit access. """ funnelCreate( "Site ID from `sites`; all `goalSteps` goals must belong to it." siteId: Int! "Nonblank funnel display name." name: String! "True to prepend a site-wide visit baseline before the ordered goal steps." visitStep: Boolean! """ Ordered goal IDs from `goalRefList`, all accessible and belonging to `siteId`; matching uses the goals' configured triggers. """ goalSteps: [Int]! ): Funnel! """ Replaces a saved funnel's name, visit baseline, and ordered goal steps; use `funnelEditName` to rename only. Revalidates that goals are accessible and belong to the site, then replaces all steps transactionally. Missing or inaccessible funnels return an error. Requires funnels edit access. """ funnelEdit( "Saved funnel ID from `funnelList` or `funnelDetail`." id: Int! "Site ID from `sites` that owns the funnel and every goal step." siteId: Int! "Nonblank funnel display name." name: String! "True to prepend a site-wide visit baseline before the ordered goal steps." visitStep: Boolean! """ Ordered goal IDs from `goalRefList`, all accessible and belonging to `siteId`; matching uses the goals' configured triggers. """ goalSteps: [Int]! ): Funnel! """ Renames a saved funnel and returns its definition without changing steps. Use `funnelEdit` to replace steps; missing or inaccessible funnels return an error. Requires funnels edit access. """ funnelEditName( "Saved funnel ID from `funnelList` or `funnelDetail`." id: Int! "Site ID from `sites` that owns the funnel." siteId: Int! "Nonblank funnel display name." name: String! ): Funnel! """ Soft-deletes accessible funnels and their steps, returning only IDs actually deleted. Duplicate IDs are ignored and inaccessible or already deleted IDs are skipped. Requires funnels edit access. """ funnelDelete( "Saved funnel IDs from `funnelList`; duplicates and inaccessible IDs are skipped." ids: [Int!]! ): Affected } type RootSubscriptionType { """ Streams a site's live visitor activity (visits, clicks, errors, form and e-commerce events, goal conversions, survey responses, and similar). On subscribe it replays up to the 100 most recent cached events, then pushes batches of new events about every five seconds; each poll reads at most 100 events from the past week. Requires a logged-in user with access to the site. """ liveEvents("Accessible site id from `sites`; selects the site event stream." siteId: Int!): [LiveEvent]! } "One recent site event delivered by `liveEvents`, with owner, site, event type, and event payload." type LiveEvent { "Owner account id for the event." userId: Int! "Site the event was recorded on." siteId: Int! data: LiveEventData! "Event time in Unix milliseconds." timestamp: Int! "Recorded event type string, such as `GOAL_CONVERSION`." eventType: String! } "Event identity and event-specific attributes returned by `liveEvents`." type LiveEventData { "Event identifier used to deduplicate recent deliveries." eventId: String! "Visitor id from the event payload; null when absent." visitorId: String attributes: LiveEventAttributes! } """ Event-specific attributes returned by `liveEvents`. Unreported fields are null; JSON fields are inline values rather than JSON-encoded strings. """ type LiveEventAttributes { "Visitor id carried in attributes; may differ in availability from the enclosing visitor id. Null when absent." visitorId: String "Visit identifier associated with the event. Null when absent." visitId: String "Reported page URL. Null when absent." url: String "Reported page path. Null when absent." path: String "Numeric event subtype; interpreted within the enclosing event type. Null when absent." subEventType: Int "Whether the click is marked as a dead click. Null when absent." dead: Boolean "Whether the click is marked as a rage click. Null when absent." rage: Boolean "Reported custom visitor identity. Null when absent." identifier: String "Reported numeric device category. Null when absent." device: Int "Inline JSON; string country codes become an object with `code` and `name`. Null when absent." country: JSON "Reported referring URL. Null when absent." referrer: String "Inline JSON tracking parameters as reported by the event. Null when absent." utm: JSON "Inline JSON error fingerprint or click-element details, depending on event type. Null when absent." fingerprint: JSON "Error fingerprint hash used by error-detail queries. Null when absent." fingerprintMd5: String "Reported visitor tags. Null when absent." tags: [String] "Reported form name. Null when absent." formName: String "Reported form identifier. Null when absent." formId: String "Reported form submission destination. Null when absent." formAction: String "Reported form duration in milliseconds. Null when absent." timeSpent: Int "Goal name captured with a conversion event. Null when absent." goalName: String "Add-on name captured with the event. Null when absent." addonName: String "Reported uniqueness flag for the event. Null when absent." unique: Boolean "Reported product quantity; numeric strings are converted to integers. Null when absent." quantity: Int "Reported product name. Null when absent." productName: String "Reported product price in the supplied `currency`, without conversion. Null when absent." price: Float "Reported currency for monetary attributes; no currency conversion is applied. Null when absent." currency: String "Reported checkout total; currency is available only when supplied by the event. Null when absent." total: Float "Reported order identifier. Null when absent." orderId: String "Reported survey identifier. Null when absent." surveyId: Int "Reported number of additional basic visitors. Null when absent." count: Int } "The `json` scalar type represents arbitrary JSON data." scalar JSON """ Technology recommendation payload used when analysis is available; fields capture both a chosen match and diagnostic details about why no recommendation could be made. """ type SimpleTechRecommendation { "True when a supported installation method is identified." found: Boolean! "Selected installation method, identical to `method`; null when no supported method is identified." name: String """ First supported method in priority order: wordpress, gtm, shopify, wix, squarespace, drupal, magento2, magento, joomla, segment; null without a match. """ method: String "Null for a supported match; otherwise the lookup or matching outcome." issue: TechRecommendationIssue "Distinct technology names extracted from analysis and sitemap hints; empty on pending or failed lookups." foundTechnologies: [String] "Analysis-provided common technologies, or supported methods derived from detected technologies." commonTechnologies: [String] "Numeric threshold reported by page analysis; null when absent." analysisThreshold: Float "Analysis-provided missing-data labels; empty when absent." missingAnalysis: [String] "Analysis-provided site names; empty when absent." siteNames: [String] } "Diagnostic reason for a missing technology recommendation result." enum TechRecommendationIssue { "Analysis returned no supported installation method" TECH_NO_MATCH "URL is missing or its analysis lookup failed" URL_NOT_FOUND "Page analysis is still pending without enough data" NOT_ENOUGH_INFO_YET } "Registered custom property returned by `userProperties`, used in `custom_property` audience conditions." type UserProperty { name: String! """ Registered value type. Audience conditions accept only `string` properties, whose value is a list of strings, and `number` properties, whose value is a number or an object with numeric `min` and `max`. """ propertyType: String! } """ Audience JSON contract returned by `audienceDefinitionContract`; build conditions only from `criteria` entries whose name appears in `allowedCriteria`. """ type AudienceDefinitionContract { "Value to send as the definition's `version`." version: Int! "Contract revision; if it changes while you prepare a write, refetch the contract and rebuild." contractRevision: Int! "Fingerprint of the contract artifact; a different digest means the contract changed." artifactDigest: String! "Value to send as the root `operator`, currently `and`." rootOperator: String! """ Value to send as `except.operator`, currently `or`. Omit `except` when there are no exclusions; an empty `except.conditions` is invalid. """ exclusionOperator: String! "Whether conditions may nest; false, so `conditions` and `except.conditions` hold only leaves." nestedConditions: Boolean! "Every supported criterion with its comparison and value rules." criteria: [AudienceCriterionContract!]! "Criterion names this account may use; build conditions only with these." allowedCriteria: [String!]! """ JSON-encoded valid definition showing the envelope, a condition, and an `except` block. Use it for the envelope only; take each criterion's value shape from `criteria`. """ example: String! } """ Rules for one criterion returned by `audienceDefinitionContract`; they summarize comparisons and value types, not the complete structure of every value. """ type AudienceCriterionContract { "Literal `criteria` key of the condition, for example `device`." name: String! "Allowed `comparison` values in the root `conditions` array." positiveComparisons: [String!]! "Allowed `comparison` values in `except.conditions`; empty when the criterion cannot be excluded." negativeComparisons: [String!]! "Whether the criterion may appear in `except.conditions`, using `negativeComparisons`." allowsExclusion: Boolean! "JSON types `value` may take across this criterion's comparisons: `array`, `number`, or `object`." valueTypes: [String!]! """ Allowed string values when the set has at most 20 entries; empty for open or larger sets, which come from `discoveryQuery` or free input. """ fixedValues: [String!]! "GraphQL query that lists valid ids or values for this criterion; null when none applies." discoveryQuery: String } """ Aggregated traffic-analysis bucket keyed by the combined referrer and UTM values rather than by a stable identifier. """ type TrafficAnalysisResult { "Referrer host and path concatenated without a scheme; empty string when both are absent." referrerUrl: String "Recorded utm source value; null when not captured." utmSource: String "Recorded utm campaign value; null when not captured." utmCampaign: String "Recorded utm medium value; null when not captured." utmMedium: String "Recorded utm term value; null when not captured." utmTerm: String "Recorded utm content value; null when not captured." utmContent: String "Count of non-virtual recorded sessions in this referrer/UTM group." total: Int! } """ Landing-page totals where `filtersTotals` aligns positionally with the input `filters` list and `total` is computed without those per-filter constraints. """ type TrafficAnalysisUrlsResult { "Normalized landing URL, or `All` for site-wide totals." url: String "Unfiltered non-virtual recorded-session count for this URL or the entire site." total: Int! "Counts aligned with input filter positions; missing fetched URL/filter combinations return zero." filtersTotals: [Int]! } """ One comparison filter for `trafficAnalysisUrls`; values within a field are ORed together, and an empty string matches records where that dimension is nil. """ input TrafficAnalysisUrlsQuery { """ Referrer values in the `trafficAnalysis.referrerUrl` format (host plus path, scheme optional), matched exactly on host and path. Empty string matches sessions without a referrer; omit for no constraint. """ referrerUrl: [String] """ Exact utm source values to OR together. Empty string matches missing data; omit for no constraint, and an empty list matches nothing. """ utmSource: [String] """ Exact utm campaign values to OR together. Empty string matches missing data; omit for no constraint, and an empty list matches nothing. """ utmCampaign: [String] """ Exact utm medium values to OR together. Empty string matches missing data; omit for no constraint, and an empty list matches nothing. """ utmMedium: [String] """ Exact utm term values to OR together. Empty string matches missing data; omit for no constraint, and an empty list matches nothing. """ utmTerm: [String] """ Exact utm content values to OR together. Empty string matches missing data; omit for no constraint, and an empty list matches nothing. """ utmContent: [String] } """ Ranking input for `trafficAnalysisUrls`. Supply both fields; the selected filter is prioritized before sorting its counts. """ input TrafficAnalysisUrlsOrder { "Zero-based position in `filters` whose rows rank first; use 0 with an empty filter list." filterIndex: Int! "`ASC` or `DESC` (lowercase also accepted); any other string sorts by descending count." sort: String } """ A roster row from `accountUsers` or team mutations representing the holder, a linked member, or an invitation. IDs are prefixed by record kind and unrestricted members expose an empty `sites` list. """ type AccountTeamMember { "Roster ID from `accountUsers`: `ah_0` for the holder, `ua_` for a membership, or `i_` for an invitation." id: String! name: String """ Latest login or audit-logged activity time in Unix seconds; null for pending invitations and members who have never been active. """ lastActive: Int "Time the invitation was created or last resent, in Unix seconds; null for members and the account holder." invitedDate: Int sites: [String!] email: String! role: AccountUsersRole! "Invitation acceptance URL; invitations expire 30 days after creation or a successful resend." invitationUrl: String invitationPending: Boolean! specificSites: Boolean! secondFactorEnabled: Boolean! canDelete: Boolean! canUpdate: Boolean! } """ A collaborator returned by `teamMembers`, optionally filtered by site; its name falls back to email when no display name is set. """ type TeamMember { id: Int! name: String "Last activity time in Unix seconds; `teamMembers` does not populate this field." lastActive: Int "Invitation time in Unix seconds; `teamMembers` does not populate this field." invitedDate: Int sites: [String!] email: String! role: String! invitationPending: Boolean! specificSites: Boolean } """ Sorting options for `accountUsers`; with `LAST_ACTIVE`, rows without an activity time sort last in ascending order and first in descending order. """ input AccountUsersOrder { "Sort direction; defaults to `ASC`." sort: AccountUsersSortOrder "Sort field; defaults to `EMAIL`." field: AccountUsersSortField } "Sort direction for the complete roster returned by `accountUsers`." enum AccountUsersSortOrder { "Sort email or activity in ascending order, placing null activity last" ASC "Sort email or activity in descending order, placing null activity first" DESC } "Fields available for ordering the roster returned by `accountUsers`." enum AccountUsersSortField { "Sort by lowercased email address" EMAIL "Sort by the latest login or audit-logged activity time" LAST_ACTIVE } """ Team roles returned by `accountUsers` and accepted by team mutations; the plan can further limit what each role can use. """ enum AccountUsersRole { "Access to every site plus billing, team, and account settings" OWNER "Can view data on all or specific sites but cannot make changes" READ_ONLY "Can view and edit data on all or specific sites, without billing or team settings access" MANAGER "The account's primary owner, shown only on the `ah_0` row; treated as `OWNER` when sent to team mutations" ACCOUNT_HOLDER } """ Cursor sort options for `survey_response_list`; `question_id` sorting uses the selected question within each response group rather than top-level response metadata. """ input SurveyResponsesListOrder { "ASC or DESC; defaults to DESC." sort: SurveyResponsesListSortOrder "Question ID from surveyResultSummary.questions; required for sorting by QUESTION_ID." questionId: ID "CREATED_AT, QUESTION_ID, or SURVEY_URL; defaults to CREATED_AT." field: SurveyResponsesListSortField } "Sort direction for surveyResponseList." enum SurveyResponsesListSortOrder { "Ascending values; choose for oldest responses or increasing answer values." ASC "Descending values; choose for newest responses or decreasing answer values." DESC } "Response-group sorting key for surveyResponseList." enum SurveyResponsesListSortField { "Response-group creation time; choose for chronological ordering." CREATED_AT "Selected question answer, numeric then text with nulls last; supply questionId." QUESTION_ID "Page URL where the response was submitted, with nulls last." SURVEY_URL } """ Paginated survey-response result keyed by response group, with an opaque cursor to request the next page. Returned by surveyResponseList. """ type SurveyResponseListMeta { responses: [SurveyResponseDetail!]! "Opaque cursor excluding previously returned response-group IDs." nextPageCursor: String! "True when the page fills the limit; another request may still return no responses." hasNextPage: Boolean! } """ Indexed response lookup result; `response` is null when the requested zero-based index is outside the filtered result set. Returned by surveyResponses. """ type SurveyResponsesMeta { "Zero-based index in the filtered chronological response groups." index: Int! "Total matching response groups, not individual answer rows." total: Int! "Selected response group; null when the index is outside the filtered set." response: SurveyResponseDetail } """ One submitted response group with all question answers merged under a single survey visit and recording permissions derived for the current session. Returned by surveyResponses and surveyResponseList. """ type SurveyResponseDetail { userId: Int! siteId: Int! surveyId: ID! "Response-group ID accepted by surveyResponseDelete; not the survey UUID." id: ID! "Survey content format version at submission; null when unavailable." formatVersion: ID "Raw recording session ID; null when not captured, and distinct from the hashed ID accepted by recording." sessionId: ID "Visitor ID; null when not captured." visitorId: ID "Custom visitor identifier; null when not captured." identifier: String "Captured response language; null when unavailable." language: String "Response-group creation time in Unix seconds; null when unavailable." createdAt: Int questions: [SurveyResponseQuestionDetail] "Linked recording validity; null when no recording metadata is available." recordingValid: Boolean "Linked recording deletion time in Unix seconds; null when no deletion timestamp is available." recordingDeletedAt: Int permissions: SurveyResponsePermissions! "Submission page URL; null when not captured." surveyUrl: String """ Resolves the linked recording for this survey response. Returns null when no recording is linked or the session cannot view recordings. """ recording: Recording } """ Recording access flags derived from session age and retention state rather than from survey-specific permissions alone. Returned within surveyResponses and surveyResponseList. """ type SurveyResponsePermissions { "Whether the linked recording predates the current recording retention horizon." canUpgradeToView: Boolean! } "One question answer within a response group returned by surveyResponseList or surveyResponses." type SurveyResponseQuestionDetail { "Question ID within the survey content." questionId: ID! "Question text at submission; null when not stored." questionText: String "Stored question type at submission; null when not stored." questionType: String "Question position at submission; null when not stored." questionPosition: Int "Text or option answer; multiple text choices are joined by newlines, null without a text answer." textResponse: String "Numeric answer, such as a rating; null without a numeric answer." integerResponse: Int "Free-text answer to an other option; null when not supplied." otherResponse: String "Recognized sentiment, or UNKNOWN when missing or unrecognized." sentiment: SurveyResponseSentiment! } """ Survey analytics root that combines top-level counts with per-question summaries resolved on demand. Returned by surveyResultSummary. """ type SurveyResultSummary { id: ID! "Session-derived add-on access flags." permissions: AddonPermissions "Recorded survey view events in the inclusive calendar-date window." totalViews: Int! "Nondeleted response groups in the inclusive timestamp window; not individual answers." responseCount: Int! """ Returns questions ordered by survey position with aggregated results, key phrases, and counts for the current date window. """ questions: [SurveyResultQuestionSummary] } """ Per-question survey summary whose result shapes vary by question type but always stay keyed to the survey question id. Returned within surveyResultSummary. """ type SurveyResultQuestionSummary { "Question ID within this survey; use it as questionId when sorting surveyResponseList." id: ID! surveyId: ID! "Question position stored with its answers, otherwise its zero-based index in the survey content." position: Int! "Question type and subtype joined by /, such as rating/NPS." type: String! optional: Boolean! title: String! "Supporting question text; null when absent from content." subtext: String "Distinct nondeleted response groups answering this question in the timestamp window." responseCount: Int! "Recorded question view events in the calendar-date window; zero when no count is available." totalViews: Int "Extracted key phrases with occurrence counts in the timestamp window; empty when none are stored." keyPhrases: [SurveyResponseSummary] """ Answer buckets and row counts: sentiment for text, option text for choices, rating values, or NPS promoters (9-10), passives (7-8), and detractors (below 7). """ results: [SurveyResponseSummary] """ Returns the most recent raw responses for this question; defaults to 10 items and reuses the parent summary date filters. """ lastResponses("Maximum raw answers, default 10; newest answer creation time first." limit: Int): [SurveyResponse] } "Raw question answer returned by surveyResultSummary.questions.lastResponses." type SurveyResponse { "Response-group ID accepted by surveyResponseDelete." responseGroupId: String! "Survey content format version at submission." formatVersion: Int! "Raw recording session ID; null when absent, not the hashed ID accepted by recording." sessionId: String "Visitor ID; null when not captured." visitorId: String "Custom visitor identifier; null when not captured." identifier: String "Text or selected option for this answer row; null without a text answer." textResponse: String "Free-text other answer; null when not supplied." otherResponse: String "Numeric answer, such as a rating; null without a numeric answer." integerResponse: Int "Stored sentiment label; null when not classified." sentiment: String "Captured response language; null when unavailable." language: String "Response-group creation time in Unix seconds." createdAt: Int! } "One response-value or key-phrase bucket returned by surveyResultSummary, with its occurrence count." type SurveyResponseSummary { "Response bucket label or key phrase; interpretation depends on question type." value: String! "Number of answer rows or extracted phrase occurrences in this bucket, not a percentage." count: Int! } "Detected sentiment of an answer returned by surveyResponseList and surveyResponses." enum SurveyResponseSentiment { "Positive answer sentiment." POSITIVE "Neutral answer sentiment." NEUTRAL "Negative answer sentiment." NEGATIVE "Mixed positive and negative answer sentiment." MIXED "No recognized sentiment classification." UNKNOWN } """ SAML SSO configuration returned by `ssoSettings` and `saveSsoSettings`, including provider settings and provisioning rules. """ type SsoSettings { enabled: Boolean! required: Boolean! spConfiguration: SsoSpConfiguration! idpConfiguration: SsoIdpConfiguration! """ Ordered rules evaluated after existing membership, removal, and pending invitation checks. The first matching rule applies; the final rule has one `ANYONE` condition. The default configuration uses `EXISTING` for this fallback. """ provisioningRules: [SsoProvisioningRule!]! emailDomain: String organizationName: String "Saved validation time in Unix seconds; null when unset." lastValidatedAt: Int } """ Service provider identifiers and endpoint URLs returned by `ssoSettings` for configuring the identity provider. """ type SsoSpConfiguration { entityId: String! defaultEntityId: String! "SAML assertion consumer service URL to configure at the identity provider." acsUrl: String! "SAML logout endpoint URL to configure at the identity provider." sloUrl: String! "URL for service provider SAML metadata." metadataUrl: String! } "Identity provider settings returned by `ssoSettings`; fields can be null before configuration is complete." type SsoIdpConfiguration { entityId: String "Identity provider HTTPS SSO login URL." targetUrl: String "Identity provider signing certificate text, accepted as PEM or base64-encoded certificate data." certificate: String } "A provisioning rule returned by `ssoSettings`; all conditions must match before its action applies." type SsoProvisioningRule { conditions: [SsoProvisioningCondition!]! action: SsoProvisioningAction! } """ A match condition returned by `ssoSettings`; `attribute` applies only to `ATTRIBUTE` and `values` is null for `ANYONE`. """ type SsoProvisioningCondition { type: SsoProvisioningConditionType! attribute: String values: [String!] } "A matched rule action returned by `ssoSettings`; role and site settings are null for `EXISTING`." type SsoProvisioningAction { type: SsoProvisioningActionType! role: SsoProvisioningActionRole specificSites: Boolean sites: [Int!] } "Condition types used by `ssoSettings` provisioning rules and `saveSsoSettings` inputs." enum SsoProvisioningConditionType { "Match the asserted email against exact configured values" EMAIL "Match any asserted value of the named SAML attribute against exact configured values" ATTRIBUTE "Match every identity as the single condition of the final fallback rule" ANYONE } "Provisioning actions for a matching SAML rule, returned by `ssoSettings` and accepted by `saveSsoSettings`." enum SsoProvisioningActionType { "Create or associate a member using the configured role and site scope when provisioning allows it" CREATE "Allow only users who already belong to the account" EXISTING } """ Team roles given by `CREATE` provisioning actions in `ssoSettings` and `saveSsoSettings`; they match the team roles used by `accountUsers`. """ enum SsoProvisioningActionRole { "Access to every site plus billing, team, and account settings" OWNER "Can view and edit data on the granted sites, without billing or team settings" MANAGER "Can view data on the granted sites but cannot make changes" READ_ONLY } "Filters for `snapshotsList`; unlike `SnapshotListFilter`, it has no `page` or `perPage` fields." input SnapshotListFilterCursor { "Status group to include; omitted means all accessible, undeleted statuses." status: SnapshotListFilterStatus "Folder ID from `folders`; explicit null selects unfiled snapshots, while omission includes all folders." folderId: Int """ Trimmed text search across name, description and URL, or an exact numeric ID. Double quotes select exact name, URL or ID. """ query: String "Site ID from `sites`; omit to include accessible sites." siteId: Int } "Filters and page options for `snapshots`; `perPage` defaults to 10." input SnapshotListFilter { "Status group to include; omitted means all accessible, undeleted statuses." status: SnapshotListFilterStatus "Folder ID from `folders`; explicit null selects unfiled snapshots, while omission includes all folders." folderId: Int """ Trimmed text search across name, description and URL, or an exact numeric ID. Double quotes select exact name, URL or ID. """ query: String "Site ID from `sites`; omit to include accessible sites." siteId: Int "Page number starting at 1." page: Int! "Positive page size; defaults to 10 and has no maximum." perPage: Int } """ Ordering shared by `snapshotsList` and `snapshots`; defaults to `STARTS_AT` ascending. Status ordering uses the derived `snapshotStatus` value, not the stored `status` field. """ input SnapshotListOrder { "Direction; defaults to `ASC`. For status, `ASC` uses descending lexical status order." sort: SnapshotSortOrder "Sort key; defaults to `STARTS_AT`, using creation time when start time is absent." field: SnapshotSortField } "Sort direction for `snapshotsList` and `snapshots`; status sorting reverses the lexical direction." enum SnapshotSortOrder { "Ascending order for the selected key, or descending lexical status order when sorting by status." ASC "Descending order for the selected key, or ascending lexical status order when sorting by status." DESC } "Sort key for `snapshotsList` and `snapshots`." enum SnapshotSortField { "Creation time, for ordering by when snapshots are created." CREATED_AT "Screenshot device, for grouping desktop, phone and tablet captures." DEVICE "Snapshot name, for alphabetical ordering." NAME "Scheduled start or creation time, for ordering by the collection start." STARTS_AT "Derived status, sorted alphabetically opposite to `sort`, to group lifecycle states." STATUS "Stored visit count; returned totals are refreshed after sorting, so they can differ slightly from the order." TOTAL_VISITS } """ Status group filter for `snapshotsList` and `snapshots`; `NOT_COMPLETED` groups error, scheduled and running snapshots. """ enum SnapshotListFilterStatus { "Stopped snapshots or snapshots past their expiration or visit limit, for finished collection." COMPLETED "Error, scheduled and running snapshots, for collection that is not classified as completed." NOT_COMPLETED } "Cursor page returned by `snapshotsList`, with an opaque continuation token." type SnapshotsListMeta { "Snapshots in the requested order; an empty list means no unseen matches remain." list: [Snapshot!]! "Opaque token containing all IDs seen so far; pass to `snapshotsList.cursor`." nextPageCursor: String! "True when the returned page fills the requested limit; another page may still be empty." hasNextPage: Boolean! } "Numbered page returned by `snapshots`, with pagination metadata and status counts." type SnapshotPaginatedList { "Metadata populated on successful responses; status counts ignore the status filter." meta: PaginationMeta "Snapshots in the requested order; an out-of-range page returns an empty list." list: [Snapshot] } "Current totals and derived status returned by `snapshotStats`." type SnapshotStats { id: Int! "Current visit total capped at `maxVisits` when positive; zero until the site is installed." totalVisits: Int! "Current click total; zero until the site is installed." totalClicks: Int! "Derived lifecycle state based on the saved snapshot." snapshotStatus: SnapshotStatus! } "Status counts in `snapshots` metadata, applying all filters except status." type SnapshotStatusCounts { "Sum of running and completed buckets, ignoring the status filter." total: Int "Count of error, scheduled and running snapshots, ignoring the status filter." running: Int "Count of completed snapshots, ignoring the status filter." completed: Int } "Pagination metadata returned by `snapshots`, with totals and status counts." type PaginationMeta { "Requested page number, starting at 1." page: Int "Requested page size, defaulting to 10." perPage: Int "Number of snapshots matching all filters." total: Int "Total matching snapshots divided by page size, rounded up." totalPages: Int "Account ID for the current session." userId: Int "Always false in this response." recordingCountEnabled: Boolean "Status counts with the status filter removed." counts: SnapshotStatusCounts } "Export entry returned by `snapshotExports`, representing an active or failed request or a completed file." type SnapshotExport { "Snapshot ID as text for active or failed requests; synthetic `export_N` entry ID for completed files." id: String "Export lifecycle state; completed entries represent files rather than snapshot records." status: SnapshotExportStatus "Display time formatted like `Oct 20 2026 - 01:30:00 PM`; null if no attempt time is recorded." date: String """ Unix seconds of the last attempt for active entries or file modification time for completed entries; may be null. """ timestamp: Int "Snapshot name for active entries; filename for completed entries." name: String """ Signed download URL for a completed file, valid for about one hour; null for active or failed requests or when no URL can be generated. """ url: String } "Export lifecycle state returned by `snapshotExports`." enum SnapshotExportStatus { "Export in progress, when waiting for a completed download entry." EXPORTING "Completed export file, when a download can be available." COMPLETED "Failed export request, when checking a request that did not complete." ERROR } """ Pages and discovery progress returned by `siteMapPages`; `status` describes pending work and `coverage` describes completed crawling. """ type SiteMapPagesResult { pages: [SiteMapPage!]! "More pages matched than `limit` returned." truncated: Boolean! status: SiteMapPagesStatus! "Why the status is `UNAVAILABLE`; null otherwise." reason: SiteMapUnavailableReason "When `UNAVAILABLE`, seconds after which asking again may help; null means stop asking." retryAfterS: Int coverage: SiteMapCoverage! """ When the newest completed crawl finished, or before any crawl the newest quick crawl (unix seconds). """ projectionAt: Int """ When the Site's newest observe run finished (unix seconds). Observe runs import the pages seen in the Site's Recordings, Web Analytics and Google Analytics imports. """ observedAt: Int } """ One page of the Site's site map returned by `siteMapPages`. Details fill in progressively, so every field except `url` and `visibility` may be null. """ type SiteMapPage { url: String! title: String pageType: SiteMapPageType visibility: SiteMapPageVisibility! "Relative importance within the Site, higher first. Null until crawled." importanceScore: Float "Presigned screenshot URL, valid for 15 minutes; null without a screenshot." screenshotUrl: String "Last successful crawl fetch in Unix seconds; null until fetched, when `title` may be a link label." crawledAt: Int "When the Site's Recordings, Web Analytics or Google Analytics imports last saw the page (unix seconds)." observedAt: Int } "Whether asking `siteMapPages` again can return more pages; independent of `coverage`." enum SiteMapPagesStatus { "Nothing is queued or running; asking again returns nothing new." READY """ A Spider run (quick crawl, crawl, enrichment, classification or observe run) is queued or running, or this request asked for one; ask again in 10 to 30 seconds for more pages. """ PENDING """ No pages and nothing pending: the quick crawl failed or was refused; see `reason`. Ask again after `retryAfterS` seconds, or stop when it is null. """ UNAVAILABLE } """ Why `siteMapPages` is `UNAVAILABLE`. Retry later, after `retryAfterS`: `COOLDOWN`, `ACCOUNT_CAP`, `FETCH_DEFERRED`, `FETCH_FAILED`, `NOTHING_FOUND`, `TIMEOUT` and `SPIDER_UNREACHABLE`. Configuration or Spider problems that asking again will not fix: `NOT_CONFIGURED`, `INVALID_TOKEN`, `SPIDER_ERROR`, `ENQUEUE_FAILED` and `INVALID_PARAMS`. The Site cannot be mapped: `INVALID_HOST`, `UNAUTHORIZED` and `SITE_DELETED`. """ enum SiteMapUnavailableReason { "Spider crawled the host recently and refused another quick crawl." COOLDOWN "The account reached Spider's crawl limit (reserved; Spider does not send it yet)." ACCOUNT_CAP "Another crawl of the host holds Spider's fetch slot." FETCH_DEFERRED "The Site's name is not a public host Spider may crawl." INVALID_HOST "The quick crawl reached the host but found no pages." NOTHING_FOUND "Spider could not fetch the Site's pages." FETCH_FAILED "Spider found that the user may not access the Site." UNAUTHORIZED "Spider found the Site deleted." SITE_DELETED "Spider could not queue the run." ENQUEUE_FAILED "Spider rejected the request's parameters." INVALID_PARAMS "This environment has no Spider." NOT_CONFIGURED "Spider did not answer in time." TIMEOUT "Spider could not be reached." SPIDER_UNREACHABLE "Spider answered in an unexpected way." SPIDER_ERROR "Spider rejected this environment's credentials; asking again will not help." INVALID_TOKEN } "How much of the Site completed crawls have covered, returned by `siteMapPages`." enum SiteMapCoverage { "The newest crawl covered the whole site." COMPLETE "The newest crawl stopped early, or only a quick crawl has run, including one this request ran." PARTIAL "Nothing has been crawled yet, not even a quick crawl." NONE } "Whether a site map page is proven publicly loadable, returned by `siteMapPages`." enum SiteMapPageVisibility { "A public crawl loaded the page." PUBLIC """ Not proven publicly loadable: seen only in the Site's Recordings, Web Analytics or Google Analytics imports, or only discovered by a quick crawl. """ PRIVATE } "Spider's page classifier taxonomy used by `siteMapPages`; values may be added." enum SiteMapPageType { HOMEPAGE LANDING PRODUCT COLLECTION PRICING SIGNUP LOGIN ARTICLE ARTICLE_INDEX HELP_ARTICLE HELP_INDEX LEGAL CONTACT ABOUT CAREERS APP CART_CHECKOUT SEARCH OTHER } """ A site with derived activity/install status plus optional tracking and settings data normalized for GraphQL clients. Returned by site and sites. """ type Site { id: Int name: String "Site creation time in Unix seconds." createdAt: Int "Whether session recording is enabled; null in shared-session details." sessionRecording: Boolean "True when installation is marked confirmed or the site has received data." installed: Boolean! "Last received site data in Unix seconds; null before data arrives." lastData: Int "First received recording data in Unix seconds; null before data arrives or in shared-session details." recordingFirstDataAt: Int "Whether site data was received within the last 28 days." active: Boolean! """ Sampling denominator, one recording per this many visits; null when unavailable or in shared-session details. """ recordingRatio: Int "Estimated visits per day; null when unavailable or in shared-session details." estimatedVisitsDay: Int "Estimated maximum recordings per day; null when unavailable or in shared-session details." estimatedMaxRecordingsDay: Int "Recording configuration; null when absent, not loaded, or accessed through a shared session." recordingSettings: RecordingSettings "Whether Web Analytics has an enablement timestamp." webAnalyticsEnabled: Boolean! "Web Analytics enablement time in Unix seconds; null when disabled or in shared-session details." webAnalyticsEnabledAt: Int "First Web Analytics data time in Unix seconds; null before data arrives or in shared-session details." webAnalyticsFirstDataAt: Int """ Site metadata such as saved colors and fonts, as a JSON object string; `{}` when empty, null in shared-session details. """ metadata: String "Site API key; null if absent or accessed through a shared session." apiKey: String "Whether the public tracking API is enabled; null in shared-session details." publicTrackingApi: Boolean """ Site tracking settings returned by site and sites, falling back to account tracking defaults when absent. Null in shared-session details or when neither settings nor defaults are available. """ settings: SiteSettingsDetails } """ Tracking and privacy settings normalized from either persisted site settings or per-user defaults when no site-specific record exists. Returned within site and sites. """ type SiteSettingsDetails { "True ignores Do Not Track and tracks those visitors too; false skips visitors whose browser sends it." dnt: Boolean "Whether an email address entered in a form or survey response becomes the visitor profile ID." autoIdentify: Boolean "Whether tracking cookies use the Secure attribute." useSecureCookies: Boolean "Whether Crazy Egg page captures use the Crazy Egg Bot user agent instead of a standard Chrome one." explicitAgent: Boolean "IP exclusion list text; null when no list is stored." ipListText: String "Site currency override; null inherits the account currency." defaultCurrency: String } "Site snapshot counts and visit totals returned by sitesForSnapshots." type SiteForSnapshots { id: Int! name: String! "Number of nondeleted snapshots for the site." snapshotsCount: Int! "Sum of visits across the site's nondeleted snapshots; zero without snapshots." totalVisits: Int! "Installation confirmed, snapshot visits exist, or site data has arrived." installed: Boolean! "Last received site data in Unix seconds; null before data arrives." lastData: Int "Whether site data was received within the last 28 days." active: Boolean! "Site metadata such as saved colors and fonts, as a JSON object string; `{}` when empty." metadata: String } "Site recording presence and configuration returned by sitesForRecordings." type SiteForRecordings { id: Int! name: String! "Retained matching recordings; null when only recording presence is checked." recordingsCount: Int recordingsEnabled: Boolean! "Derived installation flag based on installation status and recording presence." installed: Boolean! "Last received site data in Unix seconds; null before data arrives." lastData: Int "First received recording data time in Unix seconds; null before data arrives." recordingFirstDataAt: Int "Whether site data was received within the last 28 days." active: Boolean! "Not populated by `sitesForRecordings`; always null." metadata: String } "Site with a nonzero goal count returned by sitesForGoals." type SiteForGoals { id: Int! name: String! goalsCount: Int! "Installation marked confirmed or site data has arrived." installed: Boolean! "Last received site data in Unix seconds; null before data arrives." lastData: Int "Whether site data was received within the last 28 days." active: Boolean! "Site metadata such as saved colors and fonts, as a JSON object string; `{}` when empty." metadata: String } "Site with separate survey and CTA counts returned by sitesForAddons." type SiteForAddons { id: Int! name: String! ctas: SiteForAddonsCtas! surveys: SiteForAddonsSurveys! "Installation marked confirmed or site data has arrived." installed: Boolean! "Last received site data in Unix seconds; null before data arrives." lastData: Int "Whether site data was received within the last 28 days." active: Boolean! "Site metadata such as saved colors and fonts, as a JSON object string; `{}` when empty." metadata: String } "Nondeleted CTA count for a site returned by sitesForAddons." type SiteForAddonsCtas { "Number of nondeleted CTA add-ons for the site, including unpublished ones." count: Int! } "Nondeleted survey count for a site returned by sitesForAddons." type SiteForAddonsSurveys { "Number of nondeleted surveys for the site, including unpublished ones." count: Int! } """ Recording configuration exposed in both the current sampling fields and deprecated legacy sampling fields for backward-compatible clients. Returned within site and sites and by setRecordingSettings. """ type RecordingSettings { id: Int "Whether inclusion-page rules apply; normalized to false when unset." pageTargetingEnabled: Boolean "True ends a session at a blocked page; false skips the page without ending the session." endSessionOnBlockedUrl: Boolean "JSON-encoded object with a rules array; URL rules are normalized and deduplicated by URL." urlMatchingRules: String "JSON-encoded object with a rules array for ignored pages; normalized and deduplicated by URL." blockedUrlMatchingRules: String "JSON-encoded array of objects with selector and optional note." maskElements: String "Automatic, percentage, or fixed-count sampling mode; null when unset." samplingType: SamplingType """ Percent of visitors (0-100, two decimals) for RATE, target recordings per month for STATIC; null when unset. """ samplingValue: Float "Legacy sampling mode; null when unset." samplingStrategy: String @deprecated(reason: "use samplingType and samplingValue") "Legacy target recording count; null when unset." samplingNumRecordings: Int @deprecated(reason: "use samplingType and samplingValue") "Legacy sampling start date in Unix seconds; null when unset." samplingStartDate: Int @deprecated(reason: "use samplingType and samplingValue") "Legacy sampling end date in Unix seconds; null when unset." samplingEndDate: Int @deprecated(reason: "use samplingType and samplingValue") "Legacy sampling update time in Unix seconds; null when unset." samplingUpdatedAt: Int @deprecated(reason: "use samplingType and samplingValue") } "Recording sampling mode read by site and set by setRecordingSettings." enum SamplingType { "Automatic sampling; the rate adjusts to fit the recording quota." AUTO "Record a fixed percent of visitors given in `samplingValue`." RATE "Aim for a fixed number of recordings per month given in `samplingValue`." STATIC } "One page-preview request for the deprecated thumbnails query. Only `url` is used." input ThumbnailRequest { "Page URL to look up." url: String! "Ignored." viewport: String "Ignored." thumbnailMaxWidth: Int "Ignored." fullpage: Boolean "Ignored." unique: Int } "Input page URL paired with its stored preview image, returned by the deprecated thumbnails query." type ThumbnailResult { url: String! """ Presigned URL of the stored preview image, valid for at least 15 minutes, or an empty string when the page has none. """ thumbnailUrl: String! } "A page whose preview image to look up." input PageThumbnailRequest { "Page URL." url: String! "Preview device." device: PageThumbnailDevice! } "The preview image of a requested page." type PageThumbnail { "Page URL as requested." url: String! "Preview device as requested." device: PageThumbnailDevice! "Preview availability." status: PageThumbnailStatus! "Presigned image URL for list previews when ready." imageUrl: String "Presigned viewport-sized image URL when one is stored; otherwise null." largeImageUrl: String """ Capture ticket when status is CAPTURE, or when a READY browser capture is older than 7 days and may be captured again; otherwise null. Not available to AI clients. """ capture: PageThumbnailCapture } """ A ticket to capture one page in the browser: render the source, upload both images with their policies, then call commitPageThumbnail or failPageThumbnail with the token. """ type PageThumbnailCapture { "Opaque ticket for commitPageThumbnail or failPageThumbnail; usable once." token: String! "When the ticket and its upload policies expire, in Unix seconds." expiresAt: Int! "What to render." source: PageThumbnailSource! "Where to upload the two images." uploads: PageThumbnailUploads! "JWT for the Interagent proxy that renders the source." interagentJwt: InteragentJwt! } "The page a capture ticket renders." type PageThumbnailSource { "Kind of source." type: PageThumbnailSourceType! "Canonical URL of the page." url: String! """ The site's domain as an ASCII host. A page that ends on another host than this one or its subdomains is off the site and is not captured. """ siteDomain: String! """ For RECORDING, the page rebuilt from its newest recording, with scripts, embedded documents, form values and censored content removed; render it as the document at `url`. Null for LIVE. """ html: String } "Kind of page a capture renders." enum PageThumbnailSourceType { "The live page, loaded through the proxy." LIVE """ The page as recorded, for a page whose live version ends on a sign-in page or off the site. Issued only to sessions that may view recordings. """ RECORDING } "Upload policies for the two JPEGs of a capture." type PageThumbnailUploads { "320 px wide JPEG of the viewport." thumbnail: PageThumbnailUpload! "Viewport-sized JPEG." full: PageThumbnailUpload! } "An S3 presigned POST: send every field in order as multipart form data, then the image as `file`." type PageThumbnailUpload { "Form action URL." url: String! "Form fields to send before the file, in order." fields: [PageThumbnailUploadField!]! } "One form field of an upload policy." type PageThumbnailUploadField { "Field name." name: String! "Field value." value: String! } "Why a page capture failed, as the capture page reports it." enum PageThumbnailFailureReason { "The capture page rejected the job." INVALID_JOB "The capture page already ran a job." BUSY "The capture proxy could not start." PROXY_UNAVAILABLE "The page could not be loaded." LOAD_FAILED "The capture did not finish in time." TIMEOUT "The page could not be rendered to an image." RENDER_FAILED "An image upload failed." UPLOAD_FAILED "The page ended off the site or on a sign-in page." REDIRECTED } "Device for a page thumbnail." enum PageThumbnailDevice { "Desktop preview." DESKTOP "Mobile preview." MOBILE } "Availability of a page thumbnail." enum PageThumbnailStatus { "A stored image is available." READY "No image is stored; capture the page with the ticket in `capture`." CAPTURE "No image is available; show a placeholder." UNAVAILABLE } "Paginated shared-link results keyed as `meta` plus `shared_urls`, rather than a bare list." type SharedUrlListResults { meta: PaginationMeta! sharedUrls: [SharedUrlResult!]! } "Sort descriptor for `sharedUrls`; omitted members select creation time descending." input SharedUrlsOrder { "Sort direction; defaults to descending." sort: SharedUrlsSortOrder "Sort key; defaults to creation time." field: SharedUrlsSortField } "Enabled or disabled links to include in `sharedUrls`." enum SharedUrlsStatus { "Public lookup enabled, while the resource and required subscription remain available." ENABLED "Public lookup disabled, while retaining the saved share link." DISABLED } "Sort direction for the shared-link list." enum SharedUrlsSortOrder { "Ascending order, for earliest or lowest values first." ASC "Descending order, for latest or highest values first." DESC } "Shared-link metadata used to order `sharedUrls`." enum SharedUrlsSortField { "Link creation time, for chronological ordering." CREATED_AT "Original application URL, for URL ordering." URL "Saved resource title, for title ordering." TITLE "Recorded view count, for popularity ordering." TOTAL_VIEWS "Sharing user's email, for grouping by sharer." SHARED_BY_USER_EMAIL "Sharing user's name, for grouping by sharer." SHARED_BY_USER_NAME "Last recorded view time, for recency ordering." LAST_VIEWED_AT "Original application URL, equivalent to `URL` sorting." ORIGINAL_URL "Shared resource type, for grouping links by feature." ITEM_TYPE } """ Shared-link lookup result that exposes both a discriminator and the matching payload so clients can branch before reading the union body. """ type SharedResourceResult { "Discriminator selecting a redirect or inline resource payload." type: SharedResourceType "Payload matching `type`; invalid or unavailable codes return an operation error." resource: SharedResource } "Discriminator returned by `sharedResource` for a redirect or inline resource payload." enum SharedResourceType { "Frontend should redirect to given URL" REDIRECT "Frontend should render shared resource" RESOURCE } "Payload of `sharedResource`: a redirect target, or metadata for rendering the shared resource in the app." union SharedResource = SharedResourceRedirect | SharedResourceData """ Redirect returned by `sharedResource` for export links and links saved with an app URL; send the visitor to `url` instead of rendering a shared resource. """ type SharedResourceRedirect { url: String! """ Whether the client should append the current page's query parameters to `url`. False for shortened export links whose `url` is a signed destination that must be used verbatim. """ forwardQueryParams: Boolean! } """ Bootstrap payload for rendering a shared resource; this is metadata only, with `auth_token` used to authorize subsequent resource-specific queries. """ type SharedResourceData { resourceType: SharedUrlType! "Resource query id; recordings use the hashed playback id rather than the numeric id accepted by `sharedUrl`." resourceId: ID! "Owner account id for the shared resource." userId: Int! source: SharedSource! "Source site id; null for Google Analytics property shares." siteId: Int "Source site name; null for Google Analytics property shares." siteName: String "Expiring shared-resource access token for follow-up queries." authToken: ID! "Fragment preserved from a Heatmap's original URL; null for other resources or when absent." fragment: String } """ Normalized source metadata for the shared resource; site-backed and GA-property-backed shares are flattened into the same shape. """ type SharedSource { "Site id or external GA property id, according to `type`." id: Int! name: String! type: SharedSourceType! "Whether site analytics or the imported GA property is enabled." webAnalyticsEnabled: Boolean! "Analytics enable time in Unix seconds; null when not enabled." webAnalyticsEnabledAt: Int "Last successful GA import in Unix seconds; null for site sources or before success." lastSuccessAt: Int "GA import enable time in Unix seconds; null for site sources or when not enabled." enabledAt: Int "Oldest imported GA data time in Unix seconds; null for site sources or when unavailable." oldestImportedDataAt: Int "Imported GA property's timezone; null for site sources or when unavailable." currentTimezone: String "Source creation time in Unix seconds; null when unavailable." createdAt: Int } "Source backing a shared resource: a tracked site or an imported Google Analytics property." enum SharedSourceType { "Crazy Egg site, for a directly tracked shared resource." SITE "Imported Google Analytics property, for an imported analytics share." GA_PROPERTY } """ Full script-check result returned from the remote audit pipeline, including derived redirect state, categorized findings, and recent-site metadata. Returned by checkScript. """ type ScriptCheck { finalUrl: String! "Title returned by the page audit; null when unavailable." pageTitle: String "Whether the final URL differs from the input URL outside its URL-matching rule." didRedirect: Boolean! "First failing error check, in evaluation order; null when none fails." error: ScriptCheckResult "All warning findings; an empty list means none were detected." warnings: [ScriptCheckResult!] "All informational findings; an empty list means none were detected." infos: [ScriptCheckResult!] "Browser console errors captured by the remote check; only populated for admin sessions." consoleErrors: [ScriptCheckConsoleError!] """ Whether a running Crazy Egg tracking script was detected on the page; it may belong to another account, reported by `error`. """ installed: Boolean! "Last received data for the matching site in Unix seconds; null when no site or data exists." siteVisitedAt: Int """ Cookie write attempts reported by the remote checker so the caller can see which cookies were successfully set during the visit. """ cookiesSuccessfullySet: [CookieResult!] } "One cookie write attempt reported by checkScript." type CookieResult { name: String! "Whether the checker reported a successful cookie write." success: Boolean! } """ Expedited install-check response optimized for create/edit flows, where redirect handling, domain permission checks, and quota preview matter more than full diagnostics. Returned by checkTitle. """ type ScriptCheckExpedited { requestedUrl: String! finalUrl: String! "Title from the expedited page probe; null when unavailable." pageTitle: String "Whether the final URL differs outside the input URL-matching rule." didRedirect: Boolean! domain: String! "True when the session may neither access nor create a site for this registrable domain." permissionDenied: Boolean! "Redirect target path contains login, sign_in, or signin; false when no matching redirect is detected." isLoginPage: Boolean! """ Existing plus proposed snapshots minus the plan's snapshot limit: 0 at the limit, null when under it, without a limit, or in shared sessions. """ numberOfSnapshotsOverQuota: Int """ Whether a running Crazy Egg tracking script was detected on the page; false also when the page could not be probed. """ installed: Boolean! "Last received data for the matching site in Unix seconds; null when no site or data exists." siteVisitedAt: Int } """ Minimal preflight response for install flows that need only domain permission, existing-install detection, quota preview, and last-visited metadata. Returned by checkPermission. """ type ScriptCheckPermissionOnly { requestedUrl: String! domain: String! "True when the session may neither access nor create a site for this registrable domain." permissionDenied: Boolean! """ Existing plus proposed snapshots minus the plan's snapshot limit: 0 at the limit, null when under it, without a limit, or in shared sessions. """ numberOfSnapshotsOverQuota: Int """ Whether a running Crazy Egg tracking script was detected on the page; false also when the page could not be probed. """ installed: Boolean! "Last received data for the matching site in Unix seconds; null when no site or data exists." siteVisitedAt: Int } "One captured browser console error returned by checkScript for admin sessions." type ScriptCheckConsoleError { type: String! message: String! "Source URL reported with this console error; null when absent." url: String } """ Shared result shape for script-check errors, warnings, and infos; the `name` enum determines whether extra payload fields are present on a concrete subtype. Returned within checkScript. """ interface ScriptCheckResult { "Finding code that determines the concrete result type." name: ScriptCheckResultName! } """ Fallback result shape used for named findings that carry no extra payload beyond their enum identifier. Returned within checkScript. """ type ScriptCheckResultBasic implements ScriptCheckResult { name: ScriptCheckResultName! } """ Informational finding emitted when the checked URL resolves somewhere outside its original matching rule; includes the resolved redirect target. Returned within checkScript. """ type ScriptCheckResultPageRedirects implements ScriptCheckResult { name: ScriptCheckResultName! redirect: String! } """ Informational finding emitted when no running snapshot matches but a scheduled snapshot will begin later. Returned within checkScript. """ type ScriptCheckResultHasScheduledSnapshot implements ScriptCheckResult { name: ScriptCheckResultName! "Scheduled snapshot start time in Unix seconds." startsAt: Int! } """ Informational finding emitted when the page is already sending data to a specific snapshot; the payload identifies that snapshot and whether it already has recorded data. Returned within checkScript. """ type ScriptCheckResultDataBeingTrackedTo implements ScriptCheckResult { name: ScriptCheckResultName! "Snapshot ID accepted by snapshot detail operations." snapshotId: Int! snapshotName: String! snapshotDevice: SnapshotDevice! "Whether the selected snapshot has recorded visit data." snapshotHasData: Boolean! } """ Informational finding emitted when the site exists but its recording rules do not cover the resolved final URL. Returned within checkScript. """ type ScriptCheckResultRecordingsDisabled implements ScriptCheckResult { name: ScriptCheckResultName! siteId: Int! } """ Unified enum used across the top-level `error`, `warnings`, and `infos` collections; categories are implied by the field that returns each value. """ enum ScriptCheckResultName { "A detected tracking script belongs to another account." INCORRECT_TRACKING_SCRIPT_INSTALLED "No existing site is accessible and the session cannot create sites." PERMISSION_REQUIRED "All detected account tracking script responses report an inactive account." INACTIVE_ACCOUNT "Malformed tracking script markup is in the page and no tracking script is running." TRACKING_SCRIPT_CODE_MALFORMED "The tracking script appears only inside an HTML comment and no tracking script is running." TRACKING_SCRIPT_CODE_COMMENTED "No running Crazy Egg tracking script was detected." MISSING_TRACKING_SCRIPT "The page's content policy may prevent tracking resources from loading." CONTENT_SECURITY_POLICY "The checker reports multiple tracking scripts." DUPLICATE_TRACKING_SCRIPT_INSTALLED "A detected script uses an outdated script host." OUTDATED_TRACKING_SCRIPT_INSTALLED "A script is outside the page head without an installation integration." TRACKING_SCRIPT_IN_NON_OPTIMAL_LOCATION "Snapshot naming code is detected for a snapshot without name matching." TRACK_BY_NAME_CODE_DETECTED "The snapshot subscription has reached its visits or page-view allowance." MONTHLY_VISITS_QUOTA_REACHED "The account has more snapshots than its allowed total." TOTAL_SNAPSHOT_QUOTA_REACHED "The recording subscription has reached its monthly recording allowance." MONTHLY_RECORDINGS_QUOTA_REACHED "Reserved incomplete-audit finding; not emitted by the current full-check pipeline." FULL_CHECK_NOT_COMPLETED "The checker reports modified browser native functions." NATIVE_FUNCTIONS_OVERRIDEN "The checker reports Prototype.js on the page." PROTOTYPE_JS_DEFINED "The page redirects outside the input URL-matching rule." PAGE_REDIRECTS "No current snapshot matches, but a scheduled snapshot exists." HAS_SCHEDULED_SNAPSHOT "No current snapshot matches the checked page and device." NO_RUNNING_SNAPSHOTS "A matching snapshot is selected for tracking." DATA_BEING_TRACKED_TO "Recording is disabled or inclusion targeting does not match the final URL." RECORDINGS_DISABLED "Reserved console finding; current console errors are returned separately." CONSOLE_ERRORS } """ Cursor-paged recording feed metadata returned by `recordingsList`; `nextPageCursor` is opaque and accumulates previously seen ids for infinite-scroll pagination. """ type RecordingsListMeta { recordings: [Recording!]! "Opaque cursor accumulating all previously seen recording ids; pass to `recordingsList.cursor`." nextPageCursor: String! "Whether the fetched page reached the requested limit; a following page may still be empty." hasNextPage: Boolean! } """ Page-based group result wrapper used by `recordingsInGroup`; the response echoes the resolved page number instead of emitting cursor metadata. """ type RecordingsInGroupMeta { recordings: [Recording!]! "Resolved page number from `recordingsInGroup`; defaults to 1." page: Int! } """ Normalized recording view used across list and detail queries, including derived page names, converted monetary values, watch state, and per-viewer permissions. Returned by `recordingsList`, `recordingsInGroup`, `visitorsRecordingsDetails`, and `recording`. """ type Recording { "Numeric recording id for tag, watch, delete, and `sharedUrl` operations; `recording` instead takes `hashedId`." id: Int! "Recording owner account id, serialized as a string." userId: String! "Raw session identifier; differs from both numeric `id` and public `hashedId`." sessionId: String! "Recorded visitor id; null when absent. Search it with `visitorsRecordings`." visitorId: String "Site id for scoping recordings queries." siteId: Int! "Recording start time in Unix seconds." recordedAt: Int! "Session duration in seconds." duration: Int! visitedPagesCount: Int! "Device category derived from the recorded device code and version; null when the code cannot be mapped." device: SnapshotDevice browser: RecordingBrowser! os: RecordingOs! "Resolved country; null when absent or unrecognized." country: Country tags: [String!]! "Last recorded event time in Unix seconds." lastEventAt: Int! "Final session value, with original and display currency amounts scaled by 10,000." finalValue: SessionValue! "Recorded first-page URL; null when absent." firstPageUrl: String """ Normalized first page: `homepage` or a `/path` when it is on the recording's site, otherwise the normalized URL. `recording` always returns the normalized URL; null when absent. """ firstPageName: String "Recorded last-page URL; null when absent." lastPageUrl: String """ Normalized last page: `homepage` or a `/path` when it is on the recording's site, otherwise the normalized URL. `recording` always returns the normalized URL; null when absent. """ lastPageName: String "Maximum session value, with original and display currency amounts scaled by 10,000." maxValue: SessionValue! "Current viewer's watched time in Unix seconds; null without a watch marker or for shared sessions." viewedAt: Int "Public id derived from numeric `id`; pass to `recording.hashedId`, not to numeric-id mutations." hashedId: String "Recorded custom visitor identifier; null when absent. Search it with `visitorsRecordings`." identifier: String """ Whether the session may still be recording: it has not ended and its last event is under 30 minutes old (or it has no events), or it ended under 5 minutes ago. """ inProgress: Boolean! "Screen width in pixels, serialized as a string; null when absent." screenWidth: String "Screen height in pixels, serialized as a string; null when absent." screenHeight: String "Stored referrer components; individual components may be null." referrer: Referrer "Actions available to the current viewer; view and share also depend on the recording storage horizon." permissions: RecordingPermissions! "Recording format version." version: Int! "Whether the recording is marked valid; false when unset." valid: Boolean! "Recorded virtual-session flag; false when unset." virtual: Boolean! "Generated player session token for this recording, valid for one hour." sessionToken: String } """ Single-recording payload that pairs the recording with its owner id and an opaque cursor token for skip/next navigation. Returned by `recording`. """ type RecordingWithCursor { recording: Recording! "Recording owner account id; the recording object serializes this same id as a string." userId: Int! "Opaque cursor seeded with this recording's numeric id; pass as `cursor` to `recordingsList` to exclude it." skipRecordingCursor: String! } """ Per-viewer capabilities for one recording; `canUpgradeToView` indicates the recording is outside the viewer's storage horizon. Returned with `recordingsList`, `recording`, and `recordingsIdsInGroup`. """ type RecordingPermissions { "Whether the recording is within the viewer's storage horizon." canView: Boolean! "Whether sharing creation is allowed and the recording is within the storage horizon; use `sharedUrl` to share." canShare: Boolean! "Whether the viewer can edit recordings." canDelete: Boolean! "Whether the viewer can edit recording tags." canTag: Boolean! "Whether the session permits watch-state changes." canWatchUnwatch: Boolean! "Whether the recording predates the viewer's storage horizon." canUpgradeToView: Boolean! } """ Cursor-paged normalized page groups with counts and a representative URL for each group. Returned by `recordingsGroups`. """ type RecordingsGroupsMeta { groups: [RecordingGroup!]! "Opaque cursor accumulating seen normalized page-group ids; pass to `recordingsGroups.cursor`." nextPageCursor: String! "Whether the fetched group page reached the remaining requested limit; a following page may be empty." hasNextPage: Boolean! } """ A recordings group keyed by normalized first or last page name rather than a raw URL, with counts scoped to the current viewer and filters payload. Returned by `recordingsGroups`. """ type RecordingGroup { """ Normalized page-group key for `recordingsInGroup.group` and `recordingsIdsInGroup.group`, not a numeric recording id. """ id: String! "Representative group URL with query and fragment removed." url: String! """ Presigned URL of the stored desktop preview image of the representative group URL, as `pageThumbnails` returns it without a capture, or null when there is none. """ thumbnail: String @deprecated(reason: "Use pageThumbnails with the group url.") "Number of matching recordings in this page group." recordingsCount: Int "Matching recordings without a watch marker for the viewer; null when this count is unavailable for the account." unwatchedCount: Int "Most recent matching recording start time in Unix seconds." latestRecording: Int! } "Cursor-paged date buckets returned by `recordingsDateGroups`, ordered by recording date descending." type RecordingsDateGroupsMeta { groups: [RecordingDateGroup!]! "Opaque cursor of the dates already returned." nextPageCursor: String! "Whether the fetched date-group page reached the requested limit; a following page may be empty." hasNextPage: Boolean! } "One recording-date bucket returned by `recordingsDateGroups`, containing the count captured on that date." type RecordingDateGroup { "UTC recording date as YYYY-MM-DD; pass to `recordingsIdsInDateGroup.group`." id: String! "Number of matching recordings starting on this date." recordingsCount: Int } "Numeric recording id, watch state, and permissions returned by `recordingsIdsInGroup` for bulk selection." type RecordingIdInGroup { "Numeric recording id accepted by recording mutations, rather than the public `hashedId`." id: Int! "Current viewer's watched time in Unix seconds; null without a watch marker." viewedAt: Int "Current viewer's recording actions; view and share also depend on the recording storage horizon." permissions: RecordingPermissions! } "Numeric recording id and raw session id returned by `recordingsIdsInDateGroup` for bulk selection." type RecordingIdInDateGroup { "Numeric recording id accepted by recording mutations." id: Int! "Raw session identifier; differs from numeric `id` and public `hashedId`." sessionId: String! } """ Final or maximum session value on a recording's `finalValue` and `maxValue`, expressed as integers scaled by 10,000 (10000 = 1 currency unit) in the indicated currencies. """ type SessionValue { "Display currency code selected for the site, falling back to the account currency and then USD." displayCurrency: String "Amount in `displayCurrency` scaled by 10,000 (10000 = 1 currency unit); returns 0 when no amount can be computed." displayWorth: Int "Original recorded currency; null when absent." originalCurrency: String "Original amount in `originalCurrency` scaled by 10,000; null when absent." originalWorth: Int "True when the original currency differs from `displayCurrency`, so `displayWorth` is a converted amount." isConverted: Boolean! } """ Matched visitor recordings plus a tag rollup computed from those matched recordings only. Returned by `visitorsRecordingsDetails`. """ type VisitorsRecordingsMeta { recordings: [Recording!]! "Tag counts across all matched recordings; can include recordings left out of `recordings`." tags: [TagSummary!]! } "Tag and count of matching recordings returned by `visitorsRecordingsDetails`." type TagSummary { name: String! "Number of matching recordings containing this tag." count: Int! } """ Referrer URL and its stored components returned by `recordingsList` and `recording`; components may be null when absent. """ type Referrer { "Stored referrer URL; null when absent." url: String "Stored referrer domain; null when absent." domain: String "Stored referrer path; null when absent." path: String "Stored referrer parameters as a string; null when absent." params: String } "Resolved country name and code returned by `recordingsList` and `recording`, including the original country value." type Country { "ISO_3166 country name" name: String! "ISO_3166 alpha2 code" code: String! "Original country value used to resolve the displayed country" db: String! } """ Result wrapper for term-based visitor lookups, splitting successful matches from unmatched input terms. Returned by `visitorsRecordings`. """ type VisitorRecordingsResult { "Matches ordered by recording count descending; a term can match both visitor fields." found: [VisitorRecordings!]! "Trimmed, de-duplicated search terms with no matching recordings." notFound: [String!]! } """ Count for one searched term, annotated with whether the backend matched it against `identifier` or `visitorId`. Returned by `visitorsRecordings`. """ type VisitorRecordings { "Search term matched by the indicated visitor field." match: String! "Whether the term matched `identifier` or `visitorId`." field: VisitorFieldMatch! "Recordings matching this term and field in the accessible site scope." count: Int! } "Visitor field that matched a search term in `visitorsRecordings`." enum VisitorFieldMatch { "Match against the custom visitor identifier" IDENTIFIER "Match against the recorded visitor id" VISITOR_ID } "Page boundary used by `recordingsGroups`, `recordingsInGroup`, and `recordingsIdsInGroup`." enum RecordingGroupBy { "Group by normalized landing page" FIRST "Group by normalized exit page" LAST } "Browser family returned with recordings; unrecognized values map to `OTHER`." enum RecordingBrowser { "Chrome browser family" CHROME "Firefox browser family" FIREFOX "Internet Explorer browser family" INTERNET_EXPLORER "Edge browser family" EDGE "Opera browser family" OPERA "Safari browser family" SAFARI "Unrecognized or other browser family" OTHER } "Operating system family returned with recordings; unrecognized values map to `OTHER`." enum RecordingOs { "Android operating system family" ANDROID "iOS operating system family" IOS "Linux operating system family" LINUX "macOS operating system family" MACOS "Windows operating system family" WINDOWS "Windows Phone operating system family" WINDOWS_PHONE "Unrecognized or other operating system family" OTHER } "Sort descriptor for `recordingsList` and `recordingsInGroup`; defaults to recorded time descending." input RecordingsListOrder { "Sort direction; defaults to `DESC`." sort: RecordingsListSortOrder "Primary sort field; defaults to `RECORDED_AT`." field: RecordingsListSortField } "Direction of the selected recordings sort field." enum RecordingsListSortOrder { "Lowest or alphabetically first values first" ASC "Highest or alphabetically last values first" DESC } "Primary sort field for `recordingsList` and `recordingsInGroup`." enum RecordingsListSortField { "Custom identifier, falling back to visitor id" VISITOR_ID "Recording start time" RECORDED_AT "Session duration in seconds" DURATION "Normalized landing page" FIRST_PAGE "Normalized exit page" LAST_PAGE "Recorded device code" DEVICE "Browser family" BROWSER "Operating system family" OS "Stored country value" COUNTRY "Number of visited pages" VISITED_PAGES_COUNT "Maximum session value in a common base currency, with missing values last" MAX_VALUE "Final session value in a common base currency, with missing values last" FINAL_VALUE } "Shared country display name and code returned by `countries`." type CountryOption { name: String! "Country code associated with the displayed country name." code: String! } "Supported currency code and display name returned by `supportedCurrencyCodes`." type CurrencyOption { "Supported uppercase currency code, such as USD." code: String! name: String! } "Supported language code and display name returned by `languages`." type LanguageOption { "Supported language code to use in language conditions." code: String! name: String! } "Cached font-family metadata returned by `googleFonts`, including downloadable font-file locations." type GoogleFont { family: String! "Cached font category; null when not supplied." category: String "Cached variant identifiers, such as regular or italic." variants: [String!]! "Cached character-subset identifiers." subsets: [String!]! "JSON object from the cached catalog mapping variant identifiers to font-file URLs." files: JSON! "Provider version string; null when not supplied." version: String "Provider's last-modified date as YYYY-MM-DD; null when absent." providerLastModified: String "Catalog fetch time in Unix seconds; null when not recorded." fetchedAt: Int } """ A registered page monitored by Page Speed, returned by `pageSpeedPage` or `pageSpeedPages`. Captures are separate desktop or phone runs. """ type PageSpeedPage { "Tracked page ID accepted by `pageSpeedPage`, `pageSpeedRuns`, and `pageSpeedPageRefresh`; not a run ID." id: Int userId: Int siteId: Int sourceUrl: String "Captured page fingerprint; null when not available." fingerprint: String "Latest desktop capture title, falling back to the page title; null when neither is available." title: String "Desktop screenshot URL; null when absent or unavailable." screenshotUrl: String "Phone screenshot URL; null when absent or unavailable." mobileScreenshotUrl: String "Whether scheduled checks are enabled for this tracked page." enabled: Boolean "Next scheduled check time in Unix seconds; null when not scheduled." nextRunAt: Int "Last check scheduling time in Unix seconds; null before scheduling." lastScheduledAt: Int "Latest completion time among the latest device runs, in Unix seconds; null before completion." lastRunAt: Int "True while the page has an active change check." isRefreshing: Boolean! "Tracked page creation time in Unix seconds." createdAt: Int "Latest captured run per available device, desktop then phone; may include incomplete or failed captures." latestRuns: [PageSpeedRun!]! "Guest ID, or account owner ID when no guest exists, that created the tracked page." createdByUserId: Int "Deletion time in Unix seconds; normally null because page queries exclude deleted pages." deletedAt: Int permissions: PageSpeedPagePermissions! } "Input URL and matching tracked page ID returned by `pageSpeedPageDuplicates`." type PageSpeedPageDuplicate { "Zero-based position in the submitted `urls` list." index: Int! url: String! "Tracked page ID accepted by `pageSpeedPage`; null when no existing page matches." pageId: Int } "Page editing permission returned with Page Speed pages." type PageSpeedPagePermissions { "Whether the session can edit; view-only sessions return false." canEdit: Boolean! } """ One immutable page/device capture returned by `pageSpeedRuns` or a tracked page's `latestRuns`. Timestamps and errors describe its lifecycle. """ type PageSpeedRun { "Capture run ID accepted by `pageSpeedRunAnalysis`, `pageSpeedRunAudits`, and `pageSpeedRunRetry`." id: Int "Tracked page ID accepted by `pageSpeedPage` and `pageSpeedRuns`." pageId: Int "Desktop or phone capture profile." device: PageSpeedDevice "Capture trigger string: scheduled, manual, or metadata." trigger: String "Capture scheduling time in Unix seconds; null when absent." scheduledAt: Int "Capture start time in Unix seconds; null before start or when absent." startedAt: Int "Capture completion time in Unix seconds; null before completion or when absent." completedAt: Int "Captured raw-result location; null when no raw data is attached." rawDataUrl: String "Captured Lighthouse version; null when not supplied." lighthouseVersion: String "Captured performance score as a fraction from 0 to 1; null when not supplied." performanceScore: Float "Captured accessibility score as a fraction from 0 to 1; null when not supplied." accessibilityScore: Float "Captured best practices score as a fraction from 0 to 1; null when not supplied." bestPracticesScore: Float "Captured seo score as a fraction from 0 to 1; null when not supplied." seoScore: Float "Provider-formatted agentic browsing score string; null when not supplied." agenticBrowsingScore: String """ JSON object of captured Lighthouse metric audits keyed by metric ID (for example `largest-contentful-paint`), each with fields such as `score` and `displayValue`; null when absent. Keys are not enforced; use `pageSpeedRunAnalysis.metrics` for typed values and units. """ coreMetrics: JSON """ JSON object passed through from captured audit counts; null when absent. This API does not enforce fixed keys; use `pageSpeedRunAnalysis.categories` for typed counts. """ auditCounts: JSON "Capture error text; null when no error is recorded." error: String } "Metrics and actionable category recommendations returned by `pageSpeedRunAnalysis`." type PageSpeedRunAnalysis { "Capture run ID from `pageSpeedRuns`." runId: Int! device: PageSpeedDevice! "Raw-result Lighthouse version, falling back to the saved run version; null if both are absent." lighthouseVersion: String "LCP, FCP, SI, TBT, CLS, and TTI metrics, including unscored placeholders when data is absent." metrics: [PageSpeedMetric!]! "Performance, accessibility, best practices, and SEO; agentic browsing is included only when captured." categories: [PageSpeedCategory!]! } "Categorized visible audit rows returned by `pageSpeedRunAudits`." type PageSpeedRunAudits { "Capture run ID from `pageSpeedRuns`." runId: Int! device: PageSpeedDevice! "Raw-result Lighthouse version, falling back to the saved run version; null if both are absent." lighthouseVersion: String "Visible audit categories; missing raw results produce empty audit lists." categories: [PageSpeedAuditCategory!]! } "Category score and visible audit rows returned by `pageSpeedRunAudits`." type PageSpeedAuditCategory { id: PageSpeedCategoryId! title: String! "Numeric score as a fraction from 0 to 1; null when no numeric score is supplied." score: Float audits: [PageSpeedAudit!]! } "Normalized audit outcome returned by `pageSpeedRunAudits`, with details for non-passed outcomes." type PageSpeedAudit { id: String! title: String! "Markdown audit explanation; null for passed audits or when absent." descriptionMarkdown: String "Derived outcome using error mode, numeric score, and warnings; not a capture lifecycle state." status: PageSpeedAuditStatus! "Numeric score as a fraction from 0 to 1; null when no numeric score is supplied." score: Float "Captured score display mode; null when absent." scoreDisplayMode: String "Display text derived from captured values, savings, warnings, or outcome." summaryText: String! "Up to five nonempty warnings; empty for passed audits." warnings: [String!]! "Up to five affected resources; empty for passed audits." resources: [PageSpeedResource!]! "Up to five affected elements; empty for passed audits." elements: [PageSpeedElement!]! """ Up to five fallback detail rows, each with up to five scalar cells, only when resource and element details are empty. """ findings: [PageSpeedAuditFinding!]! } "One fallback detail row returned by `pageSpeedRunAudits` when no resource or element details are available." type PageSpeedAuditFinding { cells: [PageSpeedAuditFindingCell!]! } "A labeled scalar cell from an audit detail row returned by `pageSpeedRunAudits`." type PageSpeedAuditFindingCell { "Original detail-column key." key: String! label: String! "String representation of a string, number, or boolean detail value." value: String! } """ One of the six performance metrics returned by `pageSpeedRunAnalysis`, including value, units, score, and related recommendations. """ type PageSpeedMetric { id: String! acronym: String! title: String! "Captured metric explanation in Markdown; null when absent." descriptionMarkdown: String "Raw numeric value in `unit`; null when no numeric value is supplied." value: Float "Unit of `value`; null for missing or unrecognized captured units." unit: PageSpeedMetricUnit "Provider-formatted metric text; null when absent." displayValue: String "Numeric score as a fraction from 0 to 1; null when no numeric score is supplied." score: Float "GOOD at score >= 0.9, NEEDS_IMPROVEMENT at >= 0.5, POOR below 0.5, UNRATED without a numeric score." rating: PageSpeedRating! "Performance scoring weight from the captured audit reference; zero when absent." weight: Int! "Audit IDs linked to this metric in the captured report." recommendationIds: [String!]! } "Category score, audit counts, and actionable recommendations returned by `pageSpeedRunAnalysis`." type PageSpeedCategory { id: PageSpeedCategoryId! title: String! "Captured category explanation in Markdown; null when absent." descriptionMarkdown: String "Numeric score as a fraction from 0 to 1; null when no numeric score is supplied." score: Float "Referenced audits with score equal to 1." passedCount: Int! "Referenced audits with numeric score below 1, excluding manual and not-applicable modes." failedCount: Int! "Referenced audits with manual score display mode." manualCount: Int! "Actionable audits, sorted by estimated milliseconds saved then bytes saved descending, score ascending, then ID." recommendations: [PageSpeedRecommendation!]! } "An actionable audit returned by `pageSpeedRunAnalysis`, ordered by time savings, byte savings, score, and ID." type PageSpeedRecommendation { id: String! category: PageSpeedCategoryId! "Captured audit group key; null when absent." groupId: String "Captured audit group title; null when unavailable." groupTitle: String title: String! "Audit explanation in Markdown; null when absent." descriptionMarkdown: String "Captured technology-specific guidance in Markdown; null when absent." guidanceMarkdown: String "Numeric score as a fraction from 0 to 1; null when no numeric score is supplied." score: Float "Score-derived rating; UNRATED without a numeric score." rating: PageSpeedRating "Captured score display mode; null when absent." scoreDisplayMode: String "Provider-formatted audit value; null when absent." displayValue: String "Captured recognized accessibility impact; null when absent or unrecognized." impact: PageSpeedImpact "Estimated time or byte savings; null when neither numeric estimate is supplied." savings: PageSpeedSavings "Top-level detail item count before resource and element extraction." affectedItemCount: Int! "Performance metric IDs linked to this audit in the captured report." relevantMetricIds: [String!]! resources: [PageSpeedResource!]! elements: [PageSpeedElement!]! } "Estimated time and transfer savings for a Page Speed recommendation." type PageSpeedSavings { "Estimated time saved in milliseconds; null when not supplied." milliseconds: Float "Estimated transfer bytes saved; null when not supplied." bytes: Float } "Affected resource from a Page Speed audit or recommendation." type PageSpeedResource { url: String! "Total or transferred bytes from the captured resource; null when not supplied." totalBytes: Float "Estimated avoidable bytes; null when not supplied." wastedBytes: Float "Estimated avoidable duration in milliseconds; null when not supplied." wastedMilliseconds: Float } "Affected page element from a Page Speed audit or recommendation." type PageSpeedElement { "Captured CSS selector; null when absent." selector: String "Captured node label; null when absent." label: String "Captured HTML snippet; null when absent." snippet: String "Captured explanation for this node; null when absent." explanation: String } "Page Speed report category; agentic browsing appears only when captured results include it." enum PageSpeedCategoryId { "Loading performance metrics and audits, for speed analysis" PERFORMANCE "Accessibility audits, for usability analysis" ACCESSIBILITY "Browser and web-development practice audits, for technical quality" BEST_PRACTICES "Search optimization audits, for discoverability analysis" SEO "Agentic browsing audits, when the captured report supplies this category" AGENTIC_BROWSING } "Rating derived from a numeric score, with an explicit unrated state for absent scores." enum PageSpeedRating { "Numeric score at least 0.9, for good results" GOOD "Numeric score from 0.5 up to 0.9, for results needing improvement" NEEDS_IMPROVEMENT "Numeric score below 0.5, for poor results" POOR "Missing numeric score, for unmeasured results" UNRATED } "Unit attached to a Page Speed metric's raw numeric value." enum PageSpeedMetricUnit { "Duration in milliseconds, for timing metrics" MILLISECONDS "Byte count, for transfer metrics" BYTES "Dimensionless numeric value, for metrics such as layout shift" UNITLESS } "Captured accessibility impact severity for a Page Speed recommendation." enum PageSpeedImpact { "Captured critical accessibility impact" CRITICAL "Captured serious accessibility impact" SERIOUS "Captured moderate accessibility impact" MODERATE "Captured minor accessibility impact" MINOR } "Normalized audit outcome in `pageSpeedRunAudits`; distinct from a run's capture lifecycle." enum PageSpeedAuditStatus { "Numeric score at least 0.9 with no error or warnings" PASSED "Non-error result with warnings or without a passing or failing score" WARNING "Numeric score below 0.5 without a measurement error" FAILED "Measurement error mode, error message, or missing audit data" ERROR } """ Permission snapshot used by page-editor sharing and publishing flows; `account_exists` short-circuits the other fields when no account relationship exists. """ type PageEditorListPermissionsMeta { "Whether the owner/user account relationship exists; other fields are null when false." accountExists: Boolean! "Whether the user can create sites; null without an account relationship." canCreateSite: Boolean "Whether the user can edit the site named by `domain`; null without an account relationship." canAccessSite: Boolean "Whether the site named by `domain` is visible to the user; null without an account relationship." siteExists: Boolean "User role in the owner account; null without an account relationship." role: String } "Installation result returned by `pageEditorCheckScript`, with an optional diagnostic." type PageEditorScriptCheckResponse { "Whether installation is recorded for the site or detected on the page." installed: Boolean! "Failure diagnostic when available; null on success or an unspecified failure." message: String } """ Page editor loaded from an editor UUID, with nested pages and versions eagerly materialized for the editor session. """ type PageEditorResponse { "Editor UUID accepted as `editorId` by page editor operations." id: String! "Associated owner account id; null until the editor is assigned." userId: Int "Page editor token scoped to this editor." token: String! pages: [PageEditorPageResponse!]! } """ One tracked page inside an editor; history is persisted raw and page-level lock or ignore state is exposed as JSON-encoded strings. """ type PageEditorPageResponse { "Page UUID accepted as `pageId` by page editor mutations." id: String! url: String! "Opaque history string saved by `pageEditorUpdateHistory`; null before history is stored." history: String "Signed thumbnail viewing URL valid for one week; null if URL generation fails." thumbnailUrl: String "JSON-encoded array of locked element identifiers; may encode null before any lock is stored." lockedElements: String "JSON-encoded object mapping check ids to element arrays; may encode null before any ignore is stored." ignoredChecks: String "Saved versions of this page, in no guaranteed order." versions: [PageVersionResponse!]! } "Session and quota state returned by `pageCameraIsLoggedIn`." type LoggedInResult { "Always true for a successful authenticated response." loggedIn: Boolean "Whether the session has general edit permission; this is not a per-snapshot eligibility check." canEditSnapshot: Boolean """ True when adding one snapshot exceeds quota; false when the proposal exactly fills quota; null below quota or when no finite quota is available. """ overNumberOfSnapshots: Boolean } """ Upload targets returned by `pageCameraGetUploadPolicy`; existing snapshots use `elements`, while new captures use `fingerprints`. """ type GetUploadPolicyMeta { "Existing snapshot report format version; null for new captures or if no version is recorded." formatVersion: Int "Screenshot upload POST target, valid for 10 minutes with a 50 MiB file-size cap." screenshot: S3PresignPost! """ Element-data upload POST target for an existing snapshot, valid for 10 minutes with a 20 MiB cap; null for new captures. """ elements: S3PresignPost """ Fingerprint upload POST target for a new capture, valid for 10 minutes with a 20 MiB cap; null for existing snapshots. """ fingerprints: S3PresignPost } """ Presigned multipart POST target returned by `pageCameraGetUploadPolicy` and shared upload flows; decode `fields` and send them with the file. """ type S3PresignPost { "Multipart POST endpoint; use the accompanying form fields and file rather than a PUT request." url: String! """ JSON-encoded object of signed multipart form fields; decode and submit every returned key unchanged with the file. """ fields: String! } """ Cursor-based notification list payload. The cursor is derived from ids already seen, and `has_next_page` only indicates whether the current page reached the requested limit. """ type NotificationsListMeta { notifications: [Notification!]! "Opaque cursor containing ids already returned; pass to `notificationsList` for the next page." nextPageCursor: String! "Whether this page reached the requested limit; does not guarantee another nonempty page." hasNextPage: Boolean! } """ Sort options for notification lists. Defaults to newest first and supports derived keys such as channel destination and joined resource name rather than raw notification columns only. """ input NotificationsListOrder { "Sort direction; defaults to descending." sort: SortOrder "Sort key; defaults to creation time." field: NotificationsListSortField } "Sort keys accepted by `notificationsList`." enum NotificationsListSortField { "Creation time, for chronological ordering." CREATED_AT "Channel destination, for grouping delivery targets." DESTINATION "Joined resource display name, for alphabetical ordering." RESOURCE_NAME } "Page-size options for `imageList`." input ImageFilter { "Page size; defaults to 10" limit: Int } "Image list returned by `imageList`, with an opaque cursor and a count-based continuation flag." type ImageListMeta { "Matching images with no guaranteed order; empty when no images match." list: [Image!]! "Opaque token of the image IDs returned so far; passing it back to `imageList` currently fails." nextPageCursor: String! """ True only when the returned count equals 50, independently of `filter.limit`; not a reliable indication of remaining images. """ hasNextPage: Boolean! } """ Stored image metadata returned by `imageList`, `imageDetail`, `imageUpload` and `imageUploadUrls`, with a derived public asset URL. """ type Image { "Image UUID accepted by `imageDetail` and `imageDelete`." id: ID! "Owning account ID." userId: Int! "Associated site ID from `sites`." siteId: Int! "Original upload filename or basename of the remote URL path." filename: String! "MIME type of the stored image format." mime: String! "Stored format extension, derived after normalization." ext: String! "Stored image width in pixels; zero for SVG uploads." width: Int! "Stored image height in pixels; zero for SVG uploads." height: Int! "Stored file size in bytes after normalization." size: Int! "Optional blur placeholder string; null for uploads through these image mutations." blurhash: String "Source label given at upload, such as `surveys`; `imageList` filters on it." source: String "Public asset URL derived from the owning account, site, image UUID and stored extension." publicUrl: String! "Upload time; requesting this field currently returns an error, so omit it." createdAt: Int! } "Lightweight goal reference returned by `goalRefList`, `goalRef`, and `goalsByIds`; may be soft-deleted." type GoalRef { id: Int! "Id of the site the goal belongs to." siteId: Int! name: String """ True when any trigger, soft-deleted ones included, has a value source or every trigger is an `api` or `ecommerce_event` trigger; false when the goal has no triggers. """ hasValue: Boolean "Creation time in Unix seconds." createdAt: Int "Soft-deletion time in Unix seconds; null while the goal is active." deletedAt: Int } "Trigger with its filter, returned inside `goalLinked` and `goalSelectorList` goals." type GoalTriggerLinked { "Trigger id, sent as `id` in `goalEdit` triggers; not a goal id." id: Int! "Trigger kind derived from the filter's `criteria`; `OTHER` for mixed or unrecognized criteria." type: TriggerType! "JSON-encoded trigger filter in the format `goalCreate` and `goalEdit` accept." filter: String! "Soft-deletion time in Unix seconds; null while the trigger is active." deletedAt: Int } """ Goal with trigger filters returned by `goalLinked`, `goalSelectorList`, and the `goal` field of add-ons; may be soft-deleted. """ type GoalLinked { id: Int! "Id of the site the goal belongs to." siteId: Int! name: String "Fallback display label; null when unset." autoName: String """ True when any trigger, soft-deleted ones included, has a value source or every trigger is an `api` or `ecommerce_event` trigger; false when the goal has no triggers. """ hasValue: Boolean "Creation time in Unix seconds." createdAt: Int "Soft-deletion time in Unix seconds; null while the goal is active." deletedAt: Int "All triggers, soft-deleted ones included; check `deletedAt`." triggers: [GoalTriggerLinked!] } "Goal returned by `goalCardList`, with full trigger settings and A/B test counts." type GoalCardGoal { id: Int! "Id of the site the goal belongs to." siteId: Int! name: String "Fallback display label; null when unset." autoName: String "Creation time in Unix seconds." createdAt: Int "All triggers, soft-deleted ones included; check `deletedAt`." triggers: [GoalTriggers!] "A/B tests ever linked to the goal, including drafts and deleted tests." abTestsCount: Int "Linked A/B tests that are neither drafts nor deleted, such as running and stopped tests." abTestsCountActive: Int } "Goal returned by `goalListSummary`, with conversions for the last seven UTC days, including today." type GoalSummary { id: Int! "Id of the site the goal belongs to." siteId: Int! name: String "Fallback display label; null when unset." autoName: String """ Signed URL of the goal's page screenshot, captured in the background after create and edit; the image may not exist yet. """ thumbnailUrl: String "All triggers, soft-deleted ones included; check `deletedAt`." triggers: [GoalTriggers!] "Creation time in Unix seconds." createdAt: Int "A/B tests ever linked to the goal, including drafts and deleted tests." abTestsCount: Int "Linked A/B tests that are neither drafts nor deleted, such as running and stopped tests." abTestsCountActive: Int "Conversions in the last seven UTC days, including today; 0 when there are none." recentConversionsCount: Int "Recent conversion events that carry a session id; 0 when there are none." sessionsCount: Int @deprecated(reason: "The Goals dashboard no longer displays recordings counts") "Soft-deletion time in Unix seconds; null while the goal is active." deletedAt: Int "Editor preference for copying the first trigger's value settings to all triggers; null if unset." syncValues: Boolean """ True when any trigger, soft-deleted ones included, has a value source or every trigger is an `api` or `ecommerce_event` trigger; false when the goal has no triggers. """ hasValue: Boolean """ Resolves creator identity lazily from denormalized creator fields when present, falling back to the owning user lookup otherwise. """ createdBy: User } "Cursor page returned by `goalListSummary`." type GoalSummaryListMeta { "Goals on this page." list: [GoalSummary!]! "Opaque token covering every goal returned so far; pass it as `cursor` to get the next page." nextPageCursor: String! "True when this page is full (row count equals `limit`); the next page can still be empty." hasNextPage: Boolean! } "Cursor page returned by `goalCardList`." type GoalCardListMeta { "Goals on this page." list: [GoalCardGoal!]! "Opaque token covering every goal returned so far; pass it as `cursor` to get the next page." nextPageCursor: String! "True when this page is full (row count equals `limit`); the next page can still be empty." hasNextPage: Boolean! } "Full goal returned by `goalDetail`, including triggers, value settings, and A/B test counts." type Goal { id: Int! "Id of the site the goal belongs to." siteId: Int! name: String "Fallback display label; null when unset." autoName: String """ Signed URL of the goal's page screenshot, captured in the background after create and edit; the image may not exist yet. """ thumbnailUrl: String "All triggers, soft-deleted ones included; send only those with null `deletedAt` to `goalEdit`." triggers: [GoalTriggers!] "Creation time in Unix seconds." createdAt: Int "A/B tests ever linked to the goal, including drafts and deleted tests; null when there are none." abTestsCount: Int "Linked A/B tests that are neither drafts nor deleted; null when the goal never had an A/B test." abTestsCountActive: Int "Soft-deletion time in Unix seconds; null while the goal is active." deletedAt: Int "Editor preference for copying the first trigger's value settings to all triggers; null if unset." syncValues: Boolean """ True when any trigger, soft-deleted ones included, has a value source or every trigger is an `api` or `ecommerce_event` trigger; false when the goal has no triggers. """ hasValue: Boolean """ Resolves creator identity lazily from denormalized creator fields when present, falling back to the owning user lookup otherwise. """ createdBy: User } "Trigger returned within `goalDetail`, `goalCardList`, and `goalListSummary` goals, including soft-deleted triggers." type GoalTriggers { "Trigger id, sent as `id` in `goalEdit` triggers; not a goal id." id: Int! "Trigger kind derived from the filter's `criteria`; `OTHER` for mixed or unrecognized criteria." type: TriggerType! name: String "Fallback trigger label; null when unset." autoName: String "Stored code name; the `api` trigger added for Shopify uses the goal name, others are usually null." codeName: String "JSON-encoded trigger filter in the format `goalCreate` and `goalEdit` accept." filter: String! "Creation time in Unix seconds." createdAt: Int! "Soft-deletion time in Unix seconds; null while the trigger is active." deletedAt: Int "Source of the conversion value; null when the trigger has none." valueType: GoalValueType "Fixed amount settings; null unless `valueType` is `FIXED`." fixedValue: GoalFixedValue "Page element settings; null unless `valueType` is `ELEMENT`." elementValue: GoalElementValue } "Kind of a goal trigger, derived from the `criteria` in its filter." enum TriggerType { "Clicks on a chosen element (`click`)" CLICK "Submissions of a chosen form (`form_submission`)" FORM_SUBMISSION "Visits to matching page URLs (`url_visit`)" URL_VISIT "Conversion codes the page reports through `CE2.converted` (`code`)" CODE "Events seen by an ad or analytics pixel such as Meta or GA4 (`pixel_event`)" PIXEL_EVENT "Events reported through the Crazy Egg API, created automatically (`api`)" API "Cart and checkout events from an e-commerce platform (`ecommerce_event`)" ECOMMERCE_EVENT "Mixed or unrecognized criteria in one filter" OTHER } "Sort options for `goalListSummary`; omitted fields default to `ID` descending." input GoalListOrder { "Direction; defaults to `DESC`." sort: GoalListSortOrder "Sort key; defaults to `ID`." field: GoalListSortField } "Direction for sorting `goalListSummary` results." enum GoalListSortOrder { "Ascending, smallest or earliest first" ASC "Descending, largest or latest first" DESC } "Field used to order `goalListSummary`; `CONVERSIONS` and `AB_TESTS` return all remaining goals in one page." enum GoalListSortField { "Goal id" ID "Goal name" NAME "Creation time" CREATED_AT "Conversions in the last seven UTC days, including today" CONVERSIONS "Linked A/B tests that are neither drafts nor deleted" AB_TESTS } """ Sort options for `goalPageConversions`. A supplied object defaults to `TOTAL_CONVERSIONS` ascending, while omitting the object sorts descending. """ input GoalPageConversionsOrder { "Direction; defaults to `ASC` inside a supplied object." sort: SortOrder "Sort key; defaults to `TOTAL_CONVERSIONS`. Ties sort by page URL ascending." field: GoalPageConversionsSortField } "Metric used to sort `goalPageConversions` rows." enum GoalPageConversionsSortField { "Page URL, alphabetically" PAGE_URL "Number of conversion events" TOTAL_CONVERSIONS "Visitors counted on the page of their first conversion" TOTAL_VISITORS "Conversion value, compared before currency conversion" TOTAL_VALUE } """ Sort options for `goalConversionBreakdown`. A supplied object defaults to `TOTAL_CONVERSIONS` ascending, while omitting the object sorts descending. """ input GoalConversionBreakdownOrder { "Direction; defaults to `ASC` inside a supplied object." sort: SortOrder "Sort key; defaults to `TOTAL_CONVERSIONS`. Ties sort by dimension value ascending." field: GoalConversionBreakdownSortField } "Metric used to sort `goalConversionBreakdown` rows." enum GoalConversionBreakdownSortField { "Dimension value, alphabetically, before device codes become labels" DIMENSION_VALUE "Number of conversion events" TOTAL_CONVERSIONS "Visitors counted in the group of their first conversion" TOTAL_VISITORS "Conversion value, compared before currency conversion" TOTAL_VALUE } "Visitor or traffic attribute used to group `goalConversionBreakdown` rows; missing values are grouped as `(not set)`." enum GoalConversionDimension { "Referrer URL of the converting visit" REFERRER "Visitor country" COUNTRY "Landing page of the converting visit" LANDING_PAGE "Device type, shown as `Desktop`, `Phone`, or `Tablet` when recognized" DEVICE "`New` or `Returning` visitor" NEW_VS_RETURNING "`utm_source` campaign parameter" UTM_SOURCE "`utm_medium` campaign parameter" UTM_MEDIUM "`utm_campaign` campaign parameter" UTM_CAMPAIGN "`utm_term` campaign parameter" UTM_TERM "`utm_content` campaign parameter" UTM_CONTENT } "Conversion totals returned by `goalCounts`, with a row per trigger." type GoalCounts { "Conversion events in the range." conversionsCount: Int! "Distinct converting visitors in the range." uniqueConversionsCount: Int! "Total conversion value in the site's display currency." totalValue: GoalValue! "A row per active trigger plus id -1 for deleted or unrecognized triggers, including zero rows." triggers: [GoalCountsTrigger!]! } "Per-trigger totals returned by `goalCounts`." type GoalCountsTrigger { "Trigger id from `goalDetail` triggers, or -1 for conversions from deleted or unrecognized triggers." id: Int! "Conversion events in the range." conversionsCount: Int! "Visitors whose first conversion in the range came from this trigger." uniqueConversionsCount: Int! "Total conversion value in the site's display currency." totalValue: GoalValue! } "Time bucket returned by `goalDistribution`, with totals and a row per trigger." type GoalDistribution { "Bucket start in Unix seconds, at midnight UTC." startAt: Int! "Bucket end in Unix seconds, capped at the range end." endAt: Int! "Conversion events in this bucket." conversionsCount: Int! "Visitors whose first conversion in the whole range falls in this bucket." uniqueConversionsCount: Int! "Total conversion value in the site's display currency." totalValue: GoalValue! "A row per active trigger plus id -1 for deleted or unrecognized triggers, including zero rows." triggers: [GoalDistributionTrigger!]! } "Per-trigger metrics within a `goalDistribution` bucket." type GoalDistributionTrigger { "Trigger id from `goalDetail` triggers, or -1 for conversions from deleted or unrecognized triggers." id: Int! "Conversion events in this bucket." conversionsCount: Int! "Visitors whose first conversion in the whole range falls in this bucket and came from this trigger." uniqueConversionsCount: Int! "Total conversion value in the site's display currency." totalValue: GoalValue! } "Numbered page returned by `goalPageConversions`." type GoalPageList { "Rows on this page." list: [GoalPage] "Pagination totals across all matching rows." meta: GoalPagePaginationMeta } "Conversion metrics for one page, returned by `goalPageConversions`." type GoalPage { "Page URL recorded with the conversion; rows are grouped by it." pageUrl: String "Conversion events on this page." totalConversions: Int "Visitors whose first conversion in the range happened on this page." totalVisitors: Int "Total conversion value in the site's display currency." totalValue: GoalValue } "Pagination totals returned by `goalPageConversions` and `goalConversionBreakdown`." type GoalPagePaginationMeta { "Page number starting at 1." page: Int "Rows per page, as requested." perPage: Int "Matching rows across all pages." total: Int "Number of pages, rounded up; 0 when nothing matches." totalPages: Int } "Numbered page returned by `goalConversionBreakdown`." type GoalConversionBreakdownList { "Rows on this page." list: [GoalConversionBreakdown] "Pagination totals across all matching rows." meta: GoalPagePaginationMeta } "Conversion metrics for one dimension value, returned by `goalConversionBreakdown`." type GoalConversionBreakdown { """ Group value; missing values are `(not set)`, device codes become `Desktop`, `Phone`, or `Tablet`, and visitor history is `New` or `Returning`. """ dimensionValue: String "Conversion events in this group." totalConversions: Int "Visitors whose first conversion in the range falls in this group." totalVisitors: Int "Total conversion value in the site's display currency." totalValue: GoalValue } "Fixed conversion amount configured on a trigger, returned by `goalDetail`." type GoalFixedValue { "Amount per conversion as a decimal string in `currency` units." worth: String! "Currency code of `worth`, for example `USD`." currency: String! } "Element-based conversion amount configured on a trigger, returned by `goalDetail`." type GoalElementValue { "Currency code of the amount shown in the element, for example `USD`." currency: String! "Page scope and selectors of the amount element." condition: GoalValueCondition! } "Page scope and device-specific CSS selectors of the element that shows the conversion amount." type GoalValueCondition { "Where the amount is read." trackingOption: GoalTrackingOption! "How the selectors were chosen." elementSelectorType: GoalElementSelectorType! "URL of the page where the amount element was selected." pageUrl: String! "URL pattern used with `WILDCARD`; null otherwise." wildcardUrl: String "Page URL or wildcard pattern the value applies to; null for any page." onPage: String "True when the value applies on any page; null otherwise." onAnyPage: Boolean "CSS selector for the amount element on desktop." selectorForDesktop: String! "CSS selector for the amount element on tablet." selectorForTablet: String! "CSS selector for the amount element on phone." selectorForPhone: String! } """ Monetary total returned by `goalCounts`, `goalDistribution`, `goalPageConversions`, and `goalConversionBreakdown`; `displayWorth` is in ten-thousandths of `displayCurrency`. """ type GoalValue { """ Currency code of `displayWorth`: the site's currency, else the account's, else USD. Falls back to USD when no exchange rate exists. """ displayCurrency: String "Amount in ten-thousandths of `displayCurrency`, rounded; divide by 10000 for currency units." displayWorth: Int } "Where an element-based conversion amount is read, set by `goalCreate` and `goalEdit` and returned by `goalDetail`." enum GoalTrackingOption { "Read the amount on any page" ANY_PAGE "Read the amount on one page, given in `onPage`" SPECIFIC_PAGE "Read the amount on pages matching `wildcardUrl`" WILDCARD } "How the element selectors of a conversion amount were chosen." enum GoalElementSelectorType { "Selectors written by hand; choose this when supplying your own CSS selectors" MANUAL "All elements similar to the picked one; the web app no longer offers this mode" BROAD "Only the exact element picked on the page" SPECIFIC } """ A Google Analytics property imported for the current user, including enablement state and importer status surfaced from metadata records rather than live GA lookups. Returned by gaProperties and setEnabledGaProperties. """ type GaProperty { "Google Analytics property ID, accepted by `setEnabledGaProperties`; not an internal record ID." id: Int name: String "Import enablement time in Unix seconds; null when disabled." enabledAt: Int "Last successful import time in Unix seconds; null before a successful import." lastSuccessAt: Int "Last stored import error; null when no error is stored." lastError: String "Oldest imported data timestamp in Unix seconds; null before data is imported." oldestImportedDataAt: Int accountId: Int accountName: String "Stored Google Analytics property timezone; null when unavailable." currentTimezone: String "Whether the property is still marked newly discovered; saving enabled properties clears this flag." isNew: Boolean "Property record creation time in Unix seconds." createdAt: Int } """ One ordered step for `funnelResult`. A leading VISIT uses site-wide visitors and sessions; GOAL steps count recorded conversions from the goal's configured triggers, with no URL-matching fields in this input. """ input FunnelStep { "Numeric goal ID from `goalRefList`; required for `GOAL` steps and omitted for a leading `VISIT` step." id: ID "`VISIT` for an optional first baseline step, or `GOAL` for a goal step with `id`." type: FunnelType } "Step-local conversion value returned by `funnelResult`, converted to the site's display currency." type FunnelValue { "Site's configured display currency code." displayCurrency: String """ Rounded integer in ten-thousandths of `displayCurrency`; 10000 represents one currency unit. Visit steps have zero value. """ displayWorth: Int } """ Metrics for a single funnel step. Value is step-local rather than cumulative, and conversion rates compare this step with the next step in sequence, so the last step has null rates. """ type FunnelStepResult { "Distinct visitors reaching this goal in sequence; visit baseline sums daily visitor counts." uniqueVisitors: Int! "Conversion event count reaching this goal in sequence; visit baseline counts sessions." totalVisitors: Int! "Sum of this step's conversion values after reaching the prior goal; not cumulative across steps." value: FunnelValue! """ Next-step visitor count divided by this step's count, as percent rounded to two decimals; zero for a zero denominator, null for the final step. """ uniqueConversionRate: Float """ Next-step event count divided by this step's count, as percent rounded to two decimals; zero for a zero denominator, null for the final step. """ totalConversionRate: Float } """ Top-level funnel response containing the full-range summary and the same ordered steps grouped into day, week, or month buckets. """ type FunnelQueryResult { "Full-window counts in input step order; rates compare adjacent counts from this full sequence." steps: [FunnelStepResult!]! "Chronological buckets; bucket rates are calculated independently for each adjacent step pair." timeUnitResults: [TimeUnitResult!]! } """ One chronological bucket in `funnelResult`. Goal counts are attributed to the visitor's earliest matching goal event period; the final bucket end is capped at the requested end. """ type TimeUnitResult { "UTC bucket start in Unix seconds; day buckets start at midnight." startAt: Int! "UTC bucket end in Unix seconds, capped at the requested end." endAt: Int! "Step counts for this bucket, in input step order." steps: [FunnelStepResult!]! } """ Cursor-paginated funnel list response. `next_page_cursor` is always returned, even on the first page, and encodes ids already seen by the client. """ type FunnelListMeta { funnels: [Funnel!]! "Opaque accumulated funnel IDs to pass to the next `funnelList` request." nextPageCursor: String! "True when the returned count equals the limit; another page may still be empty." hasNextPage: Boolean! } """ Sort options shared by funnel list queries. When omitted, queries sort by newest created funnel first. """ input FunnelListOrder { "Direction, default DESC." sort: SortOrder "Sort key, default CREATED_AT." field: FunnelListSortField } "Saved funnel ranking key for `funnelList` and `funnelsUsingGoals`." enum FunnelListSortField { "Creation time, for newest or oldest definitions" CREATED_AT "Funnel name, for alphabetical ranking" NAME } "Step kind accepted by `funnelResult`; a visit step can appear only first." enum FunnelType { "Synthetic site-visit baseline, only as the first step without a goal ID" VISIT "Goal conversion step, requiring a numeric goal ID belonging to the site" GOAL } """ Wrapper object used by the folders query; folder items are returned under `list` instead of as a bare top-level array. """ type FolderList { list: [Folder] } "Folder lookup scoped by site and a string-backed folder type such as `snapshots`." input FolderListFilter { "Site id from `sites`; results are restricted to sites accessible to the caller." siteId: Int! "Folder type: `snapshots`, `recordings`, `ab_testing`, or `editor`; filters by exact string." type: String! } """ Cursor-based aggregate results for `uniqueErrorList`; `nextPageCursor` is an opaque token built from previously returned fingerprint IDs. """ type UniqueErrorListResults { "True when the returned group count equals the limit; another page may still be empty." hasNextPage: Boolean! "Opaque accumulated fingerprint IDs to pass to the next `uniqueErrorList` request." nextPageCursor: String! uniqueErrors: [UniqueErrorListItem!]! } """ Aggregate counters for the filtered unique-error set. Missing database aggregates are normalized to zero before they reach GraphQL clients. """ type UniqueErrorListStatsResults { "Matching fingerprint-group count; summary-based results may instead return cumulative occurrence counts." count: Int! "Distinct identified users, falling back to visitor IDs; zero when unavailable." usersAffected: Int! "Distinct affected URL count; zero when unavailable." pagesAffected: Int! "Distinct browser-group count; zero when unavailable." browsersAffected: Int! } """ Page-number based occurrence results for `errorList`; `page` echoes the parsed request page rather than a cursor position. """ type ErrorListResults { "One-based request page number." page: Int! errors: [Error!]! } """ One recorded JavaScript error occurrence joined with session metadata. Some fields are conditionally omitted when the viewer cannot access the related recording anymore. """ type Error { "Occurrence UUID accepted by `error`; distinct from the fingerprint MD5 and recording ID." id: String! """ Text identifying similar occurrences; null if absent or outside recording retention. Not the MD5 accepted by fingerprint queries. """ fingerprint: String """ Group identifier for `uniqueError`, `errorList`, and `updateError`; null if absent or outside recording retention. Not an occurrence UUID. """ fingerprintMd5: String "Captured error name; null if absent or the linked recording is outside retention." errorName: String "Captured error message; null when not captured." errorMessage: String "Captured script filename; null if absent or outside recording retention." fileName: String "Captured script line number; null if absent or outside recording retention." lineNumber: Int "Captured script column number; null if absent or outside recording retention." columnNumber: Int "Unix seconds when the occurrence was captured." createdAt: Int! "Linked recording deletion time in Unix seconds; null when not deleted." deletedAt: Int "Occurrence page URL; null if absent or outside recording retention." url: String "Linked session referrer; null if absent or outside recording retention." referrer: String "Custom visitor identifier; null when not captured." identifier: String "Visitor identifier from the linked session; null when not captured." visitorId: String "Captured stack frames; null if absent or outside recording retention." stackTrace: [String] "Linked session operating system; null outside recording retention." os: RecordingOs "Recorded browser group and parsed major version; version is omitted outside recording retention." browser: ErrorBrowser "Resolved linked-session country; null if unrecognized, absent, or outside retention." country: Country "Linked session device category; null outside recording retention." device: SnapshotDevice "Captured user agent; null if absent or outside recording retention." userAgent: String "Captured IP address; null if absent or outside recording retention." ipAddress: String "Tracking session identifier; use `hashedId` for the recording's API ID." sessionId: String "Current guest's recording view time in Unix seconds; null if unseen, shared, or outside retention." sessionViewedAt: Int "Encoded recording ID derived from the linked session; accepted by `recording`." hashedId: String "Captured screen width in pixels; null if absent or outside recording retention." screenWidth: Int "Captured screen height in pixels; null if absent or outside recording retention." screenHeight: Int "Captured application version; null when not captured." appVersion: String "Linked recording validity flag; null when absent." valid: Boolean "Tracking script version; null if absent or outside recording retention." scriptVersion: String """ Capability and retention-derived flags for the linked recording; use these to decide whether to expose view/share actions or an upgrade prompt. """ permissions: ErrorPermissions "Linked session tags; null if absent or outside recording retention." tags: [String] } """ Summary row for one error fingerprint. Status fields come from the persisted summary record, while `last_*` fields describe the newest matching occurrence. """ type UniqueError { "Not populated by this summary response; resolves to null." userId: Int "Not populated by this summary response; resolves to null." siteId: Int "Text identifying similar error occurrences; not the MD5 accepted by fingerprint queries." fingerprint: String! "Group identifier accepted by `uniqueError`, `errorList`, and `updateError`; not an occurrence UUID." fingerprintMd5: String! "Latest occurrence's captured error name; null when absent." errorName: String "Most recent occurrence time in Unix seconds." lastSeen: Int! "Latest occurrence's message across the fingerprint history; null when absent." lastErrorMessage: String "Latest occurrence's captured application version; null when absent." lastAppVersion: String "Current saved workflow status, independent of occurrence IDs." status: ErrorStatusEnum! "Guest who last updated the workflow; null before a recorded update." statusChangeGuestId: Int "Unix seconds of the last workflow update; null before a recorded update." statusChangeAt: Int } """ Timeframe-scoped metrics for one fingerprint; aggregate counts are normalized to zero when no matching occurrences fall inside the requested range. """ type UniqueErrorStats { userId: Int siteId: Int "Group identifier accepted by `uniqueError`, `errorList`, and `updateError`; not an occurrence UUID." fingerprintMd5: String! "Occurrence count in the requested window; zero when there are no matches or the metric is unavailable." count: Int! "Distinct identified users, falling back to visitor IDs; zero when unavailable." usersAffected: Int! "Distinct affected URL count; zero when unavailable." pagesAffected: Int! "Distinct browser-group count; zero when unavailable." browsersAffected: Int! } """ Aggregate list item for one fingerprint. Ratio fields are fractions from 0 to 1 over distinct visitors in the filtered timeframe, not percentages. """ type UniqueErrorListItem { userId: Int! siteId: Int! "Text identifying similar error occurrences; not the MD5 accepted by fingerprint queries." fingerprint: String! "Group identifier accepted by `uniqueError`, `errorList`, and `updateError`; not an occurrence UUID." fingerprintMd5: String! "Most recent occurrence time in Unix seconds." lastSeen: Int! "Occurrence count; summary-based results may use the fingerprint's cumulative count." count: Int! "Distinct affected URL count; zero when unavailable." pagesAffected: Int! "Affected distinct visitors divided by all site visitors in the window, from 0 to 1; zero when unavailable." visitorsAffectedRatio: Float! """ Affected distinct visitors who bounced divided by all site visitors in the window, from 0 to 1; zero when unavailable. """ bounceRatio: Float! """ Affected distinct visitors with rage clicks divided by all site visitors in the window, from 0 to 1; zero when unavailable. """ rageClickRatio: Float! "Latest occurrence's message across the fingerprint history; null when absent." lastErrorMessage: String } """ A status-history entry or note attached to a fingerprint. The first returned item may be synthetic and have a `nil` ID when it represents the initial unresolved state. """ type UniqueErrorNote { "History entry ID; null for the synthetic initial unresolved entry." id: String userId: Int! siteId: Int! "Group identifier accepted by `uniqueError`, `errorList`, and `updateError`; not an occurrence UUID." fingerprintMd5: String! "Acting guest ID; null for the synthetic initial entry." guestId: Int "Acting guest's current name; null when the guest cannot be found or the entry is synthetic." guestName: String "Acting guest's avatar URL; null when the guest cannot be found or the entry is synthetic." guestAvatarUrl: String "Unix seconds when this entry was created; for the synthetic initial entry, the first occurrence time." createdAt: Int! code: UniqueErrorNoteCode! "Status set by this entry; null for a note-only entry." status: ErrorStatusEnum "Optional note text; null when no text was supplied." note: String } "Browser name and major version attached to an occurrence returned by `error` or `errorList`." type ErrorBrowser { name: RecordingBrowser "Major browser version parsed from the user agent; empty when unrecognized, null outside retention." version: String } "Recording access and sharing flags attached to an error occurrence." type ErrorPermissions { "True while the occurrence is within recording retention." canView: Boolean! "True when the viewer has sharing-create access." canShare: Boolean! "True when the occurrence is older than recording retention." canUpgradeToView: Boolean! } "Sort input for occurrence queries. Defaults to newest `createdAt` first when omitted." input ErrorsOrder { "Sort direction, default DESC." sort: ErrorsSortOrder "Sort key, default CREATED_AT." field: ErrorsSortField } "Sort input for grouped fingerprint queries. Defaults to newest `lastSeen` first when omitted." input UniqueErrorsOrder { "Sort direction, default DESC." sort: ErrorsSortOrder "Sort key, default LAST_SEEN." field: UniqueErrorsSortField } "Direction for error occurrence and fingerprint ranking." enum ErrorsSortOrder { "Ascending values, for oldest or smallest first" ASC "Descending values, for newest or largest first" DESC } "Sort key for individual occurrences in `errorList`." enum ErrorsSortField { "Fingerprint text, for grouping similar occurrence labels" FINGERPRINT "Occurrence creation time, for chronological ordering" CREATED_AT "Occurrence URL, for page ordering" URL "Recorded operating-system group, for platform ordering" OS "Recorded browser group, for browser ordering" BROWSER "Recorded country, for geographic ordering" COUNTRY "Recorded device code, for device ordering" DEVICE } "Sort key for fingerprint groups in `uniqueErrorList`." enum UniqueErrorsSortField { "Fingerprint text, for alphabetical grouping" FINGERPRINT "Occurrence count, for frequency ranking" COUNT "Most recent occurrence time, for recency ranking" LAST_SEEN "Distinct affected URL count, for page-impact ranking" PAGES_AFFECTED "Affected visitor fraction from 0 to 1, for reach ranking" VISITORS_AFFECTED_RATIO "Affected bounced visitor fraction from 0 to 1, for bounce-impact ranking" BOUNCE_RATIO "Affected rage-click visitor fraction from 0 to 1, for frustration ranking" RAGE_CLICK_RATIO } "Kind of entry returned by `uniqueErrorNotes`." enum UniqueErrorNoteCode { "Workflow history entry, including the synthetic initial unresolved state" STATUS_CHANGE } """ Dashboard response grouped into product-area sections. Each section is assembled independently so clients can introspect which metrics are comparative pairs, static counts, or lazy follow-up lookups. """ type Dashboard { goals: DashboardGoals! snapshots: DashboardSnapshots! recordings: DashboardRecordings! abTests: DashboardAbTests! addons: DashboardAddons! "Currently an empty list." suggestions: [DashboardSuggestion]! } """ Goal metrics for the requested site; comparative fields use the current and previous windows, while `topConversions` is ranked only from the current window. """ type DashboardGoals { "Goal conversion event count in each window." totalConversions: DashboardMetricCompare! "Distinct goal count with at least one conversion in each window." withConversions: DashboardMetricCompare! "Count of goals created before the window end and not deleted before its start." active: DashboardMetricCompare! "Up to three goals ranked by descending current-window conversion count." topConversions: [GoalStub]! } "One of the top three goals by current-window conversion count in `dashboard`." type GoalStub { id: Int! name: String! "Conversion event count for the current window." conversions: Int! } """ Snapshot counts split between currently active snapshots and snapshots that ended during the requested window. """ type DashboardSnapshots { "Currently active, unexpired snapshots below their visit limit." active: Int! "Count of stopped snapshots whose stop time falls in the current window." ended: Int! } """ Recording summary for the current window returned by `dashboard`: watched and total counts plus a JSON-encoded sample of recent unwatched sessions. """ type DashboardRecordings { "Recording count in the current window watched by the current guest." watched: Int! "Recording count in the current window." total: Int! "Currently an empty list." interesting: [InterestingRecording]! """ JSON-encoded array of up to 70 recordings in the current window that the current guest has not watched and that last longer than 20 seconds. Each object has keys such as `recording_id` (the hashed ID accepted by `recording`), `first_page_url_normalized`, `duration` (seconds), `visited_pages_count`, `final_worth` (ten-thousandths of `currency`), `errors_count`, and `goal_conversion_count`. """ latestSessions: String! } """ Placeholder for curated recordings; each item can lazily resolve the full recording object when requested. """ type InterestingRecording { id: String! reason: String! "Lazy follow-up lookup for the recording referenced by this suggestion row." recording: Recording } """ A/B test summary returned by `dashboard`. Active tests are site-scoped; visitor and conversion totals are account-wide for the current window. """ type DashboardAbTests { "Currently running test count on this site." active: Int! "Account-wide summed test visitor count in the current window." totalVisitors: Int! "Account-wide summed test conversion count in the current window." totalConversions: Int! } """ Addon metrics merged across surveys and CTAs. Comparative totals use the current and previous windows, while top lists are ranked from the current window only. """ type DashboardAddons { "Currently active survey count on this site." activeSurveys: Int! "Currently active CTA count on this site." activeCtas: Int! "Distinct survey response-group count in each window." totalResponses: DashboardMetricCompare! "CTA click counters over inclusive UTC dates in each window, including paused but excluding deleted CTAs." totalClicks: DashboardMetricCompare! "Up to three active surveys by current-window response count descending." topSurveys: [SurveyStub]! "Up to three published, active, non-deleted CTAs by click counters over inclusive current-window UTC dates." topCtas: [CtaStub]! } "One of the top three active surveys by current-window responses in `dashboard`." type SurveyStub { "Survey add-on identifier, as returned by `addonList`." id: ID! name: String! "Distinct response-group count in the current window." responses: Int! } "One of the top three active CTAs by current-window clicks in `dashboard`." type CtaStub { "CTA add-on identifier, as returned by `addonList`." id: ID! name: String! "CTA click counters over inclusive UTC dates in the current window." clicks: Int! } """ Product suggestions shown on the dashboard. Each suggestion may optionally link to a typed resource reference instead of embedding the target object. """ type DashboardSuggestion { title: String! text: String! resource: SuggestionResource } """ Typed resource reference used by dashboard suggestions so clients can branch on `type` before fetching the underlying object elsewhere. """ type SuggestionResource { type: ResourceType! id: Int! } "Kind of resource referenced by a dashboard suggestion." enum ResourceType { "Goal reference for a goal suggestion" GOAL "Snapshot reference for a heatmap suggestion" SNAPSHOT "Recording reference for a recording suggestion" RECORDING "Error reference for an error suggestion" ERROR "A/B test reference for a test suggestion" AB_TEST "Survey or CTA reference for an add-on suggestion" ADDON } """ Standard compare-pair shape used across the dashboard, keyed as `current` for the requested window and `previous` for the comparison window. """ type DashboardMetricCompare { "Current-window integer; unit is the enclosing count, seconds, or pages metric." current: Int! "Comparison-window integer in the same unit as `current`." previous: Int! } """ Aggregated CTA totals plus a zero-filled daily series so every calendar day in the requested range is represented even when no events were recorded. Returned by ctaResult. """ type CtaResults { id: ID! "Sum of recorded CTA view events across the requested calendar dates." totalViews: Int! "Sum of recorded CTA click events across the requested calendar dates." totalClicks: Int! "Sum of recorded CTA conversion events across the requested calendar dates; zero without events." totalConversions: Int "One entry per calendar date in ascending order, including zero-count days." results: [CtaResult]! } """ One day's CTA counters keyed by a Unix timestamp for the day boundary rather than the original event timestamps. Returned within ctaResult. """ type CtaResult { "UTC day boundary in Unix seconds." date: Int! "CTA view event count for this date." views: Int! "CTA click event count for this date." clicks: Int! "CTA conversion event count for this date; zero without events." conversions: Int } """ Sort options for `channels_list`; when omitted, results default to destination ascending, and destination sorting uses the display value exposed by GraphQL across email, API, Slack, and Zapier channels. """ input ChannelListOrder { "Sort direction; defaults to ascending." sort: SortOrder "Sort key; defaults to destination." field: ChannelListSortField } """ Supported sort keys for `channels_list`; `destination` sorts by the normalized destination string surfaced in GraphQL instead of the underlying storage shape. """ enum ChannelListSortField { "Creation time, for chronological ordering." CREATED_AT "Normalized destination, for grouping delivery targets." DESTINATION } "Product area associated with a release entry returned by `changelog`." enum ChangelogCategory { "A/B testing release entry, for this product area" AB_TESTING "Account release entry, for this product area" ACCOUNT "CTA release entry, for this product area" CTAS "Page editor release entry, for this product area" EDITOR "Error tracking release entry, for this product area" ERRORS_TRACKING "Goal release entry, for this product area" GOALS "Help release entry, for this product area" HELP "Installation release entry, for this product area" INSTALLATION "Live activity release entry, for this product area" LIVE_ACTIVITY "Options release entry, for this product area" OPTIONS "Page Speed release entry, for this product area" PAGE_SPEED "Recording release entry, for this product area" RECORDINGS "Heatmap release entry, for this product area" SNAPSHOTS "Survey release entry, for this product area" SURVEYS "Traffic analysis release entry, for this product area" TRAFFIC_ANALYSIS "Web analytics release entry, for this product area" WEB_ANALYTICS "Funnel release entry, for this product area" FUNNELS } "A changelog entry enriched with the current guest's view state and any media attachments." type ChangelogEvent { id: ID! category: ChangelogCategory! title: String! "Optional release targeting label; null when not set." featureFlag: String "Rendered release content as HTML." contentHtml: String! "Optional release version string; null when not set." version: String "Labels split from comma-separated text; empty when no tags are stored." tags: [String] "Publication timestamp serialized as a UTC datetime string." publishedAt: String! "Not populated; selecting it returns a non-null field error. Every returned entry is already published." published: Boolean! "Media attachments; empty when none are associated." attachments: [ChangelogAttachment!] "Current guest's first seen time in Unix seconds; null before viewing." seenAt: Int "Current guest's saved reaction; null before reacting or viewing." reaction: String } "Per-guest changelog view state returned after a reaction update." type ChangelogView { id: ID! "Guest's first seen time in Unix seconds; null when no time is stored." seenAt: Int "Guest's saved reaction; null when not set." reaction: String } "Image or embedded-media attachment returned with a `changelog` release entry." type ChangelogAttachment { id: ID! "Image URL or embedded player URL." assetUrl: String! "Media kind, such as image or embedded." assetType: String! "Media provider label; null when absent." assetSource: String "Attachment creation timestamp serialized as a datetime string." createdAt: String! } """ Normalized subscription summary derived from the current session's snapshots subscription, with status adjusted for trial credit-card failures and temporary plans. """ type CapabilitySubscription { "Whether the subscription is active, non-temporary, and free of the trial card-failure state." active: Boolean! "Normalized lifecycle state used for subscription alerts and access decisions." state: SubscriptionState! "Subscription end or renewal time in Unix seconds; -1 for free plans, null if no date is available." endDate: Int "Plan metadata; null for a temporary subscription." plan: SubscriptionPlanDetails "The interval the account is committed to going forward (for a trial, the plan it converts to)." billingPeriod: SubscriptionPlanPeriod } """ Public plan metadata exposed alongside the capability subscription; omitted entirely for temporary subscriptions. """ type SubscriptionPlanDetails { name: String "Trial, free, or paid classification of the plan." type: SubscriptionPlanType platform: SubscriptionPlanPlatform "Amount per plan period in the billing currency; this object does not return a currency code." price: Float "Current subscription billing interval; a trial's future interval is exposed as `billingPeriod`." period: SubscriptionPlanPeriod } "Subscription lifecycle state returned by `subscription`." enum SubscriptionState { "The customer created a user account but did not choose a plan" TEMPORARY """ The user has manually canceled the plan but there are still days remaining on the subscription """ CANCELING "The user canceled their plan" CANCELED "The user's payment has failed but they're still within the grace period" EXPIRING "Trial requires a valid credit card and the user has not provided one" TRIAL_CC_FAILED "Expiration is complete" EXPIRED "The user can't access their account until they reactivate it." INACTIVE "The user is on an active plan" ACTIVE } "Trial, free, or paid classification returned in subscription plan details." enum SubscriptionPlanType { "Trial plan, before conversion to the future billing plan." TRIAL "Free plan, without a paid billing commitment." FREE "Paid plan, for a billable subscription." PAID } "Billing platform associated with the subscription." enum SubscriptionPlanPlatform { "Crazy Egg billing, for a directly billed account." CRAZYEGG "Shopify billing, for a Shopify account." SHOPIFY } "Billing interval exposed by the subscription and plan details." enum SubscriptionPlanPeriod { "Monthly interval, for billing measured in months." MONTHLY "Yearly interval, for billing measured in years." YEARLY "Daily interval, for billing measured in days." DAILY } """ Capability map keyed by product area, returned by `capabilities` and `pageEditorCapabilities`. Requested entries combine action permissions with applicable subscription allowances. """ type Capabilities { abTesting: CapabilityWithPermission! adPerformance: CapabilityWithPermission! adsLibraryPreview: CapabilityWithPermission! account: CapabilityAccount! addons: CapabilityWithPermission! ai: CapabilityWithPermission! api: CapabilityWithPermission! audiences: CapabilityAudiences! auditLog: CapabilityWithPermission! billing: CapabilityWithPermission! commenting: CapabilityWithPermission! crazyEggEmailSettings: CapabilityWithPermission! ctas: CapabilityWithPermission! editor: CapabilityWithPermission! errors: CapabilityWithPermission! export: CapabilityWithPermission! funnels: CapabilityWithPermission! ga: CapabilityGa! goals: CapabilityWithPermission! help: CapabilityWithPermission! home: CapabilityWithPermission! installation: CapabilityWithPermission! liveActivity: CapabilityWithPermission! notifications: CapabilityWithPermission! pageSpeed: CapabilityPageSpeed! personalizationCampaigns: CapabilityWithPermission! recordings: CapabilityRecording! sharing: CapabilityWithPermission! siteSettings: CapabilityWithPermission! sites: CapabilitySite! snapshots: CapabilitySnapshot! sso: CapabilityWithPermission! surveys: CapabilityWithPermission! tasks: CapabilityWithPermission! teamSettings: CapabilityWithPermission! trackingOptions: CapabilityWithPermission! trafficAnalysis: CapabilityWithPermission! webAnalytics: CapabilityWebAnalytics! } "Base capability shape for product areas that only expose permission gates and no quota metadata." type CapabilityWithPermission { "Action-specific permission decisions; actions absent from this product area resolve to null." permissions: CapabilityPermission } "Web Analytics permissions and visibility limits returned by `capabilities`." type CapabilityWebAnalytics { "Action-specific permission decisions; actions absent from this product area resolve to null." permissions: CapabilityPermission quotas: CapabilityWebAnalyticsQuota! } "Historical visibility allowance returned in `capabilities.webAnalytics`." type CapabilityWebAnalyticsQuota { "Historical data visibility in months, as configured by the subscription." visibilityMonths: Int } """ Account capability details, including account-level quotas and deletion permission rules that differ from the generic capability shape. """ type CapabilityAccount { "Action-specific permission decisions; actions absent from this product area resolve to null." permissions: CapabilityPermission quotas: CapabilityAccountQuota """ How the account's page views are metered: `all_page_views` counts every script load, so exhausting the quota stops data collection for every feature unless `allow_tracking_after_limit` is set. `legacy` only gates Heatmaps and A/B Testing. """ pageViewMeteringStrategy: String "Whether an `all_page_views` account keeps collecting data past its page-view quota." allowTrackingAfterLimit: Boolean } "Audience permissions and allowed targeting criteria returned by `capabilities`." type CapabilityAudiences { "Action-specific permission decisions; actions absent from this product area resolve to null." permissions: CapabilityPermission allowedTargetingCriteria: AudienceCriterias } "Targeting level and JSON-encoded criterion names returned in `capabilities.audiences`." type AudienceCriterias { "Targeting tier corresponding to the returned criterion names." level: AudienceLevel! "JSON-encoded array of permitted targeting criterion names; an empty array means none." criterias: String! } "Monthly page-view allowance and usage returned in `capabilities.account`." type CapabilityAccountQuota { "Monthly page-view limit and usage; -1 can indicate an uncapped limit." monthlyPageViews: CapabilityQuota } "Recording permissions and recording/storage allowances returned by `capabilities`." type CapabilityRecording { "Action-specific permission decisions; actions absent from this product area resolve to null." permissions: CapabilityPermission quotas: CapabilityRecordingQuota } "Monthly recording and retention allowances returned in `capabilities.recordings`." type CapabilityRecordingQuota { "Monthly recording count allowance and current usage." monthlyRecordings: CapabilityQuota "Recording retention limit in months; current usage is not reported." storageDuration: CapabilityQuota } "Heatmap permissions and capture limits returned by `capabilities`." type CapabilitySnapshot { "Action-specific permission decisions; actions absent from this product area resolve to null." permissions: CapabilityPermission quotas: CapabilitySnapshotQuota } "Heatmap count, visits-per-Heatmap and monthly visit allowances returned in `capabilities.snapshots`." type CapabilitySnapshotQuota { "Heatmap count limit and current count." totalSnapshots: CapabilityQuota "Maximum visits per Heatmap; current usage is not reported." visitsPerSnapshot: CapabilityQuota """ Heatmap visits this month, including adjustments, and the account's effective monthly visit limit: the subscription's own limit when set, otherwise the plan's. A null limit means no visit limit: unlimited, or a bundled plan, which meters page views (`capabilities.account.quotas.monthlyPageViews`) instead. """ monthlyVisits: CapabilityQuota } "Page Speed permissions and monitored-page limits returned by `capabilities`." type CapabilityPageSpeed { "Action-specific permission decisions; actions absent from this product area resolve to null." permissions: CapabilityPageSpeedPermission quotas: CapabilityPageSpeedQuota } "Page Speed navigation, viewing, and editing decisions returned by `capabilities`." type CapabilityPageSpeedPermission { "Whether product navigation is available. Null when this product area does not expose this action." nav: CapabilityPermissionValue "Whether reading this product area is allowed. Null when this product area does not expose this action." view: CapabilityPermissionValue "Whether changing this product area is allowed. Null when this product area does not expose this action." edit: CapabilityPermissionValue } "Monitored-page allowance and usage returned in `capabilities.pageSpeed`." type CapabilityPageSpeedQuota { "Monitored-page count limit and current count." totalPages: CapabilityQuota } "Site permissions and site-count allowance returned by `capabilities`." type CapabilitySite { "Action-specific permission decisions; actions absent from this product area resolve to null." permissions: CapabilityPermission quotas: CapabilitySiteQuota } "Site-count allowance and usage returned in `capabilities.sites`." type CapabilitySiteQuota { "Site-count limit and current count." totalSites: CapabilityQuota } "Google Analytics import permissions and property limits returned by `capabilities`." type CapabilityGa { "Action-specific permission decisions; actions absent from this product area resolve to null." permissions: CapabilityPermission quotas: CapabilityGaQuota } "Imported-property allowance and usage returned in `capabilities.ga`." type CapabilityGaQuota { "Imported Google Analytics property count limit and current count." totalProperties: CapabilityQuota } """ Permission results keyed by action; each action resolves to an `allowed` flag plus an optional machine-readable denial reason such as `upgrade`, `quota`, or `hidden`. """ type CapabilityPermission { "Whether product navigation is available. Null when this product area does not expose this action." nav: CapabilityPermissionValue "Whether reading this product area is allowed. Null when this product area does not expose this action." view: CapabilityPermissionValue "Whether changing this product area is allowed. Null when this product area does not expose this action." edit: CapabilityPermissionValue "Whether creating resources is allowed. Null when this product area does not expose this action." create: CapabilityPermissionValue "Whether managing this product area is allowed. Null when this product area does not expose this action." manage: CapabilityPermissionValue "Whether importing resources is allowed. Null when this product area does not expose this action." import: CapabilityPermissionValue "Specific to recordings" settings: CapabilityPermissionValue "Specific to snapshots" autoExport: CapabilityPermissionValue "Specific to addons" removeBranding: CapabilityPermissionValue "Specific to addons" customDesign: CapabilityPermissionValue "Specific to addons" manageTemplates: CapabilityPermissionValue "Specific to billing" navStatus: CapabilityPermissionValue "Specific to export" csv: CapabilityPermissionValue "Specific to export" json: CapabilityPermissionValue "Specific to AI" summarize: CapabilityPermissionValue "Specific to account" delete: CapabilityPermissionValue "Specific to billing" cancel: CapabilityPermissionValue "Specific to billing" changePlan: CapabilityPermissionValue } """ Normalized permission check result where `allowed` is derived from whether `reason` is present, rather than being computed independently. """ type CapabilityPermissionValue { "True exactly when no denial reason is returned." allowed: Boolean! "Reason the action is denied; null when the action is allowed." reason: CapabilityReasons } """ Allowance and usage returned by `capabilities` for limited features. A null limit generally means uncapped; monthly page views can use -1, and current is null when usage is not reported. """ type CapabilityQuota { "Feature-specific allowance; null usually means uncapped, while monthly page views can use -1." limit: Int "Current feature usage; null when only the configured allowance is reported." current: Int } """ Machine-readable denial reasons returned by capability permissions so callers can distinguish role, plan, visibility, quota, and subscription restrictions. """ enum CapabilityReasons { "User lacks access to the feature because of permissions" PERMISSION "User has to upgrade to a different plan for this feature." UPGRADE "Feature is hidden from the user" HIDDEN "Issue with subscription - trial expired, payment failure, etc" SUBSCRIPTION_ISSUE "Feature is for admins only and the user is not an admin" NOT_ADMIN "Feature can not be accessed because quota limit reached" QUOTA "Contact support to get help/access with this feature" CONTACT_SUPPORT } "Targeting access tier returned with the permitted criterion names." enum AudienceLevel { "No targeting criteria available, when the returned criteria array is empty." NONE "Device-only targeting, for the legacy targeting allowance." LEGACY "Expanded targeting criteria, for the Pro targeting allowance." PRO "Full targeting criteria, for the complete targeting allowance." ALL } "Type of site asset returned by `siteAssets` and selected by `siteAsset`." enum SiteAssetType { "Markdown brand guidelines; the only type `siteAssetRevisionCreate` writes." BRAND_GUIDELINES "Versioned logo image reference; choose for reading logos or use the logo upload and remove mutations." LOGO } "An append-only site asset revision returned by `siteAsset`, `siteAssets`, and `siteAssetRevisions`." type SiteAsset { id: Int! siteId: Int! type: SiteAssetType! "Positive revision number within this site and type; pass it as `expectedRevision` when writing." revision: Int! """ Markdown brand guidelines for BRAND_GUIDELINES; for LOGO, JSON such as {"version":1,"image_id":""}, with `image_id` null after removal. """ content: String! """ Logo image resolved from the stored reference; null for text assets, removed logos, or unavailable images. """ image: Image "Revision author ID, which may identify a team member rather than the account owner." createdByUserId: Int! createdByName: String! "Revision creation time in Unix seconds." createdAt: Int! "Revision update timestamp in Unix seconds." updatedAt: Int! } "An append-only brand guidelines text revision returned by `brandGuideline` and `brandGuidelineRevisions`." type BrandGuideline { id: Int! siteId: Int! "Positive revision number for this site; pass it as `expectedRevision` when writing." revision: Int! "Complete Markdown brand guidelines, at most 50,000 characters." content: String! "Revision author ID, which may identify a team member rather than the account owner." createdByUserId: Int! createdByName: String! "Revision creation time in Unix seconds." createdAt: Int! "Revision update timestamp in Unix seconds." updatedAt: Int! } "One positive account-wide usage total returned by `cancellationMetrics`." type CancellationMetric { key: CancellationMetricKey! value: Int! } "Usage total categories returned by `cancellationMetrics` in cancellation display priority order." enum CancellationMetricKey { "Total tracked goal conversions" CONVERSIONS_TRACKED "Total detected error occurrences" ERRORS_DETECTED "Total A/B experiment visitors" EXPERIMENT_VISITORS "Total recorded sessions" SESSIONS_RECORDED "Total heatmap visits" HEATMAP_VISITS "Total survey submissions, counting each respondent's answers once" SURVEY_RESPONSES "Total call-to-action clicks" CTA_CLICKS "Total tracked analytics visitors" VISITORS_TRACKED "Total funnels built" FUNNELS_BUILT } "Default card summary returned by `defaultPaymentMethod` and `setDefaultPaymentMethod`." type DefaultPaymentMethod { brand: String "Last four card digits as a string." last4: String expMonth: Int expYear: Int } "Cost and timing preview returned by `previewSubscriptionUpdate` before a plan change is applied." type SubscriptionUpdatePreview { "Amount due now in minor units of `currency`, such as cents; null when checkout must supply the price." amountDueNow: Int "Lowercase ISO 4217 code of the previewed charge, such as `usd`; null when nothing was priced." currency: String """ Proration calculation time in Unix seconds; pass it to `updateSubscriptionItems.prorationDate` when present. """ prorationDate: Int requiresCheckout: Boolean! """ When the change takes effect, in Unix seconds: now for immediate changes, the period end or held renewal date for deferred ones, and null for checkout-required previews and reactivations. """ effectiveDate: Int "True when confirming ends the customer's trial now and charges them immediately." endsTrial: Boolean! "Next amount in minor units of `currency`; populated for trial-change previews and otherwise null." nextAmount: Int } "One plan returned by `tieredPricingPlans` with its available monthly and yearly tier catalogs." type TieredPricingPlan { planSlug: String! label: String! monthly: TieredPricingInterval yearly: TieredPricingInterval } "Tiers and companion price IDs for one billing interval returned by `tieredPricingPlans`." type TieredPricingInterval { pageviewsAddonPriceId: String recordingsAddonPriceId: String tiers: [TieredPricingTier!]! } "One volume tier and purchasable price ID returned by `tieredPricingPlans`." type TieredPricingTier { pageviews: Int recordings: Int """ Price for this interval in whole currency units, truncated from minor units; the currency code is not returned. """ price: Int! stripeId: String! } "Plans and available billing intervals returned by `pricingGrid` for the active account." type PricingGridResult { plans: [PricingGridPlan!]! currentPlan: String! showAddOnHeatmaps: Boolean! availableIntervals: [String!]! paymentProvider: String! } "One legacy plan card returned by `pricingGrid` with prices for its available intervals." type PricingGridPlan { name: String! label: String! monthly: PricingGridInterval yearly: PricingGridInterval features: [String!]! } "Price and purchase identifiers for one plan interval returned by `pricingGrid`." type PricingGridInterval { """ Price for this interval in whole currency units, truncated from minor units; the currency code is not returned. """ price: Int! stripeId: String! semrushId: String } "Pricing presentations returned by `pricingExperience` for the active account." enum PricingExperienceKind { "Use `pricingGrid` for the legacy plan picker" LEGACY "Use the returned Analytics and Growth plan cards and comparison data" ANALYTICS_GROWTH } "Pricing presentation, plan cards, and comparison data returned by `pricingExperience`." type PricingExperienceResult { experience: PricingExperienceKind! plans: [PricingExperiencePlan!]! comparison: [PricingComparisonCategory!]! } "One plan card returned by `pricingExperience`, including catalog prices and display text." type PricingExperiencePlan { planKey: String! label: String! subtext: String "Display price text for a plan without a numeric catalog price, such as an enterprise offer." priceLabel: String "Monthly catalog price in whole currency units; the currency code is not returned." monthlyPrice: Int "Annual catalog price in whole currency units; the currency code is not returned." yearlyPrice: Int ctaLabel: String! ctaVariant: String! trafficLabel: String trafficDefault: String recordingsIncluded: String customLabel: String cardFeatures: [PricingCardFeature!]! } "One plan-card feature returned by `pricingExperience` with optional tooltip and link information." type PricingCardFeature { text: String! tooltip: String linkText: String "Stable key the Crazy Egg app maps to a support URL; null for non-linked features." hrefKey: String } "A named group of comparison features returned by `pricingExperience`." type PricingComparisonCategory { "Stable category key; the Crazy Egg app maps it to an icon." key: String! name: String! features: [PricingComparisonFeature!]! } "A feature comparison returned by `pricingExperience` with values and tooltips keyed by plan." type PricingComparisonFeature { "Stable feature key; the Crazy Egg app maps it to a support URL when one exists." key: String! name: String! "Per-plan cell value keyed by plan key: boolean or display string." values: JSON! "Per-plan tooltip keyed by plan key; only present where a tooltip exists." tooltips: JSON! } """ Cursor-paged history returned by `paymentTransactionList`; `hasNextPage` is true when the page fills the requested limit, so one further request may be empty. """ type PaymentTransactionListMeta { paymentTransactions: [PaymentTransaction!]! "Opaque pagination token; pass unchanged as `paymentTransactionList.cursor`." nextPageCursor: String! hasNextPage: Boolean! } """ A stored billing-history entry returned by `paymentTransactionList` and `paymentTransaction`; company ID and VAT reflect the current billing profile. """ type PaymentTransaction { id: Int! """ Transaction amount in decimal billing currency units; refunds are negative and the currency code is not returned. """ amount: Float paymentType: PaymentType "Entry creation time in Unix seconds." createdAt: Int! "Saved masked or last-four card number text; null when unavailable." cardNumber: String planName: String companyName: String companyId: String companyVat: String companyAddress: BillingAddress address: BillingAddress paypalEmail: String description: String firstName: String lastName: String paymentMethodType: String } """ Sort options for `paymentTransactionList`. When omitted, results default to `CREATED_AT` ascending before cursor filtering is applied. """ input PaymentTransactionListOrder { "Sort direction; defaults to `ASC`." sort: PaymentTransactionListSortOrder "Sort field; defaults to `CREATED_AT`." field: PaymentTransactionListSortField } "Fields available for ordering stored history in `paymentTransactionList`." enum PaymentTransactionListSortField { "Order by the stored decimal transaction amount" AMOUNT "Order by billing entry category" PAYMENT_TYPE "Order by entry creation time" CREATED_AT "Order by the saved card number text" CARD_NUMBER "Order by the associated plan name" PLAN_NAME } "Sort direction used by `paymentTransactionList`." enum PaymentTransactionListSortOrder { "Sort the selected field in ascending order" ASC "Sort the selected field in descending order" DESC } "Billing-history entry categories returned by `paymentTransactionList` and `paymentTransaction`." enum PaymentType { "Charge or plan change the customer started" USER_CHARGE "Recurring charge or plan change applied automatically" AUTOMATED_CHARGE "Refund of an earlier charge; `amount` is negative" REFUND "Charge outside the subscription, labeled `One Time Charge`" ONE_TIME_CHARGE "Charge recorded manually by Crazy Egg, labeled `Manual Charge`" MANUAL_CHARGE } """ Paginated audit-log results containing heterogeneous actions plus an opaque cursor that must be passed back unchanged to continue the feed. """ type AuditableActionListResults { auditableActions: [AuditableAction] "Opaque per-action seen-id cursor to pass unchanged to `auditableActionList`." nextPageCursor: String! "True for any nonempty page; request the next page to establish exhaustion." hasNextPage: Boolean! } """ One audit log entry returned by `auditableActionList`; the concrete type names the action, so select fields with inline fragments per type. """ union AuditableAction = | AbTestRatioChange | AudienceEdited | InternalUrlVisited | BillingChange | RecordingSettingsChange | DeletedSite | DeletedSnapshots | DeletedRecordings | DeletedAbTest | DuplicatedAbTest | SnapshotsCreated | SnapshotSettingsChange | SurveyCreated | SurveyEdited | SurveyToggled | DeletedSurvey | SurveyViewResponses | CtaCreated | CtaEdited | CtaToggled | DeletedCta | CtaViewResponses | GoalCreated | PageSpeedReportCreated | PageSpeedReportDeleted | PageSpeedReportTriggered "A/B test traffic-allocation change returned in `auditableActionList`." type AbTestRatioChange { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "Whether the action was recorded as an administrative action." admin: Boolean! "A/B test id associated with the action." flowId: Int! "Automatic or manual classification of the allocation change." changeType: AbTestRatioChangeType! "JSON-encoded saved traffic-allocation values before the change." oldRatios: String! "JSON-encoded saved traffic-allocation values after the change." newRatios: String! "JSON-encoded view counters captured when allocation changes." currentViews: String! "JSON-encoded conversion counters captured when allocation changes." currentConversions: String! "Action time in Unix seconds." timestamp: Int! } "Audience definition edit and affected add-ons returned in `auditableActionList`." type AudienceEdited { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "Whether the action was recorded as an administrative action." admin: Boolean! audienceId: ID! "Action time in Unix seconds." timestamp: Int! "Inline JSON audience definition before the edit; null when not captured." previousDefinition: JSON "Inline JSON audience definition after the edit; null when not captured." resultingDefinition: JSON "Captured affected add-ons; empty when no affected-resource details were recorded." affectedResources: [AudienceAffectedResource!]! "Captured affected-resource count; defaults to zero when not recorded." affectedResourceCount: Int! } "Add-on affected by an audience edit, with attachment slots and publication state returned in `auditableActionList`." type AudienceAffectedResource { "Survey or CTA add-on id accepted by `addonDetail`." resourceId: ID! resourceType: AddonType! "Primary or draft audience attachments affected on this add-on." slots: [AudienceAttachmentSlot!]! "Add-on publication state captured at the audience edit." publicationState: AudienceResourcePublicationState! } "Visit to an application URL returned in `auditableActionList`." type InternalUrlVisited { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String sessionId: String! url: String! "Whether the action was recorded as an administrative action." admin: Boolean! "Action time in Unix seconds." timestamp: Int! } "Billing detail change returned in `auditableActionList`." type BillingChange { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "JSON-encoded billing details before the change." oldBillingDetails: String! "JSON-encoded billing details after the change." newBillingDetails: String! "`automated` when no person triggered the change (a billing system event), `manual` otherwise." source: String! "Action time in Unix seconds." timestamp: Int! } "Recording settings change for a site returned in `auditableActionList`." type RecordingSettingsChange { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String siteId: Int! "JSON-encoded recording settings before the change." oldRecordingSettings: String! "JSON-encoded recording settings after the change." newRecordingSettings: String! "Action time in Unix seconds." timestamp: Int! } "Site deletion with captured identifiers returned in `auditableActionList`." type DeletedSite { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "Captured deleted site name; null when not recorded." siteName: String "Deleted site id; null when not recorded and may no longer resolve." siteId: Int "Whether the action was recorded as an administrative action." admin: Boolean! "Action time in Unix seconds." timestamp: Int! } "Heatmap deletion with affected ids returned in `auditableActionList`." type DeletedSnapshots { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String snapshotIds: [Int!]! "Action time in Unix seconds." timestamp: Int! } "Recording deletion with hashed playback ids returned in `auditableActionList`." type DeletedRecordings { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "Hashed recording playback ids, distinct from numeric recording ids used by `sharedUrl`." recordingIds: [String!]! "Action time in Unix seconds." timestamp: Int! } "A/B test deletion returned in `auditableActionList`." type DeletedAbTest { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "A/B test id associated with the action." flowId: Int! "Action time in Unix seconds." timestamp: Int! } "A/B test duplication returned in `auditableActionList`." type DuplicatedAbTest { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "A/B test id associated with the action." flowId: Int! "Action time in Unix seconds." timestamp: Int! } "Heatmap creation with captured names returned in `auditableActionList`." type SnapshotsCreated { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "Captured user's name; null when not recorded." userName: String snapshotNames: [String!]! "Action time in Unix seconds." timestamp: Int! } "Heatmap settings change for a site returned in `auditableActionList`." type SnapshotSettingsChange { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String siteId: Int! "JSON-encoded settings change details." changes: String! "Action time in Unix seconds." timestamp: Int! } "Survey creation returned in `auditableActionList`." type SurveyCreated { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String surveyId: ID! "Action time in Unix seconds." timestamp: Int! "Current add-on lookup, rather than a historical copy of the resource." survey: Addon! } """ Survey edit returned in `auditableActionList`; `changes` is a JSON-encoded object of the edit, `{}` when no details were recorded. """ type SurveyEdited { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String surveyId: ID! "Action time in Unix seconds." timestamp: Int! "JSON-encoded edit details; `{}` when no changes were captured." changes: String "Current add-on lookup, rather than a historical copy of the resource." survey: Addon! } """ Survey enable or disable returned in `auditableActionList`; `survey` loads the survey's current state, not its state at the time of the action. """ type SurveyToggled { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String surveyId: ID! "Action time in Unix seconds." timestamp: Int! "Captured enabled/disabled status string; null when not recorded." newStatus: String "Current add-on lookup, rather than a historical copy of the resource." survey: Addon! } """ Survey deletion returned in `auditableActionList`; the survey may no longer exist, so only its name at deletion is returned. """ type DeletedSurvey { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String surveyId: ID! "Action time in Unix seconds." timestamp: Int! "Captured deleted add-on name; null when not recorded." surveyName: String } "Survey response-viewing action returned in `auditableActionList`." type SurveyViewResponses { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String surveyId: ID! "Action time in Unix seconds." timestamp: Int! "Current add-on lookup, rather than a historical copy of the resource." survey: Addon! } "CTA creation returned in `auditableActionList`." type CtaCreated { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String addonId: ID! "Action time in Unix seconds." timestamp: Int! "Current add-on lookup, rather than a historical copy of the resource." cta: Addon! } """ CTA edit returned in `auditableActionList`; `changes` is a JSON-encoded object of the edit, `{}` when no details were recorded. """ type CtaEdited { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String addonId: ID! "Action time in Unix seconds." timestamp: Int! "JSON-encoded edit details; `{}` when no changes were captured." changes: String "Current add-on lookup, rather than a historical copy of the resource." cta: Addon! } """ CTA enable or disable returned in `auditableActionList`; `cta` loads the CTA's current state, not its state at the time of the action. """ type CtaToggled { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String addonId: ID! "Action time in Unix seconds." timestamp: Int! "Captured enabled/disabled status string; null when not recorded." newStatus: String "Current add-on lookup, rather than a historical copy of the resource." cta: Addon! } """ CTA deletion returned in `auditableActionList`; the CTA may no longer exist, so only its name at deletion is returned. """ type DeletedCta { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String addonId: ID! "Action time in Unix seconds." timestamp: Int! "Captured deleted add-on name; null when not recorded." ctaName: String } "CTA response-viewing action returned in `auditableActionList`." type CtaViewResponses { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String addonId: ID! "Action time in Unix seconds." timestamp: Int! "Current add-on lookup, rather than a historical copy of the resource." cta: Addon! } "Goal creation returned in `auditableActionList`, with the goal id, name, and site recorded at creation." type GoalCreated { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "Whether the action was recorded as an administrative action." admin: Boolean! "Action time in Unix seconds." timestamp: Int! "Captured goal id; null when not recorded." goalId: Int "Captured goal name; null when not recorded." goalName: String "Captured site id; null when not recorded." siteId: Int } "Page Speed report creation returned in `auditableActionList`." type PageSpeedReportCreated { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "Whether the action was recorded as an administrative action." admin: Boolean! "Action time in Unix seconds." timestamp: Int! "Captured page id; null when not recorded." pageId: Int "Captured page title; null when not recorded." pageTitle: String "Captured site id; null when not recorded." siteId: Int "Captured source url; null when not recorded." sourceUrl: String } "Page Speed report deletion returned in `auditableActionList`." type PageSpeedReportDeleted { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "Whether the action was recorded as an administrative action." admin: Boolean! "Action time in Unix seconds." timestamp: Int! "Captured page id; null when not recorded." pageId: Int "Captured page title; null when not recorded." pageTitle: String "Captured site id; null when not recorded." siteId: Int "Captured source url; null when not recorded." sourceUrl: String } "Manual Page Speed report run returned in `auditableActionList`." type PageSpeedReportTriggered { "Audit entry id, distinct from the resource ids mentioned in the action." id: Int! "Owner account id associated with the action." userId: Int! "Acting user id; null for older or non-user actions." guestId: Int "Acting user's email when distinct from the owner and still resolvable; null otherwise." guestEmail: String "Whether the action was recorded as an administrative action." admin: Boolean! "Action time in Unix seconds." timestamp: Int! "Captured page id; null when not recorded." pageId: Int "Captured page title; null when not recorded." pageTitle: String "Captured site id; null when not recorded." siteId: Int "Captured source url; null when not recorded." sourceUrl: String } """ Filters and pagination controls for the audit feed. Defaults favor recent results, a 100-item page size, and the core action types used by the product UI. """ input AuditableActionListFilter { "Timestamp sort direction; defaults to descending." sort: AuditableActionListSortOrder "Page size of at least 1; defaults to 100 and has no upper limit." limit: Int "Action types to include; defaults to the core UI action set. An empty list selects all supported actions." actionsToInclude: [AuditableActionTypes] "Exclusive start time in Unix seconds." startAt: Int! "Exclusive end time in Unix seconds." endAt: Int! """ User ids from `teamMembers`; matches the acting user, or owner if no acting user is recorded. Omit or use [] for all. """ users: [Int] } "Whether an A/B test traffic-allocation change is automatic or manual." enum AbTestRatioChangeType { "Automatic allocation change, for system-adjusted traffic." AUTOMATIC "Manual allocation change, for user-selected traffic." MANUAL } "Add-on audience slot affected by an audience edit." enum AudienceAttachmentSlot { "Primary audience attachment, for the add-on's main audience." PRIMARY "Draft audience attachment, for unpublished audience edits." DRAFT } "Publication state captured for an add-on affected by an audience edit." enum AudienceResourcePublicationState { "Never published, for an add-on with no published revision." NEVER_PUBLISHED "Published and active, for an enabled add-on." PUBLISHED_ACTIVE "Previously published but inactive, for a disabled add-on." PUBLISHED_INACTIVE } "Chronological ordering for `auditableActionList`." enum AuditableActionListSortOrder { "Oldest actions first, for chronological review." ASC "Newest actions first, for recent activity." DESC } """ Action filters for `auditableActionList`. `SNAPSHOTS_VIEWED` and `INSTALL` select application URL visits; `BILLING_CHANGE` also includes billing-page visits. """ enum AuditableActionTypes { "Traffic-allocation changes, for A/B test allocation history." AB_TEST_RATIO_CHANGE "Audience definition edits, for audience change history." AUDIENCE_EDITED "Application page visits, for navigation history." INTERNAL_URL_VISITED "Billing changes and billing-page visits, for billing activity." BILLING_CHANGE "Recording settings changes, for configuration history." RECORDING_SETTINGS_CHANGE "Site deletions, for removed-site history." DELETED_SITE "Heatmap deletions, for removed Heatmap history." DELETED_SNAPSHOTS "Recording deletions, for removed recording history." DELETED_RECORDINGS "A/B test deletions, for removed test history." DELETED_AB_TEST "A/B test duplications, for copied test history." DUPLICATED_AB_TEST "Visits to Heatmap application URLs, for report-view history." SNAPSHOTS_VIEWED "Heatmap creations, for capture setup history." SNAPSHOTS_CREATED "Heatmap settings changes, for configuration history." SNAPSHOT_SETTINGS_CHANGE "Visits to installation application URLs, for installation-page history." INSTALL "Survey creations, for new survey history." SURVEY_CREATED "Survey edits, for survey change history." SURVEY_EDITED "Survey enabled-state changes, for delivery lifecycle history." SURVEY_TOGGLED "Survey deletions, for removed survey history." DELETED_SURVEY "Survey response views, for result-access history." SURVEY_VIEW_RESPONSES "CTA creations, for new CTA history." CTA_CREATED "CTA edits, for CTA change history." CTA_EDITED "CTA enabled-state changes, for delivery lifecycle history." CTA_TOGGLED "CTA deletions, for removed CTA history." DELETED_CTA "CTA response views, for result-access history." CTA_VIEW_RESPONSES "Goal creations, for conversion setup history." GOAL_CREATED "Page Speed report creations, for monitored-page setup history." PAGE_SPEED_REPORT_CREATED "Page Speed report deletions, for removed report history." PAGE_SPEED_REPORT_DELETED "Page Speed report runs, for manual execution history." PAGE_SPEED_REPORT_TRIGGERED } "System message returned by `announcement`, with sanitized HTML and a Unix-second update timestamp." type AnnouncementDetails { "True for announcements returned by this query." enabled: Boolean "Announcement HTML, sanitized to links, line breaks, and bold or italic tags." htmlContent: String "Display severity chosen for the announcement." severity: AnnouncementSeverity "Last update time in Unix seconds." updatedAt: Int } "Display severity of the system message returned by `announcement`." enum AnnouncementSeverity { "Alert-level system message, for urgent notices" ALERT "Warning-level system message, for caution notices" WARNING "Informational system message, for neutral notices" INFO "Success-level system message, for positive notices" SUCCESS } "One metric bucket returned by `analytics`; value units follow the enclosing metric." type GranularBucket { "Bucket start as YYYY-MM-DD, clipped to the requested range." startDate: String "Bucket end as YYYY-MM-DD, clipped to the requested range." endDate: String "Count for count metrics, milliseconds for duration, or a 0 to 1 fraction for bounce rate." value: Float } "One dimension time bucket returned by `analyticsOverTime`, with an aligned previous-period count." type DayValue { "Bucket date as YYYY-MM-DD." date: String "Bucket start as YYYY-MM-DD, clipped to the requested range." startDate: String "Bucket end as YYYY-MM-DD, clipped to the requested range." endDate: String "Selected metric count; page series always count page views." value: Float "Count in the aligned previous-period bucket." prevValue: Float "Percent change from the previous bucket, rounded to two decimals; zero when the previous value is zero." pctChange: Float } "One conversion-count bucket returned by `analyticsConversionsOverTime` or `analyticsOverTime`." type ConversionDay { "Bucket date as YYYY-MM-DD." date: String "Bucket start as YYYY-MM-DD, clipped to the requested range." startDate: String "Bucket end as YYYY-MM-DD, clipped to the requested range." endDate: String "Goal conversion event count in this bucket." value: Float } "Current metric, relative change, and chronological buckets returned by `analytics`." type MetricOverTime { "Current-window count, duration in milliseconds, or bounce fraction from 0 to 1." total: Float """ Relative change versus the preceding period of equal length, as a fraction (0.1 means +10%); 1 when only the previous value is zero. Count deltas compare daily averages. """ delta: Float "Chronological buckets with the same unit as `total`." bucket: [GranularBucket] } "New and returning visitor counts summed from daily analytics in `analytics`." type VisitorsBreakdown { "Daily visitor count minus returning daily visitor count, summed over the window." new: Int "Returning visitor count summed across daily aggregates." returning: Int "Visitor count summed across daily aggregates; a visitor may count on multiple dates." total: Int } "One ranked dimension row returned by `analytics` or `analyticsDimension`; unavailable metrics are zero." type CategoricalMetric { name: String "Country or language code; null for other dimensions." code: String "Page domain or original referrer domain; null when absent." domain: String "Visitor count summed across daily dimension aggregates; zero if unavailable." visitors: Int "Page-view count for this dimension value." pageViews: Int "Session count for this dimension value; zero if unavailable." sessions: Int """ Rounded engagement duration in milliseconds per engaged session; zero for no engaged sessions or unavailable data. """ avgSessionDuration: Int "Rounded engagement duration in milliseconds per engaged page view; zero for no engaged page views." avgTimeOnPage: Int "Non-engaged sessions divided by sessions, a fraction from 0 to 1; zero for no sessions." bounceRate: Float "Referrer display icon or domain fallback; null for other dimensions." favicon: String } "One dimension value's count series returned by `analyticsOverTime`." type CategoricalMetricOverTime { name: String "Page domain when supplied; null for dimensions without a domain." domain: String "Chronological count series for this dimension value." bucket: [DayValue] "Same series as `bucket`, including week or month buckets when requested." dailyData: [DayValue] } """ A dimension's ranked slice or time series returned by analytics operations. Conversion buckets are attached only when a site goal is supplied to `analyticsOverTime`. """ type MetricMetadata { "Group count before row limiting; `analyticsDimension` substitutes the returned length for a short page." totalCount: Int "Dimension series; ranked-row requests return an empty list." overTime: [CategoricalMetricOverTime] "Ranked rows; time-series requests return an empty list." data: [CategoricalMetric] """ Goal conversion buckets for `analyticsOverTime` with a site goal. Without that goal this value is null, so selecting this non-null field produces an error. """ conversions: [ConversionDay!]! } """ Independent continuation boundaries for the paginated dimensions of `analytics`. Copy `nextCursor` keys and values and keep source, window, search, and ordering unchanged. """ input AnalyticsCursorArg { "Boundary for pages copied from `analytics.nextCursor`; omit for the first request." page: AnalyticsCursorDataArg "Boundary for entry pages copied from `analytics.nextCursor`; omit for the first request." entryPage: AnalyticsCursorDataArg "Boundary for referrers copied from `analytics.nextCursor`; omit for the first request." referrer: AnalyticsCursorDataArg "Boundary for UTM sources copied from `analytics.nextCursor`; omit for the first request." utmSource: AnalyticsCursorDataArg "Boundary for UTM mediums copied from `analytics.nextCursor`; omit for the first request." utmMedium: AnalyticsCursorDataArg "Boundary for UTM campaigns copied from `analytics.nextCursor`; omit for the first request." utmCampaign: AnalyticsCursorDataArg "Boundary for UTM terms copied from `analytics.nextCursor`; omit for the first request." utmTerm: AnalyticsCursorDataArg "Boundary for UTM contents copied from `analytics.nextCursor`; omit for the first request." utmContent: AnalyticsCursorDataArg } """ One dimension's continuation boundary for `analyticsDimension`. Copy `nextCursor` without constructing keys or values. """ input AnalyticsCursorDataArg { "Last fetched row's ordering key; pages encode domain, a space, and path. Copy unchanged." key: String! "Last fetched row's sort value; unit follows the sort metric. Copy unchanged, including NAME ordering." value: StringOrNumber! } "Per-dimension continuation boundaries returned by `analytics`; null members mean no rows were returned." type AnalyticsCursor { "Last fetched boundary for pages; null when that dimension returned no rows." page: AnalyticsCursorData "Last fetched boundary for entry pages; null when that dimension returned no rows." entryPage: AnalyticsCursorData "Last fetched boundary for referrers; null when that dimension returned no rows." referrer: AnalyticsCursorData "Last fetched boundary for UTM sources; null when that dimension returned no rows." utmSource: AnalyticsCursorData "Last fetched boundary for UTM mediums; null when that dimension returned no rows." utmMedium: AnalyticsCursorData "Last fetched boundary for UTM campaigns; null when that dimension returned no rows." utmCampaign: AnalyticsCursorData "Last fetched boundary for UTM terms; null when that dimension returned no rows." utmTerm: AnalyticsCursorData "Last fetched boundary for UTM contents; null when that dimension returned no rows." utmContent: AnalyticsCursorData } "Last fetched row's key and ordering value returned in analytics cursors." type AnalyticsCursorData { "Last fetched row's ordering key; pages encode domain, a space, and path. Copy unchanged." key: String! "Last fetched row's sort value; unit follows the sort metric. Copy unchanged, including NAME ordering." value: StringOrNumber! } """ Metrics and dimension payload returned by `analytics` and `analyticsOverTime`. Fields absent from the returned payload resolve to null. """ type Analytics { """ Per-dimension continuation boundaries from the fetched rows; null for `analyticsOverTime`, which does not paginate. """ nextCursor: AnalyticsCursor "Visitor count summed across daily aggregates; visitors may count on multiple dates." uniqueVisitors: MetricOverTime "Page-view event count." pageViews: MetricOverTime "Engagement duration divided by all sessions, in milliseconds." avgSessionDuration: MetricOverTime "Session count." sessions: MetricOverTime "Non-engaged sessions divided by all sessions, a fraction from 0 to 1." bounceRate: MetricOverTime "New and returning daily visitor counts for the window." visitors: VisitorsBreakdown """ Returns all device types by default because `limit: -1` disables truncation for this dimension. """ deviceType( "Maximum returned rows from the fetched slice, default -1. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by country; null when this dimension is absent from the returned payload." countries( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by language; null when this dimension is absent from the returned payload." languages( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by operating system; null when this dimension is absent from the returned payload." os( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by browser; null when this dimension is absent from the returned payload." browsers( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by traffic channel; null when this dimension is absent from the returned payload." channels( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by referrer domain; null when this dimension is absent from the returned payload." referrers( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by viewed page domain and path; null when this dimension is absent from the returned payload." pages( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by first page domain and path; null when this dimension is absent from the returned payload." entryPages( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by UTM source; null when this dimension is absent from the returned payload." utmSources( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by UTM medium; null when this dimension is absent from the returned payload." utmMediums( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by UTM campaign; null when this dimension is absent from the returned payload." utmCampaigns( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by UTM term; null when this dimension is absent from the returned payload." utmTerms( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata "Metrics grouped by UTM content; null when this dimension is absent from the returned payload." utmContents( "Maximum returned rows from the fetched slice, default 250. Use -1 for the entire fetched slice." limit: Int ): MetricMetadata } """ Single-dimension analytics payload used when one ranked dimension is requested independently from the full dashboard query. """ type AnalyticsSingle { """ Last fetched row boundary; null when no rows were returned. Only pages, entry pages, referrers, and UTM dimensions use cursor pagination. """ nextCursor: AnalyticsCursorData """ Result for the requested dimension, returned under a generic field instead of the original dimension name. """ dimension: MetricMetadata } "Ranking column for analytics dimension rows; pages support name, page views, and time on page." enum OrderColumn { "Dimension name order, with domain and path ordering for pages" NAME "Daily visitor count order, for audience volume" VISITORS "Page-view count order, the default for pages" PAGE_VIEWS "Session count order, for visit volume" SESSIONS "Average engagement duration in milliseconds per engaged session, for duration ranking" AVG_SESSION_DURATION "Average engagement duration in milliseconds per engaged page view, for page-duration ranking" AVG_TIME_ON_PAGE "Non-engaged session fraction from 0 to 1, for bounce ranking" BOUNCE_RATE } "Categorical breakdown for analytics counts and time series." enum AnalyticsDimension { "Device category breakdown for comparing count metrics" DEVICE_TYPE "Country breakdown for comparing count metrics" COUNTRIES "Language breakdown for comparing count metrics" LANGUAGES "Operating system breakdown for comparing count metrics" OS "Browser breakdown for comparing count metrics" BROWSERS "Traffic channel breakdown for comparing count metrics" CHANNELS "Referrer domain breakdown for comparing count metrics" REFERRERS "Viewed page domain and path breakdown for comparing count metrics" PAGES "First page domain and path breakdown for comparing count metrics" ENTRY_PAGES "UTM source breakdown for comparing count metrics" UTM_SOURCES "UTM medium breakdown for comparing count metrics" UTM_MEDIUMS "UTM campaign breakdown for comparing count metrics" UTM_CAMPAIGNS "UTM term breakdown for comparing count metrics" UTM_TERMS "UTM content breakdown for comparing count metrics" UTM_CONTENTS } "Count selected for dimension series in `analyticsOverTime`." enum AnalyticsMetric { "Visitor count summed across daily aggregates, for audience volume" VISITORS "Page-view count, for viewed-page volume" PAGE_VIEWS "Session count, for visit volume" SESSIONS } "Direction of analytics dimension ranking." enum OrderDir { "Largest metric or last name first, the default ranking" DESC "Smallest metric or first name first, for ascending ranking" ASC } "Analytics data source and date-range time zone." enum AnalyticsSource { "Crazy Egg site analytics using UTC dates" SITE "Imported Google Analytics data using the property's report time zone" GA_PROPERTY } "Recognized AI referral counts returned by `analyticsAiReferrals` for the effective window." type AnalyticsAiReferrals { "Effective inclusive start date as YYYY-MM-DD after history restrictions." startDate: String! "Effective inclusive end date as YYYY-MM-DD." endDate: String! "Recognized referral session count." sessions: Int! "Page-view count attributed to recognized referral traffic." pageViews: Int! sources: [AnalyticsAiReferralSource!]! } "One AI service returned by `analyticsAiReferrals`, ordered by sessions descending then name." type AnalyticsAiReferralSource { name: String! "Matched hostnames present in the data, sorted alphabetically; includes recognized subdomains." domains: [String!]! "Recognized referral session count." sessions: Int! "Page-view count attributed to recognized referral traffic." pageViews: Int! } "The `string_or_number` scalar type represents arbitrary string or numeric data." scalar StringOrNumber "Local seeding destination identity. Available only on development and test APIs." type LocalSeedTarget { "Authenticated account holder ID." accountId: Int! "Analytics ClickHouse database name when requested." analyticsDatabase: String "ClickHouse analytics_events table identity when requested." analyticsTableUuid: String "ClickHouse database name when requested." eventsDatabase: String "ClickHouse events_v3 table identity when requested." eventsTableUuid: String "Core database name." coreDatabase: String! "Core server UUID." coreInstance: String! "Metadata database name." metadataDatabase: String! "Metadata cluster system identifier." metadataInstance: String! } """ Generated suggestion payload for creating or improving survey-style addons; `data` is returned as serialized JSON rather than a nested GraphQL object. Returned by addonSuggestionsList and addonSuggestionDetail. """ type AddonSuggestion { id: Int! title: String! type: AddonSuggestionType! "Suggestion payload encoded as a JSON string." data: String! } "Suggestion category returned by addonSuggestionsList." enum AddonSuggestionType { "Suggestion for creating or improving a survey." SURVEY } """ Cursor-pagination wrapper for addon results with a top-level template-management capability flag for the current session. Returned by addonList. """ type AddonListMeta { list: [Addon!]! "Opaque cursor excluding IDs already returned; pass to addonList." nextPageCursor: String! "True when the page fills the requested limit; a subsequent page may still be empty." hasNextPage: Boolean! "Whether this session may manage the shared template catalog." canManageTemplates: Boolean! } """ Survey or CTA record exposed through a shared addon shape, with permissions derived from the current session and some fields resolved lazily. Returned by addonDetail and addonList. """ type Addon { "Add-on UUID accepted by addonDetail and add-on mutations." id: String! siteId: Int! "The name/title of the survey or CTA" name: String! "The serialized JSON content of the survey or CTA" content: String permissions: AddonPermissions! "Creation time in Unix seconds." createdAt: Int! "First publication time in Unix seconds; null before publication." publishedAt: Int "Last activation change in Unix seconds; null if no activation change was recorded." lastActiveChange: Int "Source template ID from addonTemplatesList; null when none is linked." addonTemplateId: Int "Source suggestion ID; null when none is linked." suggestionId: Int "Survey response groups or CTA click events; zero when no count is available." responseCount: Int "Survey has response groups, or CTA has views, clicks, or conversions." hasData: Boolean! "Stored activation state; use publishedAt to distinguish unpublished drafts." active: Boolean! "The linked goal; null when no goal is linked or the goal is unavailable" goal: GoalLinked "Saved unpublished survey or CTA name; null when no draft name is stored" draftName: String "Saved unpublished content encoded as JSON; null or empty when no draft content is stored" draftContent: String "Attached primary audience; null when absent or accessed through a shared link." primaryAudience: AddonAudience "Attached draft audience; null when absent or accessed through a shared link." draftAudience: AddonAudience "Stored survey or CTA content format version" formatVersion: Int! "Creator name or login, falling back to the stored name or Deleted User" createdBy: String! "Recorded survey or CTA view events." totalViews: Int! "Recorded CTA conversion events; null for surveys." totalConversions: Int type: AddonType! } "Add-on product type selected by addonList and returned by addonDetail." enum AddonType { "Questionnaire collecting visitor responses." SURVEY "Call to action tracking views, clicks, and conversions." CTA } "Content authoring contract returned by addonContentContract; schema and example are JSON objects, not strings." type AddonContentContract { "Revision identifier of the content schema and example returned by this query." contractRevision: String! "JSON Schema object defining content for the requested type." schema: JSON! "Representative JSON content object; encode it as a string for content inputs." example: JSON! } "Attached visitor audience resolved by addonDetail and addonList." type AddonAudience { "Attached audience UUID, distinct from the add-on UUID." id: String! "Visitor audience JSON object following audienceDefinitionContract; not a serialized string." definition: JSON! "Always false for add-on audiences." saved: Boolean! } """ Session-scoped action flags for an addon; shared links expose a reduced permission set and `can_share` is false until the addon has been published. Returned within addonDetail and addonList. """ type AddonPermissions { canView: Boolean! @deprecated(reason: "Use CanViewResults or CanViewSettings") canViewResults: Boolean! canViewSettings: Boolean! canEdit: Boolean! "True only for published add-ons when the caller may create shared links." canShare: Boolean! canRename: Boolean! canToggle: Boolean! canDelete: Boolean! "Whether the add-on has data to export." canExport: Boolean! canManageTemplates: Boolean! } "Search, publication status, and page-size filters for addonList." input AddonFilter { "Page size from 1 to 200; defaults to 10." limit: Int "Trimmed substring matched against add-on UUID or name; names match case-insensitively." query: String "Optional SURVEY or CTA filter; omitted types are limited to those the caller may view." type: AddonType "Optional publication and activation filter; omit to include all statuses." status: AddonStatus } """ Reusable survey or CTA template with a resolved thumbnail URL and a nested permission block derived from the current session. Returned by addonTemplateDetail and addonTemplatesList. """ type AddonTemplate { id: Int! "Stored content format version." formatVersion: Int! "Creation time in Unix seconds." createdAt: Int! name: String! "Serialized JSON content for a reusable template." content: String! "Catalog description; null when not supplied." description: String "Catalog category; null when not supplied." category: String "Resolved thumbnail URL; null when absent or unavailable." thumbnail: String type: AddonType! permissions: AddonTemplatePermissions! } """ Session-scoped permissions for template browsing versus template management. Returned within addonTemplateDetail and addonTemplatesList. """ type AddonTemplatePermissions { canView: Boolean! canManage: Boolean! } """ Template list wrapper that returns both the templates and whether the current session can manage the template catalog. Returned by addonTemplatesList. """ type AddonTemplateListMeta { list: [AddonTemplate!]! canManage: Boolean! } """ Aggregate counts grouped into the addon statuses used by list filters; absent data resolves to zeroes rather than `null` fields. Returned by addonStatusCounts. """ type AddonStatusCountsResult { "Count of all matching nondeleted add-ons." total: Int "Count with no publication timestamp." draft: Int "Count published and enabled." active: Int "Count published and disabled." inactive: Int } "Publication and activation filter for addonList and count categories from addonStatusCounts." enum AddonStatus { "Never published; choose for unpublished add-ons." DRAFT "Published and enabled; choose for active delivery." ACTIVE "Published and disabled; choose for paused delivery." INACTIVE } "Imported ad account and synchronization state returned by `adPerformanceHeader` and performance queries." type AdPerformanceConnectionStatus { "Crazy Egg connection id accepted by `deleteAdPlatformConnection`." connectionId: Int! "Provider account id; null when not stored." accountId: String platform: AdPlatformSource! "Oldest imported data time in Unix seconds; null before available." oldestImportedDataAt: Int "Whether initial data is missing and sync history indicates population is pending or running." isPopulatingData: Boolean! "Whether a running sync started within the past hour." isSyncing: Boolean! "Last completed entity sync in Unix seconds; null before any completes." lastEntitiesSyncedAt: Int "Last completed metrics sync in Unix seconds; null before any completes." lastMetricsSyncedAt: Int "Most recent completed entity or metrics sync in Unix seconds; null before any completes." lastSyncedAt: Int "Last date covered by the latest completed metrics sync, YYYY-MM-DD; null when unavailable." lastSyncedDate: String } """ Enabled connection statuses returned by `adPerformanceHeader` and `adsLibraryPreviewHeader`, without performance metrics. """ type AdPerformanceHeader { connections: [AdPerformanceConnectionStatus!]! } "Imported ad identity returned by the ad preview queries; its id is a Crazy Egg id, separate from the provider id." type AdPerformanceAdIdentity { "Crazy Egg imported ad id accepted by the ad preview queries." id: Int! "Provider's ad id, distinct from Crazy Egg's numeric ad id; null when unavailable." platformId: String name: String! platform: AdPlatformSource! "Imported campaign name; null when unavailable." campaignName: String } """ Normalized creative rendering data returned by the ad preview queries. Optional assets and text are null when unavailable or unsupported for that format. """ type AdPerformanceCreativePreview { "Whether a supported creative template is available; false still returns available fallback fields." previewSupported: Boolean! "Rendering template identifier; null when no supported template is available." template: String "Human-readable rendering placement; null for unsupported formats." placementLabel: String "Best available advertiser display name; null when unavailable." advertiserName: String "Best available headline text; null when unavailable." headline: String "Google headline alternatives; null for other providers or when unsupported." headlines: [String!] "Best available creative body text; null when unavailable." body: String "Google description alternatives; null for other providers or when unsupported." descriptions: [String!] "Click destination; null when unavailable." destinationUrl: String "Derived display address, which may omit protocol or use display paths; null when unavailable." displayUrl: String "First Google display-path segment; null when absent or not applicable." path1: String "Second Google display-path segment; null when absent or not applicable." path2: String "Image or thumbnail asset URL; null when unavailable." imageUrl: String "Video asset URL; null when unavailable or refresh cannot supply a usable URL." videoUrl: String "Provider-hosted preview fallback when supplied; null otherwise." providerPreviewUrl: String "Derived media type: `VIDEO`, `IMAGE`, or `NONE` when no media is available." mediaType: String "Carousel or multi-asset cards; null when none are available." cards: [AdPerformanceCreativePreviewCard!] } "One carousel or multi-asset card returned in an ad preview. Optional text and media are null when unavailable." type AdPerformanceCreativePreviewCard { "Best available headline text; null when unavailable." headline: String "Best available creative body text; null when unavailable." body: String "Click destination; null when unavailable." destinationUrl: String "Derived display address, which may omit protocol or use display paths; null when unavailable." displayUrl: String "Image or thumbnail asset URL; null when unavailable." imageUrl: String "Video asset URL; null when unavailable or refresh cannot supply a usable URL." videoUrl: String "Derived media type: `VIDEO`, `IMAGE`, or `NONE` when no media is available." mediaType: String } "Imported ad identity and normalized creative returned by `adPerformanceAdPreview` and `adsLibraryPreviewAdPreview`." type AdPerformanceAdPreviewPayload { ad: AdPerformanceAdIdentity! preview: AdPerformanceCreativePreview! } "Touchpoint choice for attributing conversions to ads." enum AdPerformanceAttributionModel { "Earliest eligible ad visit, for first-touch attribution." FIRST_TOUCH "Latest eligible ad visit, for last-touch attribution." LAST_TOUCH } "Source grouping used by `adPerformance` and `adsLibraryPreviewPerformance`." enum AdPerformanceDataMode { "Imported provider ads with spend and matched tracked traffic, for connected-account reporting." PLATFORM "UTM parameter groups without spend, for reporting tracked campaigns independently of imported ads." UTM } "Visible goal offered in performance query controls, with an id usable as `goalId`." type AdPerformanceGoalOption { "Goal id accepted as `goalId` by performance queries." id: Int! name: String! } """ Effective filters and attribution choices returned by performance queries, including the available platforms and goals. """ type AdPerformanceControls { "Effective data source grouping; UTM mode has no imported spend." dataMode: AdPerformanceDataMode! "Providers with enabled imported connections, ordered Google, Meta, Reddit." availablePlatforms: [AdPlatformSource!]! "Effective provider filter; [] means all enabled providers and is also used in UTM mode." selectedPlatforms: [AdPlatformSource!]! "Visible goals ordered by name, usable as `goalId`." availableGoals: [AdPerformanceGoalOption!]! "Effective goal filter; null means all conversions." selectedGoalId: Int "Effective Crazy Egg campaign ids; [] means no campaign filter." selectedCampaignIds: [Int!]! "Effective Crazy Egg ad-group ids; [] means no ad-group filter." selectedAdGroupIds: [Int!]! "Effective Crazy Egg ad ids; [] means no individual-ad filter." selectedAdIds: [Int!]! "Effective first- or last-touch attribution model." attributionModel: AdPerformanceAttributionModel! "Effective attribution lookback in days: 1, 7, 30, or 90." conversionWindowDays: Int! } "Imported ad returned by `adPerformanceAdTree`, with a Crazy Egg filter id and a provider id." type AdPerformanceAdTreeAd { "Crazy Egg imported ad id accepted in `adIds` and by ad preview queries." id: Int! "Provider ad id, distinct from the numeric Crazy Egg filter id." platformId: String name: String! } "Imported ad group and its ads returned by `adPerformanceAdTree`." type AdPerformanceAdTreeAdGroup { "Crazy Egg ad-group id accepted in performance query `adGroupIds`." id: Int! name: String! ads: [AdPerformanceAdTreeAd!]! } "Imported campaign and its ad groups returned by `adPerformanceAdTree`." type AdPerformanceAdTreeCampaign { "Crazy Egg campaign id accepted in performance query `campaignIds`." id: Int! name: String! adGroups: [AdPerformanceAdTreeAdGroup!]! } "One provider/account hierarchy returned by `adPerformanceAdTree`." type AdPerformanceAdTreePlatform { platform: AdPlatformSource! "Provider account id; null when not stored." accountId: String campaigns: [AdPerformanceAdTreeCampaign!]! } "Site ad hierarchy returned by `adPerformanceAdTree`, capped at 2000 ads with truncation signaled." type AdPerformanceAdTreePayload { platforms: [AdPerformanceAdTreePlatform!]! "True when more than 2000 qualifying ads exist; the returned tree contains only the first 2000 read." truncated: Boolean! } """ Aggregate spend, tracked visits, and attributed conversions returned by performance queries. Monetary values are micro-units; imported spend currencies are not reconciled with tracked revenue. """ type AdPerformanceSummary { """ Imported spend in millionths of ad-account currency; multiple currencies are summed without conversion. Zero in UTM mode. """ spendMicros: Int! "Tracked visits matched to selected imported ads, or UTM-grouped visits in UTM mode." adTrafficVisits: Int! "Spend divided by tracked visits, rounded to integer micro-units of imported account currency; zero with no visits." averageSpendPerVisitMicros: Int! """ Converted visitors divided by tracked visits, as a ratio rather than percent, rounded to four decimals; zero with no visits. """ conversionRate: Float! "Attributed conversion count for the selected goal or all goals." totalConversions: Int! "Conversions per converted visitor, rounded to four decimals; zero with no converted visitors." averageConversions: Float! "Spend per conversion in integer micro-units of imported account currency; zero with no conversions." averageSpendPerConversionMicros: Int! """ Tracked revenue divided by imported spend, rounded to four decimals; zero with no spend. Currency conversion is not applied. """ returnOnAdSpend: Float! """ Attributed revenue in millionths of the tracked base amount; no currency code or conversion to ad-account currency is returned. """ totalRevenueMicros: Int! "Tracked revenue per conversion in integer micro-units of the tracked base amount; zero with no conversions." averageRevenuePerConversionMicros: Int! } "One unmatched tracking value and visit count returned in performance tracking coverage." type AdPerformanceUnmatchedTrackingValue { "Tracked ad value that could not be matched to imported selected ad identities." value: String! visits: Int! } """ Matched and unmatched tracked visits returned by platform-mode performance queries when no hierarchy filter is applied. """ type AdPerformanceTrackingCoverage { "Tracked visits carrying an ad identity in the coverage scope." totalTrackedVisits: Int! "Tracked visits matched to imported ad identities in scope." matchedVisits: Int! "Tracked visits whose ad identities did not match imported identities in scope." unmatchedVisits: Int! "Up to five unmatched tracking values with the highest visit counts." topUnmatchedValues: [AdPerformanceUnmatchedTrackingValue!]! } "Completion state for one independently loaded part of a performance response." enum AdPerformanceSliceStatus { "Slice loaded, for using its returned values." OK "Slice exceeded its time limit, for identifying fallback data." TIMEOUT "Slice failed, for identifying fallback data." ERROR } "Load status for one performance data slice; inspect it before treating fallback zeros as observed data." type AdPerformanceSlice { "Whether this slice loaded successfully, timed out, or failed." status: AdPerformanceSliceStatus! } "Load statuses returned by performance queries so callers can identify partial results." type AdPerformanceSlices { "Load status for the aggregate imported spend." spend: AdPerformanceSlice! "Load status for tracked visit totals." visits: AdPerformanceSlice! "Load status for aggregate conversion attribution." attribution: AdPerformanceSlice! "Combined load status for available goals and connection statuses." controls: AdPerformanceSlice! "Combined load status for the data used to build per-ad rankings and charts." perAd: AdPerformanceSlice! } "Ranking family used in performance query leaderboards and daily charts." enum AdPerformanceTopMetric { "Rank by spend, for highest-spend ads." SPEND "Rank by tracked visits, for highest-traffic ads." TRAFFIC "Rank by conversions, for most-converting ads." CONVERSIONS "Rank by revenue divided by spend, for highest-return ads." RETURN } "Summary metric used to rank ads in detailed performance leaderboards." enum AdPerformanceMetricKey { "Rank by spend in account-currency micro-units." SPEND_MICROS "Rank by tracked visit count." AD_TRAFFIC_VISITS "Rank by spend per visit in account-currency micro-units." AVERAGE_SPEND_PER_VISIT_MICROS "Rank by converted visitors per tracked visit, for ads with at least 10 visits." CONVERSION_RATE "Rank by attributed conversion count." TOTAL_CONVERSIONS "Rank by conversions per converted visitor." AVERAGE_CONVERSIONS "Rank by spend per conversion in account-currency micro-units." AVERAGE_SPEND_PER_CONVERSION_MICROS "Rank by tracked revenue divided by imported spend." RETURN_ON_AD_SPEND "Rank by attributed tracked revenue in micro-units." TOTAL_REVENUE_MICROS "Rank by tracked revenue per conversion in micro-units." AVERAGE_REVENUE_PER_CONVERSION_MICROS } "Additive quantity charted for a detailed ranking, including the numerator used for ratio metrics." enum AdPerformanceStackQuantity { "Account-currency micro-units of spend, for monetary spend stacks." SPEND_MICROS "Tracked visit counts, for traffic stacks." AD_TRAFFIC_VISITS "Attributed conversion counts, for conversion stacks." TOTAL_CONVERSIONS "Tracked revenue micro-units, for revenue stacks." TOTAL_REVENUE_MICROS } """ Lightweight creative excerpt from imported ad fields in performance leaderboards; optional text and media are null when unavailable. """ type AdPerformancePreviewSnippet { "Best available headline text; null when unavailable." headline: String "Best available creative body text; null when unavailable." body: String "Derived display address, which may omit protocol or use display paths; null when unavailable." displayUrl: String "Image or thumbnail asset URL; null when unavailable." imageUrl: String "Video asset URL; null when unavailable or refresh cannot supply a usable URL." videoUrl: String "Derived media type: `VIDEO`, `IMAGE`, or `NONE` when no media is available." mediaType: String } "Ranked ad metrics returned by performance queries, or a synthetic UTM group in UTM mode." type AdPerformanceTopAd { "Crazy Egg ad id in platform mode; synthetic negative group id in UTM mode, unusable by preview queries." adId: Int! "Imported provider; null for synthetic UTM groups." platform: AdPlatformSource "Provider ad id in platform mode, or UTM content value in UTM mode; null when unavailable." platformId: String name: String! "Imported campaign name or UTM campaign value; null when unavailable." campaignName: String "Imported ad-group name or UTM source value; null when unavailable." adGroupName: String "Imported creative excerpt without provider refresh; null in UTM mode or when no content is available." previewSnippet: AdPerformancePreviewSnippet """ Imported spend in millionths of ad-account currency; multiple currencies are summed without conversion. Zero in UTM mode. """ spendMicros: Int! "Tracked visits matched to selected imported ads, or UTM-grouped visits in UTM mode." adTrafficVisits: Int! "Attributed conversion count for the selected goal or all goals." totalConversions: Int! "Attributed converted visitor count used as the numerator of `conversionRate`." convertedVisitors: Int! """ Converted visitors divided by tracked visits, as a ratio rather than percent, rounded to four decimals; zero with no visits. """ conversionRate: Float! """ Attributed revenue in millionths of the tracked base amount; no currency code or conversion to ad-account currency is returned. """ totalRevenueMicros: Int! """ Tracked revenue divided by imported spend, rounded to four decimals; zero with no spend. Currency conversion is not applied. """ returnOnAdSpend: Float! } "Aggregated remaining eligible ranked ads returned beside a performance leaderboard." type AdPerformanceOtherAds { "Number of remaining eligible ranked ads, excluding the top three." adCount: Int! """ Imported spend in millionths of ad-account currency; multiple currencies are summed without conversion. Zero in UTM mode. """ spendMicros: Int! "Tracked visits matched to selected imported ads, or UTM-grouped visits in UTM mode." adTrafficVisits: Int! "Attributed conversion count for the selected goal or all goals." totalConversions: Int! "Sum of converted-visitor counts across remaining eligible ranked ads." convertedVisitors: Int! """ Attributed revenue in millionths of the tracked base amount; no currency code or conversion to ad-account currency is returned. """ totalRevenueMicros: Int! } "Up to three ads ranked by a summary metric, plus remaining eligible ads, returned by performance queries." type AdPerformanceTopAdsForKey { metricKey: AdPerformanceMetricKey! "Additive chart value for this ranking; ratio keys chart a count or monetary numerator." stackQuantity: AdPerformanceStackQuantity! "Up to three eligible ads ranked descending by the selected metric across the full period." top: [AdPerformanceTopAd!]! "Aggregate of remaining eligible ranked ads; excludes entries ineligible for this ranking." other: AdPerformanceOtherAds! } "Daily additive values for the ads ranked across the full period by a summary metric, returned by performance queries." type AdPerformanceDailyMetricsForKey { metricKey: AdPerformanceMetricKey! "Additive chart value for this ranking; ratio keys chart a count or monetary numerator." stackQuantity: AdPerformanceStackQuantity! "Available dates ascending; ranks stay fixed across the full period and missing ranked positions use zero." buckets: [AdPerformanceDailyBucket!]! } "Suggested action grouping computed from visits, spend, conversions, and available revenue." enum AdPerformanceRecommendationBucket { """ At least 30 visits, 3 converted visitors, and a 2.5% conversion rate, plus a return of 1.5 or more when the results include revenue; candidates for more budget. """ SPEND_MORE "Ads with enough data that match no other bucket; candidates for landing page work." IMPROVE_CONVERSION """ Conversion rate under 1% with a return under 1.0, or without revenue data at least 10 currency units of spend; candidates to stop. """ STOP_RUNNING "Fewer than 30 visits and under 10 currency units of spend; checked first." INSUFFICIENT_DATA } "Recommendation bucket returned by performance queries, with uncapped count and a limited list of ads ordered by spend." type AdPerformanceRecommendationSection { "Computed suggested-action category; does not change ad delivery." bucket: AdPerformanceRecommendationBucket! title: String! headline: String! "Explanation of the bucket's classification." why: String! "Full bucket count before the returned ad list is capped." adCount: Int! "Bucket ads ordered by spend descending; limited to 50." ads: [AdPerformanceTopAd!]! } "Up to three ads ranked by a broad metric, plus remaining eligible ads, returned by performance queries." type AdPerformanceTopAdsForMetric { metric: AdPerformanceTopMetric! "Up to three eligible ads ranked descending by the selected metric across the full period." top: [AdPerformanceTopAd!]! "Aggregate of remaining eligible ranked ads; excludes entries ineligible for this ranking." other: AdPerformanceOtherAds! } """ Daily values for the period's top three ranked ads and remaining ads, returned by performance queries. Money uses micro-units; visits and conversions use counts. """ type AdPerformanceDailyBucket { "Reporting date formatted YYYY-MM-DD." date: String! "Daily value for this full-period rank, or zero if absent; units follow the parent metric/stack quantity." top1Value: Int! "Daily value for this full-period rank, or zero if absent; units follow the parent metric/stack quantity." top2Value: Int! "Daily value for this full-period rank, or zero if absent; units follow the parent metric/stack quantity." top3Value: Int! "Daily sum for remaining eligible ranked ads; units follow the parent metric/stack quantity." otherValue: Int! } "Daily stacks for ads ranked across the full period by a broad metric, returned by performance queries." type AdPerformanceDailyMetricsForMetric { metric: AdPerformanceTopMetric! "Available dates ascending; ranks stay fixed across the full period and missing ranked positions use zero." buckets: [AdPerformanceDailyBucket!]! } """ Performance response combining effective filters, aggregate metrics, rankings, charts, recommendations, and load statuses. Returned by `adPerformance` and `adsLibraryPreviewPerformance`. """ type AdPerformance { controls: AdPerformanceControls! summary: AdPerformanceSummary! "Null in UTM mode, with hierarchy filters, or when coverage loading fails." trackingCoverage: AdPerformanceTrackingCoverage "Enabled connection statuses, filtered by selected platforms in platform mode." connections: [AdPerformanceConnectionStatus!]! "Top three eligible ads per ranking family across the full period." topAds: [AdPerformanceTopAdsForMetric!]! "Daily values for the period's ranked ads; `RETURN` charts revenue micro-units." dailyMetrics: [AdPerformanceDailyMetricsForMetric!]! "Top three eligible ads for each summary key, ranked across the full selected period." topAdsByKey: [AdPerformanceTopAdsForKey!]! "Daily stacks in date order using each summary key's additive `stackQuantity`." dailyMetricsByKey: [AdPerformanceDailyMetricsForKey!]! "Computed suggested actions; these results do not change campaigns or budgets." recommendations: [AdPerformanceRecommendationSection!]! "Load statuses for partial-result interpretation; failed slices may have zero or empty fallbacks." slices: AdPerformanceSlices } "A JWT and its expiration time returned by `interagentJwt`." type InteragentJwt { "Signed JWT string." token: String! "Expiration time in Unix seconds." expires: Int! } """ An onboarding checklist task returned by `gettingStarted`, with completion, dependency, and permission state. """ type GettingStarted { slug: String! permission: CapabilityPermissionValue status: GettingStartedStatus! dependencies: [String] } "Completion states of checklist tasks returned by `gettingStarted`." enum GettingStartedStatus { "The task completion condition is met" COMPLETED "The task completion condition is not yet met" INCOMPLETE } """ Viewer profile and active account data returned by `me` and profile mutations; nested fields expose subscriptions and accessible accounts. """ type MeDetails { userId: Int guestId: Int "Viewer creation time in Unix seconds." createdAt: Int "Viewer avatar image URL." avatarUrl: String email: String name: String language: String onboarding: UserOnboarding settings: UserSettings """ Names of the feature flags enabled for this session. Use the `capabilities` query for permission and quota decisions and `subscription` for plan status. """ features: [String] """ Returns account entries for the signed-in viewer, including role flags, site access, and the current account marker. """ accounts: [UserAccount] "Returns saved metadata keys without values, including onboarding completion markers." flags: [String] "Returns saved metadata keys and their optional string values for the active account." userData: [UserData!]! """ Returns subscription state keyed by product area such as snapshots, recordings, and AB testing. """ subscriptions: SubscriptionTypes surveys: [String]! } "Card brands returned by `billingDetails`; these values classify the saved card." enum CcType { "The saved card is Mastercard" MASTERCARD "The saved card is Visa" VISA "The saved card is American Express" AMEX "The saved card is JCB" JCB "The saved card is Discover" DISCOVER "The saved card is Diners Club" DINERS_CLUB "The saved card brand is not one of the listed brands" OTHER } "Email subscription preferences returned by `userNotifications`." type UserNotifications { endOfTest: Boolean! dailyUpdate: Boolean! weeklyUpdate: Boolean! accountLimits: Boolean! receipt: Boolean! newsletter: Boolean! snapshotRecommendation: Boolean! weeklyExport: Boolean! monthlyExport: Boolean! trialEnded: Boolean! } "Saved account billing profile returned by `billingDetails`." type BillingDetails { "Masked card number; the full card number is not returned." ccNumberSanitized: String ccType: CcType ccFirstName: String ccLastName: String "Saved card expiry string; Stripe cards use MM/YYYY." ccExpiration: String paymentMethodType: String ccAddress: BillingAddress companyAddress: BillingAddress companyName: String companyVat: String companyId: String } "A billing or company postal address returned by `billingDetails` and payment transaction queries." type BillingAddress { zipOrPostalCode: String stateOrProvince: String country: String city: String address: String } "Active account tracking preferences returned in `me.settings` and by user preference mutations." type UserSettings { dnt: Boolean autoIdentity: Boolean "Currency code used as the account default for tracked monetary values." defaultCurrency: String explicitAgent: Boolean useSecureCookies: Boolean } "Viewer onboarding progress returned in `me.onboarding` and by profile mutations." type UserOnboarding { "Onboarding start time in Unix seconds; null when unset." startedAt: Int "Onboarding completion time in Unix seconds; null when unset." completedAt: Int flow: String "Saved onboarding site URL." siteUrl: String siteTech: String } """ Tracking settings container returned by `options`; selecting nested fields retrieves permission-gated values. """ type Options { "IP address of the current request." currentIp: String "Newline-separated IP blocking rules saved for the active account." userBlockedIps: String """ Links that switch cookie-based blocking on and off for the visitor's own browser on one site. Null when the site is not visible to the account or its name has no usable host. """ cookieBlockLinks("Site ID from `sites` for the cookie-blocking links." siteId: Int!): CookieBlockLinks } """ Links returned by `options.cookieBlockLinks`; following `block` excludes the browser from tracking and `unblock` reverses it. """ type CookieBlockLinks { "URL to enable cookie-based blocking in the browser that opens it." block: String! "URL to disable cookie-based blocking in the browser that opens it." unblock: String! } "Request authentication, impersonation, and shared-resource state returned by `sessionInfo`." type SessionInfo { isImpersonated: Boolean! isImpersonatedByReadOnly: Boolean! isAuthenticated: Boolean! hasSharedItems: Boolean! } "An account entry returned by `me.accounts`, with role flags, site scope, and account integration data." type UserAccount { id: Int harnessId: String isAccountHolder: Boolean isOwner: Boolean isManager: Boolean isReadOnly: Boolean isRestricted: Boolean restrictedSitesIds: [Int!] isCurrent: Boolean ownerName: String ownerEmail: String "Account holder creation time in Unix seconds." ownerCreatedAt: Int "Account ID as a decimal string padded to at least eight digits with leading zeroes." paddedId: String "Tracking script URL for this account." scriptUrl: String scriptVersion: String name: String "Account holder avatar image URL." ownerAvatarUrl: String sites: [Site] "Returns Google Analytics properties linked to this account." gaProperties: [GaProperty] isShopifyUser: Boolean useStripe: Boolean shopifyDomain: String } "API credentials returned by `api` and `regenerateUserApiCredentials`." type ApiKeys { "64-character lowercase hexadecimal API key." key: String "64-character lowercase hexadecimal API secret." secret: String "Lowercase hexadecimal signature for a test request containing `test=value` and the returned `api_key`." signature: String } "Subscription state grouped by product area, returned in `me.subscriptions`." type SubscriptionTypes { snapshots: SubscriptionDetails recordings: SubscriptionDetails abTesting: SubscriptionDetails } "An additional subscription product returned in `me.subscriptions` as a separate priced item." type SubscriptionProduct { name: String "Recurring amount in decimal billing currency units; the currency code is not returned." amount: Float "Unit of the product's own billing interval, which can differ from the plan's." intervalType: SubscriptionIntervalType } """ Subscription state for one product area returned in `me.subscriptions`, including the current plan and any next-plan or fallback pricing. """ type SubscriptionDetails { id: Int! paymentPlan: PaymentPlan isActive: Boolean! isExpired: Boolean! isCancelled: Boolean! isExpiring: Boolean! isCancelling: Boolean! "Subscription start time in Unix seconds." startedOn: Int "Cancellation time in Unix seconds; null when unset." cancelledOn: Int "Subscription expiry time in Unix seconds; null when unset." expiredOn: Int "Renewal time in Unix seconds; null when unset." renewOn: Int "Last subscription update time in Unix seconds." updatedAt: Int "Recording retention duration in months; null for other product areas." storageDuration: Int "Recurring amount in decimal billing currency units; the currency code is not returned." amount: Float products: [SubscriptionProduct] intervalType: SubscriptionIntervalType interval: Int "Next-plan amount in decimal billing currency units; the currency code is not returned." nextAmount: Float nextIntervalType: SubscriptionIntervalType nextInterval: Int nextPaymentPlan: PaymentPlan "Fallback activation time in Unix seconds; null when unset." fallbackAfter: Int "Fallback amount in decimal billing currency units; the currency code is not returned." fallbackAmount: Float fallbackInterval: Int fallbackIntervalType: SubscriptionIntervalType } """ Plan metadata returned in `me.subscriptions`, including trial and free-plan flags; `planGroup` is null for groups not exposed publicly. """ type PaymentPlan { id: Int! name: String planType: String planGroup: String isTrial: Boolean! isEnterprise: Boolean! isFree: Boolean! isFreemium: Boolean! hasPrioritySupport: Boolean! } "A saved metadata key and optional string value returned in `me.userData`." type UserData { key: String! value: String } "Calendar units for subscription billing intervals returned in `me.subscriptions`." enum SubscriptionIntervalType { "Measure the billing interval in years" YEARS "Measure the billing interval in months" MONTHS "Measure the billing interval in days" DAYS } "Cursor page returned by `abTestList` and `abTestDashboardList`, with continuation metadata." type AbTestsListMeta { list: [AbTest!]! "Opaque continuation cursor to pass as `cursor` on the next request." nextPageCursor: String! "True when this page is full, so the next page may be empty; exact when ordering by `VISITORS`." hasNextPage: Boolean! "Effective number of tests requested per page." limit: Int! } "Lightweight test reference with variant ids returned by `abTestRefList`." type AbTestRef { id: Int! name: String! variants: [AbTestVariantRef!]! } "Lightweight variant reference nested in `abTestRefList`." type AbTestVariantRef { id: Int! "`Control` for the control, otherwise `Variant #` and the `position`, for example `Variant #2`." variantName: String! } "Status totals returned by `abTestStatusCounts`, excluding deleted tests." type AbTestStatusCountsResult { "Non-deleted test count in the returned scope; omit `site` for totals across accessible sites." total: Int "Number of visible RUNNING tests." running: Int "Number of visible STOPPED tests." stopped: Int "Number of visible DRAFT tests." draft: Int } "Goal/date-scoped totals and ordered variant metrics returned by `abTestResultCounts`." type AbTestResultCounts { "Goal used to calculate these metrics." selectedGoal: AbTestGoal! totals: AbTestResultTotals! "Per-variant metrics sorted by `order`, defaulting to generated name ascending." variantCounts: [AbTestVariantCount!]! } "Test-wide metrics for the selected goal and dates returned by `abTestResultCounts`." type AbTestResultTotals { "Unique test visitors in the requested metrics scope; zero when no visitor rows exist." totalVisitors: Int! "Converted visitors for the selected goal and dates; zero when no conversion rows exist." totalConversions: Int! "Conversions divided by visitors, as a percentage rounded to two decimals; zero with no visitors." avgConversionRate: Float! "Conversion value in ten-thousandths of `displayCurrency`; zero when no value is recorded." totalValue: AbTestValue! "Overall chi-square significance, 0-100 percent; null without visitors, a control, or a VARIANT comparison." significance: Float "Whether total visitors exceed zero in this metrics scope." hasResults: Boolean! } "One variant's metrics in the order requested by `abTestResultCounts`." type AbTestVariantCount { "Numeric variant id from `abTestRefList`, accepted by variant mutations; distinct from `resultsId`." variantId: Int! "Unique visitors to this variant in the requested metrics scope." visitors: Int! "Converted visitors for this variant, selected goal, and dates." conversions: Int! "Conversions divided by visitors, as a percentage rounded to two decimals; zero with no visitors." conversionRate: Float! "Relative conversion-rate change in percent, rounded to one decimal; null for control or zero control rate." improvementFromControl: Float "Conversion value in ten-thousandths of `displayCurrency`; zero when no value is recorded." value: AbTestValue! """ Traffic share in percent, rounded to two decimals; equal shares when no variant has a weight, and null when only other variants have one. """ trafficSplit: Float "Chi-square significance, 0-100 percent; null without visitors or comparison, or for the PATCH variant kind." significance: Float "Whether this is the sole non-retired variant with the highest nonzero conversion rate rounded to two decimals." hasBestImprovement: Boolean! } "Numbered page returned by `abTestListPaginated` without a total page count." type AbTestsListPaginatedMeta { list: [AbTest!]! "Current page number starting at 1." page: Int! } "Action availability for the viewer, nested in tests returned by `abTestList` and detail queries." type AbTestPermissions { "Whether loaded metrics contain visitors." canViewResults: Boolean! "Whether the viewer can edit and the test is RUNNING." canStop: Boolean! "Whether the viewer can create share links and loaded metrics contain visitors." canShare: Boolean! "Whether the viewer can edit and the test is not STOPPED; the mutation also checks its status." canChangeGoal: Boolean! "Whether the viewer can edit the test." canRename: Boolean! "Whether the viewer can edit and the test is not STOPPED; `abTestSetTrafficSplit` itself accepts any status." canAdjustWeight: Boolean! "Whether the viewer can edit the test." canCheckInstallation: Boolean! "Whether the viewer can edit the test." canDelete: Boolean! "Whether the viewer can edit and the test is not STOPPED; the mutation requires create access." canAddVariants: Boolean! "Whether the viewer can edit the test; the mutation requires create access." canDuplicate: Boolean! } "Test variant returned within `abTestList` and detail queries, with optional metrics and tracking links." type AbTestVariant { id: Int! """ JSON-encoded string in the `editorPatch` input format; null for controls, SPLIT variants, and variants without a patch. """ editorPatch: String "Zero-based stored variant position; creation assigns position 0 to control." position: Int! "Redirect destination for a split variant; null when not configured or not a redirect variant." redirectUrl: String "Opaque results-tracking id used in preview links; variant mutations accept numeric `id` instead." resultsId: String! "Retirement time in Unix seconds; null while the variant is not retired." retiredAt: Int "Stored variant kind; a missing stored kind is reported as VARIANT." type: AbTestVariantType! "`Control` for the control, otherwise `Variant #` and the `position`, for example `Variant #2`." variantName: String! "Whether a retirement timestamp is present." isRetired: Boolean! "Id of this variant's snapshot; null unless the test was saved with `createSnapshots` and has been published." snapshotId: Int "Test page URL with a variant preview fragment; null for a split variant with no redirect destination." viewVariantUrl: String "Signed variant thumbnail URL; null if no variant id or asset path can be built." thumbnailUrl: String "Signed variant screenshot URL; null if no variant id or asset path can be built." screenshotUrl: String """ Predicted lift range from past tests of the same kind of change (the A/B test pattern library); null for controls, redirect tests, and accounts without the `ab-test-prediction` feature. An estimate shown before and during a test, never a measured result. """ prediction: AbTestVariantPrediction "Computed metrics; null when metrics were not loaded, including editor and result detail queries." results: AbTestVariantResult "Viewer-specific action flags based on test status, retirement, and available results or snapshots." permissions: AbTestVariantPermissions! "Creation time in Unix seconds." createdAt: Int! "Last update time in Unix seconds." updatedAt: Int! "Configured traffic percentage, stored to tenths of a percent; null when no manual weight is set." weight: Float "Chi-square significance, 0-100 percent; null when metrics or a comparison are absent, or for PATCH kind." significance: Float "Saved descriptive text; null when none has been saved." description: String } "Computed variant metrics nested in `abTestList`; absent from detail queries that do not load metrics." type AbTestVariantResult { """ Traffic share in percent, rounded to two decimals; equal shares when no variant has a weight, and null when only other variants have one. """ trafficSplit: Float "Unique visitors to this variant in the loaded metrics." visitors: Int "Converted visitors for this variant and goal in the loaded metrics." conversions: Int "Conversions divided by visitors, as a percentage rounded to two decimals; zero with no visitors." conversionRate: Float "Conversion value in ten-thousandths of `displayCurrency`; zero when no value is recorded." value: AbTestValue "Relative conversion-rate change in percent, rounded to one decimal; null for control or zero control rate." improvementFromControl: Float "Whether this is the sole non-retired variant with the highest nonzero conversion rate rounded to two decimals." hasBestImprovement: Boolean! } "Variant action availability nested in tests returned by `abTestList` and detail queries." type AbTestVariantPermissions { "Whether the test is RUNNING, the variant is active and non-control, and the viewer can edit." canEdit: Boolean! "Whether the test is RUNNING, the variant is active and non-control, and the viewer can edit." canRetire: Boolean! "Whether the test is RUNNING and PATCH, the variant is non-control, and the viewer can edit." canDuplicate: Boolean! "Whether the test is RUNNING and this variant is not retired." canViewVariant: Boolean! "Whether `snapshotId` is set for this variant." canViewSnapshot: Boolean! "Whether this variant has visitors in the loaded results and `snapshotId` is set." canViewRecordings: Boolean! } "Linked or selected goal returned within `abTestResultDetail`, `abTestResultCounts`, and test lists." type AbTestGoal { id: Int! name: String "Stored generated goal name; null when it is unset or omitted from the selected-goal response." autoName: String "Whether the linked goal has been deleted." historical: Boolean! "Whether the goal tracks a conversion value: a trigger sets a value, or every trigger is an API or ecommerce event." hasValue: Boolean! } "One chronological time bucket returned by `abTestDistribution`, containing per-variant metrics." type AbTestDistribution { "Inclusive bucket start at midnight UTC in Unix seconds." startDate: Int! "Inclusive bucket end at the end of the UTC day in Unix seconds." endDate: Int! "Per-variant bucket metrics; empty when no variants or metric rows identify a variant." distribution: [AbTestDistributionItem!] } "One variant's metrics for a time bucket returned by `abTestDistribution`." type AbTestDistributionItem { "Numeric variant id from `abTestRefList`, distinct from the opaque `resultsId`." variantId: Int! "Converted visitors for this variant and goal, grouped by first conversion date." totalConversions: Int! "Unique variant visitors whose first test view is in the bucket and selected date range." totalVisitors: Int! "Conversion value in ten-thousandths of `displayCurrency`; zero when no value is recorded." totalValue: AbTestValue! "Conversions divided by visitors, as a percentage rounded to two decimals; zero with no visitors." avgConversionRate: Float! } "Monetary total returned by A/B test metric queries, scaled in the accompanying display currency." type AbTestValue { "Display currency code selected from the site setting, then account setting, then USD." displayCurrency: String "Integer ten-thousandths of `displayCurrency` (10000 = 1 currency unit); missing amounts become zero." displayWorth: Int } "Lifecycle state returned by test queries and accepted as a test-list status filter." enum AbTestStatus { "Unpublished test; choose to find tests that can be fully edited." DRAFT "Published test currently running; choose to find tests that can be stopped." RUNNING "Stopped test; choose to inspect completed runs." STOPPED "Soft-deleted test; returned after deletion but does not select deleted tests in list filters." DELETED } """ Predicted lift range of a variant from past tests of the same kind of change (the A/B test pattern library); an estimate, never a measured result. """ type AbTestVariantPrediction { state: AbTestVariantPredictionState! "Lower end of the 90% range of relative lift, as a fraction (-0.061 is -6.1%)." liftLow: Float "Upper end of the 90% range, as a fraction." liftHigh: Float "Median observed lift of the similar tests." liftMedian: Float "Similar past tests the range is built on." basisTests: Int "Accounts those tests came from." basisAccounts: Int "Specificity of the match: 1 is the most specific kind of change, 6 is every on-page test." basisLevel: Int modelVersion: String "Unix seconds of the last state change." updatedAt: Int } "Lifecycle of a predicted lift range." enum AbTestVariantPredictionState { "Being computed; poll again in a few seconds." PENDING "A range is available." READY "No range applies to this variant." UNAVAILABLE } "Variant role or stored patch kind used by test queries and variant inputs." enum AbTestVariantType { "Original page; assigned to the first variant on creation." CONTROL """ Older non-control kind; new variants are created as `VARIANT`, and `PATCH` variants are left out of significance, so prefer `VARIANT`. """ PATCH "Non-control variant; the role given to every variant after the first on create and add, for PATCH and SPLIT tests." VARIANT } "Test mechanism chosen during creation and returned by test queries." enum AbTestType { "Page changes supplied by non-control variants through `editorPatch`." PATCH "Redirect test with `redirectUrl` required on every non-control variant before publication." SPLIT } """ How the page applies a PATCH variant's transforms when target elements are not on the page yet; missing targets are retried. """ enum AbTestPatchStrategy { "Apply transforms whose targets exist and retry the rest; the default when `patchStrategy` is omitted." async "Wait until every target exists, then apply all transforms together." all_or_none "Apply transforms in order, retrying a missing target before moving on." sync } "Ordering for `abTestList` and `abTestDashboardList`; applies defaults only when the object is supplied." input AbTestListOrder { "Sort direction; defaults to DESC when omitted within the order object." sort: AbTestListSortOrder "Sort key; defaults to CREATED_AT when omitted within the order object." field: AbTestListSortField } "Direction for sorting the cursor-based A/B test list." enum AbTestListSortOrder { "Ascending values for the selected test sort field." ASC "Descending values for the selected test sort field; default when the order object is supplied." DESC } "Sort key for `abTestList` and `abTestDashboardList`." enum AbTestListSortField { "Creation time with id as a tie-breaker; default when the order object is supplied." CREATED_AT "Stored test name for alphabetical ordering." NAME "Total unique test visitors over all time for traffic-based ordering." VISITORS } "Ordering for the variant metrics returned by `abTestResultCounts`." input AbTestVariantOrder { "Sort direction; defaults to ASC." sort: AbTestVariantSortOrder "Variant sort key; defaults to NAME." field: AbTestVariantSortField } "Direction for ordering variant metrics in `abTestResultCounts`." enum AbTestVariantSortOrder { "Ascending values for the selected variant field; default direction." ASC "Descending values for the selected variant field." DESC } "Variant metric or generated name used to order `abTestResultCounts`." enum AbTestVariantSortField { "Generated Control or Variant name; default sort key." NAME "Visitor count in the selected goal/date scope." VISITORS "Conversion count for the selected goal and dates." CONVERSIONS "Conversion percentage for the selected goal and dates." CONVERSION_RATE "Computed significance percentage for the selected goal and dates." SIGNIFICANCE "Conversion value for the selected goal and dates." VALUE } """ Service provider settings accepted by `saveSsoSettings`; use values from `ssoSettings` when retaining configuration. """ input SsoSpConfigurationInput { """ Nonblank service provider entity ID matching the IdP configuration; use `ssoSettings.spConfiguration.defaultEntityId` to reset it. """ entityId: String! } "Identity provider values accepted by `saveSsoSettings`; all three fields are required when enabling SSO." input SsoIdpConfigurationInput { "Identity provider issuer/entity ID; required when enabling SSO." entityId: String "Absolute HTTPS identity provider login URL; required when enabling SSO." targetUrl: String "IdP signing certificate as PEM or base64 text, at least 150 characters; required when enabling SSO." certificate: String } """ One ordered provisioning rule for `saveSsoSettings`; all its conditions must match before the action applies. """ input SsoProvisioningRuleInput { "Nonempty conditions combined with AND; the final rule must contain exactly one `ANYONE` condition." conditions: [SsoProvisioningConditionInput!]! "Action applied when all rule conditions match." action: SsoProvisioningActionInput! } "One exact-match clause in a provisioning rule accepted by `saveSsoSettings`." input SsoProvisioningConditionInput { "Use `EMAIL` or `ATTRIBUTE` before the final rule; the final rule must use `ANYONE`." type: SsoProvisioningConditionType! """ Required only for `ATTRIBUTE`; names match after lowercasing, taking the final slash segment, and removing nonletters. """ attribute: String """ Exact, case-sensitive values, not patterns (full email addresses for `EMAIL`); any one matching value satisfies the condition. Provide at least one for `EMAIL` or `ATTRIBUTE`; omit for `ANYONE`. """ values: [String!] } "Membership action for a matching rule in `saveSsoSettings`; role and site scope apply only to `CREATE`." input SsoProvisioningActionInput { "Use `CREATE` to provision or associate members; use `EXISTING` to allow existing account members only." type: SsoProvisioningActionType! """ Required for `CREATE` and omitted for `EXISTING`; `OWNER` requires `specificSites: false` and no site list. """ role: SsoProvisioningActionRole """ Required for `CREATE`; true restricts access to `sites` and false grants all sites. Must be false for `OWNER` and omitted for `EXISTING`. """ specificSites: Boolean """ Site IDs from `sites`; required and nonempty for `CREATE` with `specificSites: true`. Omit or use an empty list for all sites or `EXISTING`. """ sites: [Int!] } """ Saved settings or a proposed configuration returned by `saveSsoSettings`, with test-login details when validation is needed. """ type SaveSsoSettingsResult { needsValidation: Boolean! "Test-login URL; POST the returned token as `validation_token`. Null when validation is unnecessary." validationUrl: String "Opaque test-login token valid for five minutes; null when validation is unnecessary." validationToken: String "Validation request creation time in Unix seconds; null when validation is unnecessary." validationTimestamp: Int ssoSettings: SsoSettings! } "Normalized tag and affected-recording count returned by `addTagsToRecordings` and `removeTagsFromRecordings`." type TagAndCount { "Tag after lowercasing, trimming, and truncating to 50 characters." tag: String! "Number of recordings actually changed for this tag; excludes recordings already in the requested state." count: Int! } "IDs returned by `pauseSnapshots`, separated into newly and already stopped snapshots." type StopResult { "Snapshot IDs newly stopped by this request." affected: [Int]! "Requested IDs already marked stopped; separate from newly stopped IDs." alreadyStopped: [Int]! } "Snapshot ID and name accepted by `renameSnapshot`." input SnapshotRenameParams { "Snapshot ID from `snapshotsList` or `snapshots`." id: Int! "Nonblank name; trimmed, stripped of angle brackets and truncated to 140 characters." name: String! } "Report views accepted by `exportSnapshots`; select at least one." enum SnapshotExportView { "Heatmap export, for the heatmap report view." HEATMAP "Scrollmap export, for retrieving the scrollmap report view." SCROLLMAP "Confetti export, for retrieving the confetti report view." CONFETTI "Overlay export, for retrieving the overlay report view." OVERLAY "List export, for retrieving the list report view." LIST "JSON export, for structured report data with JSON export access." AI } "Batch creation result from `createSnapshots`, containing created IDs and names or validation errors." type CreateSnapshotsResults { "Created IDs and names in input order; null when validation errors prevent creation." snapshots: [CreateSnapshotsResult!] "Validation failures; null on success." errors: CreateSnapshotsErrors } "Update result from `updateSnapshot`, containing the saved ID and name or validation errors." type UpdateSnapshotResults { "Saved ID and name; null when validation fails." snapshot: CreateSnapshotsResult "Validation failures; null on success." errors: CreateSnapshotsErrors } "Result of `updateSnapshotsAutoExport`: the changed IDs, or the shared validation errors when nothing was saved." type UpdateSnapshotsAutoExportResults { "IDs whose auto-export was saved; empty when validation fails or none could be edited." affected: [Int!]! "Address errors in `settings` for `autoExportEmails`: `invalid_email` or `too_many`. Null on success." errors: CreateSnapshotsErrors } "Partial save result from `resumeSnapshotsNew`, containing changed IDs and any save errors." type ResumeSnapshotsResults { "IDs successfully resumed; ineligible or inaccessible IDs are omitted." affected: [Int!]! "Individual save failures; null when all eligible updates succeed." errors: CreateSnapshotsErrors } "Saved snapshot ID and name returned by `createSnapshots` or `updateSnapshot`." type CreateSnapshotsResult { id: Int! name: String } "Validation errors grouped by capture item and shared setting in create, update and resume results." type CreateSnapshotsErrors { """ Indexed per-item errors for `name`, `siteUrl`, `device` or `trackingDevices`. Messages are `required`, `invalid_url`, `too_long`, `denied` (no editable site exists for the URL's domain and the session cannot create sites), `invalid`, `tracking_empty` or `tracking_mismatch` (`device` is not in `trackingDevices`); an empty list means no per-item errors. """ snapshots: [CreateSnapshotsError!] """ Shared-setting errors deduplicated by field and message, with no index. An empty list means no shared- setting errors. """ settings: [CreateSnapshotsError!] } "One validation error returned by `createSnapshots`, `updateSnapshot` or `resumeSnapshotsNew`." type CreateSnapshotsError { "Zero-based position of the item in `params`; null for shared-setting errors." index: Int """ Input field name in camelCase; `source_url` is reported as `siteUrl` and URL-rule errors as `matchingRule`. """ field: String """ Machine message for branching. In settings, messages include `required`, `invalid`, `regex_blank`, `wildcard_blank`, `regex_identical`, `wildcard_identical`, `invalid_rule`, `invalid_date`, `date_exceeds`, `date_in_past`, `dates_incongruent`, `at_least`, `at_most`, `cannot_set_reoccurring` and `cannot_unset_reoccurring`. """ message: String! """ JSON-encoded object of details for `message`, for example `{"kind":"greater_than_or_equal_to","number":2,"validation":"number"}` for `at_least`. Useful keys are `number` for `at_least` and `at_most`, `count` for `too_long`, `device` for `tracking_mismatch` and `domain` for `denied`; `{}` when there are none. """ args: String } "One URL/device capture accepted by `createSnapshots`, combined with the shared settings." input CreateSnapshotsParams { """ Snapshot name; defaults to `siteUrl` when omitted. Trimmed, stripped of angle brackets and truncated to 140 characters. """ name: String """ Absolute HTTP or HTTPS page URL including protocol, at most 4096 characters; surrounding whitespace is trimmed. """ siteUrl: String! "Device used for the screenshot; must also appear in `trackingDevices`." device: SnapshotDevice! """ Non-empty list of traffic devices to track; must include `device`. Omission produces an empty list and fails validation. """ trackingDevices: [SnapshotDevice] } "Shared capture and collection settings accepted by `createSnapshots`." input CreateSnapshotsSettings { """ Visit limit from 1 to the account per-snapshot cap. Used only with `expiresAtOption: CUSTOM`; omission or `DEFAULT` uses 25000. """ maxVisits: Int "True uses a user-uploaded screenshot and element data instead of automatic capture; omitted means false." pageCameraSnapshot: Boolean """ With `pageCameraSnapshot: true`, true starts processing already uploaded files; false or omitted waits for user files. Ignored for automatic capture. """ preUpload: Boolean """ `SCHEDULED` uses `startsAt` when supplied; `IMMEDIATELY`, or a missing `startsAt`, starts without a scheduled time. """ startsAtOption: StartsAtOption! """ Unix seconds for `SCHEDULED`; ignored for `IMMEDIATELY`. If supplied, must not be in the past or after expiration; omission leaves the start unscheduled. """ startsAt: Int """ `DEFAULT` uses 60 days and 25000 visits; `CUSTOM` uses supplied `expiresAt` and `maxVisits`, with either missing value falling back to its default. """ expiresAtOption: ExpiresAtOption! """ Unix seconds used only with `CUSTOM`; must not be in the past or more than three years after start. Omission uses start plus 60 days, with current time as the unscheduled start. """ expiresAt: Int "True applies `samplingRatio`; false ignores its required value and clears custom sampling." useSamplingRatio: Boolean! """ Track one in this many visits, integer 2 to 50000 when `useSamplingRatio` is true. Required by the schema even when false, when the value is ignored. """ samplingRatio: Int! "Screenshot cleanup mode; only `REMOVE_ELEMENTS` uses `removeElements`." removeElementsOption: RemoveElementsOption! """ Comma-separated CSS selector text, for example `.modal, #banner`; truncated to 1000 characters. Used only with `REMOVE_ELEMENTS`; omitted or empty text adds no removal rule. """ removeElements: String """ True applies `waitAfterLoad` to screenshot capture; false ignores its required value and clears the custom delay. """ useWaitAfterLoad: Boolean! """ Delay after page load in seconds, clamped to 0 through 60. Required by the schema even when `useWaitAfterLoad` is false, when the value is ignored. """ waitAfterLoad: Int! """ Selects the matching rule type; `DEFAULT` ignores `matchingRule`, while other types use their corresponding fields. """ trackingOption: TrackingOption! """ Ignored for `DEFAULT`; `URL` accepts omitted strict flags as false. `WILDCARD`, `REGEX`, `NAMED` and `GOOGLE_OPTIMIZE` need their respective text field. """ matchingRule: MatchingRule """ True requests a successor snapshot when this one reaches its date or visit limit, subject to account eligibility; defaults to false. """ reoccurring: Boolean """ Auto-export cadence; omission or null creates heatmaps that do not export themselves. A cadence requires the `autoExport` snapshots permission, and AI-origin requests cannot set one. """ autoExport: SnapshotAutoExport """ Up to 10 addresses that receive each auto-export's download link; addresses differing only in case are sent once. Omission or an empty list sends no email, and exports still reach the Exports list. AI-origin requests must omit it, even as an empty list. """ autoExportEmails: [String!] } """ Settings accepted by `updateSnapshot`; omitted name falls back to the source URL and omitted recurrence becomes false. """ input UpdateSnapshotParams { """ Replacement name; omission resets it to the source URL. Trimmed, stripped of angle brackets and truncated to 140 characters. """ name: String """ `SCHEDULED` applies a supplied `startsAt` only when `permissions.canEditStartDate` is true; omission leaves the start unchanged. """ startsAtOption: StartsAtOptionUpdate """ Unix seconds used only with `SCHEDULED` and start-date edit permission; omission leaves it unchanged. Must not be in the past or after expiration. """ startsAt: Int """ Requires `permissions.canEditExpiration` to take effect. `DEFAULT` resets date and visit limits; `CUSTOM` requires both values; omission preserves limits unless rescheduling a default expiration. """ expiresAtOption: ExpiresAtOption """ Unix seconds required with `CUSTOM` and expiration edit permission; ignored otherwise. Must not be in the past or more than three years after scheduled start or creation. """ expiresAt: Int """ Required with `CUSTOM` and expiration edit permission: 1 to the account per-snapshot cap. `DEFAULT` resets to 25000; otherwise ignored. """ maxVisits: Int "True applies `samplingRatio`; false ignores its required value and clears custom sampling." useSamplingRatio: Boolean! """ Track one in this many visits, integer 2 to 50000 when `useSamplingRatio` is true. Required by the schema even when false, when the value is ignored. """ samplingRatio: Int! "Screenshot cleanup mode; only `REMOVE_ELEMENTS` uses `removeElements`." removeElementsOption: RemoveElementsOption! """ Comma-separated CSS selector text, for example `.modal, #banner`; truncated to 1000 characters. Used only with `REMOVE_ELEMENTS`; omitted or empty text adds no removal rule. """ removeElements: String """ True applies `waitAfterLoad` to screenshot capture; false ignores its required value and clears the custom delay. """ useWaitAfterLoad: Boolean! """ Delay after page load in seconds, clamped to 0 through 60. Required by the schema even when `useWaitAfterLoad` is false, when the value is ignored. """ waitAfterLoad: Int! """ `DEFAULT` rebuilds the rule; other modes rebuild only with non-empty `matchingRule`, otherwise the current rule and devices are preserved. """ trackingOption: TrackingOption! """ Devices to track when the matching rule is rebuilt; must be non-empty and include the screenshot device. Ignored when the rule is preserved. """ trackingDevices: [SnapshotDevice] """ For non-default tracking, a non-empty object triggers rebuilding; omission or an empty object preserves the rule. Only fields for the selected type are used. """ matchingRule: MatchingRule """ True enables eligible automatic recurrence; omission sets false. Check `permissions.canSetReoccurring` or `canUnsetReoccurring` before changing it. """ reoccurring: Boolean """ Omission keeps the stored cadence; null turns auto-export off. A new cadence, start, expiration or visit limit restarts the schedule. Changing the cadence or addresses of a heatmap that auto-exports requires the `autoExport` snapshots permission, and AI-origin requests can only turn it off. """ autoExport: SnapshotAutoExport """ Replacement list of up to 10 addresses; omission keeps the stored addresses. AI-origin requests must omit it, including when they turn auto-export off. """ autoExportEmails: [String!] } """ Tracking rule details for `createSnapshots` and `updateSnapshot`; only fields selected by `trackingOption` are used. """ input MatchingRule { "For `URL`, true requires the same protocol, such as `https`; false or omitted ignores protocol." strictProtocol: Boolean """ For `URL`, true requires the exact hostname; false or omitted also matches host variants such as a leading `www.`. """ strictHost: Boolean """ For `URL`, true requires the exact path; false or omitted permits trailing slash and final index/default-page normalization. """ strictPath: Boolean """ For `URL`, true requires equal query parameters; false or omitted requires source parameters but permits extra parameters. """ strictQuery: Boolean """ For `URL`, true requires the same fragment; false or omitted ignores it only when the source has no fragment. """ strictHash: Boolean """ For `WILDCARD`, nonblank whole-URL pattern using `*`, for example `example.com/products/*`. An omitted protocol accepts HTTP or HTTPS; must differ from the source URL. """ wildcard: String """ For `REGEX`, regular expression such as `^https?://example[.]com/products/`; add anchors to constrain matches. Must be nonblank and differ from the source URL. """ regex: String """ For `NAMED`, the page name to match, normally the snapshot name. The page declares it with `var CE_SNAPSHOT_NAME = "...";` before the tracking script; `renameSnapshot` keeps the rule in sync. """ named: String """ For `GOOGLE_OPTIMIZE`, the legacy Google Optimize value to match exactly; no URL normalization is applied. """ googleOptimize: String } "Collection start mode for `createSnapshots`." enum StartsAtOption { "No scheduled start, for collection beginning immediately." IMMEDIATELY "Supplied future start time, for delayed collection; omission of the time leaves it unscheduled." SCHEDULED } "Collection start mode accepted by `updateSnapshot`." enum StartsAtOptionUpdate { "Reschedule a future start, when start-date editing is permitted and `startsAt` is supplied." SCHEDULED } "Expiration and visit-limit mode for snapshot creation and updates." enum ExpiresAtOption { "60 days and 25000 visits, for standard collection limits." DEFAULT "Caller-selected date and visit limits, for customized collection duration or volume." CUSTOM } "Element removal mode for the screenshot background during capture." enum RemoveElementsOption { "No explicit element removal, for an unchanged screenshot background." DEFAULT "Automatic popup removal, for hiding popups during screenshot capture." REMOVE_POPUPS "Explicit selector removal, for hiding elements named in `removeElements`." REMOVE_ELEMENTS } "Rule type that selects matching visits for snapshot creation and updates." enum TrackingOption { "Normalized source URL matching, for standard page tracking without strict flags." DEFAULT "Source URL matching with optional strict flags, for controlling URL component comparisons." URL "Whole-URL wildcard matching, for patterns such as `example.com/products/*`." WILDCARD "Regular-expression matching, for URL patterns requiring regex syntax." REGEX "Page-name matching via `CE_SNAPSHOT_NAME`, for different pages that share one URL." NAMED "Legacy Google Optimize matching on an exact stored value." GOOGLE_OPTIMIZE } "One reusable font for setSiteFonts, using a system family, Google font, or external HTTPS resource." input SiteFontInput { "Font family trimmed to 1-100 characters; system fonts must be a supported family." family: String! "system, google, or external, case-insensitive; normalized to lowercase." source: String! """ For external fonts: stylesheet, javascript, or font; inferred from the URL extension if absent or unrecognized. """ resourceType: String """ HTTPS resource URL for external fonts; font files need a path, and scripts must use a supported provider or the site's domain. """ url: String """ Optional JavaScript function path for external scripts, such as WebFont.load; a trailing () is stripped. Typekit uses Typekit.load. """ onLoadCallback: String } "Share-link state and note for `updateSharedUrl` and `updateSharedUrlList`." input SharedUrlUpdateParams { "Share-link record id from `sharedUrls` or `sharedUrl`." id: Int! "Enabled or disabled public lookup state to save." status: SharedUrlStatus! "Replacement note; null or omitted clears it. `updateSharedUrlList` requires the key in every item." note: String } """ Custom playlist parameters for `savePlaylist`; the saved filter selects matching recordings dynamically rather than storing recording ids. """ input PlaylistParams { "Positive custom playlist `id` from `playlistsList` for this site; omitted or null creates a playlist." id: Int "Non-blank name, at most 255 characters; required when creating and retained when omitted on update." name: String """ JSON-encoded string. Envelope: `{"version":2,"operator":"AND","conditions":[...]}`, where `operator` is uppercase `AND` or `OR` and `conditions` is a non-empty list of nested groups or leaves. A leaf has `criteria`, `comparison` only when the criterion takes one, and `value` or `values` (plus `multiple_values` where required). Call `recordingsCriteriaDefinition` for the criteria catalog; the `recordings-filter` skill is the long-form reference. Required on create and update. Example: {"version":2,"operator":"AND","conditions":[{"criteria":"date_range","value":{"special":"last 30 days"}}]} """ filter: String } "Successful page registrations and per-URL errors returned by `pageSpeedPagesCreate`." type PageSpeedPagesMutationPayload { "Successful page payloads in input order, excluding failed URLs." pages: [PageSpeedPageMutationPayload!]! "Individual URL failures in input order; other URLs may still succeed." errors: [PageSpeedPageCreateError!]! } "One per-URL failure returned by `pageSpeedPagesCreate`." type PageSpeedPageCreateError { "Zero-based position in the submitted URL list." index: Int! url: String! message: String! } "Tracked page and accepted check request returned by Page Speed create or refresh mutations." type PageSpeedPageMutationPayload { "Tracked page ID accepted by `pageSpeedPage`; not a run ID." id: Int! siteId: Int! sourceUrl: String! "Always true in successful create and refresh payloads; read `pageSpeedPage` for current check state." isRefreshing: Boolean! "Currently an empty list after create or refresh; capture runs are available from later page queries." runs: [PageSpeedRunMutationPayload!]! } "Run reference returned by `pageSpeedRunRetry`; page create and refresh currently return no run references." type PageSpeedRunMutationPayload { "Original capture run ID supplied to `pageSpeedRunRetry`; not a newly created run." id: Int! device: PageSpeedDevice! "Original run trigger string: scheduled, manual, or metadata." trigger: String! } "Device profile for Page Speed captures." enum PageSpeedDevice { "Desktop capture profile, for desktop performance" DESKTOP "Phone capture profile, for mobile performance" PHONE } """ Saved version of a page editor page, returned by `pageEditorGetEditor`, `publishVersion`, and `unpublishVersion`. Published versions are applied by the tracking script. """ type PageVersionResponse { "Version UUID accepted by publishing and version mutations." id: String! "Saved version name; null when no name is stored." name: String "Saved JSON-encoded patch body; null when no patch is stored." patch: String """ Publication time as an ISO 8601 UTC string (`YYYY-MM-DD HH:MM:SSZ` from `unpublishVersion`); null when not published. """ publishedAt: String "Creation time as an ISO 8601 UTC string (`YYYY-MM-DD HH:MM:SSZ` from `unpublishVersion`)." createdAt: String "Last update time as an ISO 8601 UTC string (`YYYY-MM-DD HH:MM:SSZ` from `unpublishVersion`)." updatedAt: String "JSON-encoded audience definition; null when no definition is set." segment: String "Signed version thumbnail viewing URL valid for one week." thumbnailUrl: String! } "Publishing-access result from `pageEditorCheckPermissions`, including any owner notification." type PageEditorCheckPermissionsResponse { "True when publishing is allowed; null when access is missing and the owner is emailed." publishAccess: Boolean "True when an access request email is sent to the owner; null otherwise." sentOwnerEmail: Boolean "Owner account id, including the newly assigned user id for an unowned editor." editorUserId: Int! } "User publishing-access result from `pageEditorValidateUser`, including validation email status." type PageEditorValidateUserResponse { "True when publishing is allowed; null when access is missing and the owner is emailed." publishAccess: Boolean "True when an access request email is sent to the owner; null otherwise." sentOwnerEmail: Boolean "Owner account id, including the newly assigned user id for an unowned editor." editorUserId: Int! "True when a permitted user without a logged-in session receives a validation email; null otherwise." sentUserValidationEmail: Boolean } "Version UUID and thumbnail details from `pageEditorCreateVersion` and `pageEditorUpdateVersion`." type PageEditorUpdateVersionResponse { "Saved version UUID accepted by version mutations." id: String! "Signed version thumbnail viewing URL valid for one week." thumbnailUrl: String! "Presigned form for a gzip-encoded PNG thumbnail up to 10 MiB." thumbnailUploadUrl: S3PresignPost! } "Editor and page identifiers with thumbnail details from `pageEditorCreatePage`." type PageEditorCreatePageResponse { "Editor UUID accepted as `editorId` by page editor operations." editorId: String! "Page UUID accepted by page editor page and version mutations." pageId: String! "Page editor token scoped to the page's editor." token: String! "Signed page thumbnail viewing URL valid for one week." thumbnailUrl: String! "Presigned form for a gzip-encoded PNG thumbnail up to 10 MiB." thumbnailUploadUrl: S3PresignPost! } "Notification delivery rule returned by `notificationsList`, `notificationCreate`, and `notificationEdit`." type Notification { id: Int! "Site the rule belongs to; pass it as `siteId` to `notificationEdit` and `channelsList`." siteId: Int! resource: NotificationResource! "Resource id stored as a string; interpreted according to `resource`." resourceId: String! action: NotificationAction! "Whether the rule is enabled for notification delivery." enabled: Boolean! "Rule creation time in Unix seconds." createdAt: Int! "Name of the goal, survey, or site the rule watches." resourceName: String! "Creating user, with saved id/name fallback when the user no longer exists." createdBy: User channel: Channel! } "Resource types supported by notification rules." enum NotificationResource { "Goal conversions, for conversion alerts." GOAL "Survey responses or completions, for survey alerts." SURVEY "Site errors, for error alerts." SITE } "Resource-specific events that trigger notification delivery." enum NotificationAction { "Goal conversion, for goal rules." CONVERTED "Survey response, for response alerts." RESPONDED "Survey completion, for completion alerts." COMPLETED "Site error, for site rules." ERROR_OCCURRED } "Channel types accepted by `notificationCreate`; Slack uses an existing channel." enum ChannelInputType { "Slack delivery, using an existing channel id." SLACK "Email delivery, using an email address or existing channel." EMAIL "API delivery, using a URL or existing channel." API } "Queueing result from the email mutations; success confirms submission rather than final delivery." type SendEmailResult { "True when the message is accepted for sending; does not confirm delivery." success: Boolean! "Queued email details on success; validation failures return an operation error." email: EmailDetails } "Queued email metadata returned by email mutations; optional fields vary by message type." type EmailDetails { "Recipient: the Crazy Egg help or support inbox, or the developer email for install instructions." to: String! "Sender address: the caller's account email for feedback, a Crazy Egg address for the other emails." from: String! "Email subject." subject: String "Reply address supplied for support messages or feedback; null for installation instructions." replyTo: String "Acting user id for feedback/support messages; null for installation instructions." userId: Int "Message body as submitted." message: String "Always null in these responses." templateName: String } "Sender identity and message for `sendPrioritySupportEmail` and `sendAddonDetailEmail`." input SimpleEmailParams { "Nonblank sender display name." fromName: String! "Nonblank email used as the reply address." fromEmail: String! "Nonblank message body." message: String! """ Marks an add-on inquiry as corporate, changing its subject; only `sendAddonDetailEmail` uses it. Defaults to false. """ isCorporate: Boolean } "Developer recipient and site details for `sendInstallInstructionsEmail`." input InstructionsEmailParams { "Valid developer email address receiving the installation instructions." developerEmail: String! "Nonblank site URL included in the subject and instructions." siteUrl: String! "Personal note included in the email; required and non-blank even though the field is nullable." message: String "True to copy the acting user's account email; omitted or false sends no copy." ccMe: Boolean } "Browser handoff returned by `initializeSegmentIntegration` to complete the Segment installation flow." type InitializeSegmentIntegrationResult { "Browser URL that starts Segment consent; the installation handoff expires after 600 seconds." redirectUrl: String } "Interaction recorded for a displayed guided task recommendation." enum GuidedTaskEventType { "Recommendation displayed, for recording an impression." VIEW "Recommendation clicked, for recording engagement." CLICK } "One view or click on a guided task recommendation for `recordGuidedTaskEvents`." input GuidedTaskEventInput { "Caller-generated event UUID used to deduplicate repeated submissions." id: String! "Tracking token supplied with the recommendation; must match this account and user and be unexpired." token: String! "Whether the recommendation is displayed or clicked." eventType: GuidedTaskEventType! } """ Id of the goal changed by `goalCreate`, `goalEdit`, `goalRename`, or `goalDelete`. Fetch the full goal with `goalDetail`, or with `goalRef` after deletion. """ type GoalMutationResult { id: Int! } "Goal to create with `goalCreate`." input GoalCreateParams { "Site id from the `sites` query." siteId: Int! "Conversion name. Must be between 1 and 255 characters." name: String! "Fallback display label stored as given; the web app sends the goal name." autoName: String! "Triggers that define when the goal converts. Omit `id` on every entry; ids are rejected on create." triggers: [GoalTriggerInput!]! """ Editor preference: when true, the web app copies the first trigger's value settings to every trigger. The server only stores the flag, so send each trigger's value settings explicitly. """ syncValues: Boolean } "New state for `goalEdit`. `triggers` replaces the whole trigger set; omitting `name` or `syncValues` keeps it." input GoalEditParams { "Goal id from `goalRefList` or `goalCardList`." id: Int! "New goal name, trimmed, then 1 to 255 characters. Omit to keep the current name; null is rejected." name: String "Fallback display label stored as given; the web app sends the goal name." autoName: String! """ Complete trigger list. Send `id` from `goalDetail` to keep and update a trigger; entries without `id` are created and existing triggers left out are soft-deleted. Send only triggers whose `deletedAt` is null; an id that is not one of this goal's triggers fails the whole edit. """ triggers: [GoalTriggerInput!]! "Editor preference for copying the first trigger's value settings; stored only. Omit to keep." syncValues: Boolean } """ One trigger for `goalCreate` or `goalEdit`: a JSON filter that defines when the goal converts, plus optional conversion value settings. """ input GoalTriggerInput { "Existing trigger id from `goalDetail`, used only by `goalEdit` to update it; omit to create." id: Int "Optional trigger name. Must be at most 20 characters." name: String "Fallback trigger label stored as given; the web app sends `Trigger 1`, `Trigger 2`, and so on." autoName: String """ JSON-encoded string with one trigger filter: an object with integer `version` 3 (legacy 2 is still accepted), `operator` `OR` or `AND`, and a non-empty `conditions` array. Send one condition per trigger and use separate triggers for alternatives. Each condition has `criteria`, `multiple_values` set to `or`, and a `values` array, and never `comparison`. `goalDetail` returns existing filters in this format. Example: {"version":3,"operator":"OR","conditions":[{"criteria":"url_visit","multiple_values":"or","values":["https://example.com/thanks"]}]}. `url_visit` values are non-empty page URL strings. `code` values are non-empty conversion codes that the page passes to `CE2.converted`, for example {"criteria":"code","multiple_values":"or","values":["signup"]}. `click` and `form_submission` values are objects with strings `auto_name`, `source_url`, `selector_for_desktop`, `selector_for_tablet`, and `selector_for_phone`, booleans `sync_selectors` and `on_any_page`, `selector_source` (`manual` for your own CSS selectors, `specific`, or `broad`), and optional `name`, `preview_url`, and `on_page`; form submissions also need non-empty `source_url` and selectors. Example: {"criteria":"click","multiple_values":"or","values":[{"auto_name":"Buy","source_url":"https://example.com","selector_for_desktop":"#buy","selector_for_tablet":"#buy","selector_for_phone":"#buy","selector_source":"manual","sync_selectors":true,"on_any_page":true}]}. `pixel_event` values are objects with boolean `on_any_page`, `api` (`google`, `tiktok`, `meta`, or `ga4`), and optional `id` and `event`, for example {"criteria":"pixel_event","multiple_values":"or","values":[{"on_any_page":true,"api":"meta","event":"Purchase"}]}. `ecommerce_event` values are objects with boolean `on_any_page`, `api` (`shopify`, `woocommerce`, `magento`, `wixapi`, `squarespace`, or `generic`), and `event` (`addToCart`, `startCheckout`, or `checkoutCompleted`), for example {"criteria":"ecommerce_event","multiple_values":"or","values":[{"on_any_page":true,"api":"woocommerce","event":"checkoutCompleted"}]}. A Shopify `ecommerce_event` trigger is saved as an `api` trigger named after the goal. `api` triggers are created automatically with {"criteria":"api","multiple_values":"or","values":[]}; keep one by resending its `id` and `filter` unchanged. """ filter: String! "Source of the conversion value; omit for no value. Set `fixedValue` for `FIXED` and `elementValue` for `ELEMENT`." valueType: GoalValueType "Amount settings for `valueType: FIXED`; null otherwise." fixedValue: GoalFixedValueInput "Page element settings for `valueType: ELEMENT`; null otherwise." elementValue: GoalElementValueInput } "Fixed conversion amount stored on a trigger by `goalCreate` or `goalEdit`." input GoalFixedValueInput { "Amount per conversion as a decimal string in `currency` units, for example `25.50`." worth: String! "Currency code for `worth`, for example `USD`." currency: String! } "Settings for reading the conversion amount from a page element when `valueType` is `ELEMENT`." input GoalElementValueInput { "Currency code of the amount shown in the element, for example `USD`." currency: String! "Page scope and device-specific selectors of the amount element." condition: GoalValueConditionInput! } "Page scope and device-specific CSS selectors of the element that shows the conversion amount." input GoalValueConditionInput { "Where the amount is read: one page, pages matching a wildcard pattern, or any page." trackingOption: GoalTrackingOption! "How the selectors were chosen; use `MANUAL` when supplying your own CSS selectors." elementSelectorType: GoalElementSelectorType! "URL of the page where the amount element was selected." pageUrl: String! "URL pattern used when `trackingOption` is `WILDCARD`; null otherwise." wildcardUrl: String "The web app sends `pageUrl` for `SPECIFIC_PAGE`, `wildcardUrl` for `WILDCARD`, and null for `ANY_PAGE`." onPage: String "True for `ANY_PAGE`; the web app sends null for other options." onAnyPage: Boolean "CSS selector for the amount element on desktop." selectorForDesktop: String! "CSS selector for the amount element on tablet." selectorForTablet: String! "CSS selector for the amount element on phone." selectorForPhone: String! } "Source of a trigger's conversion value, set by `goalCreate` and `goalEdit` and returned by `goalDetail`." enum GoalValueType { "A set amount per conversion, configured in `fixedValue`" FIXED "An amount read from a page element, configured in `elementValue`" ELEMENT "An amount the page sends with the conversion through the JavaScript API" CODE } """ Saved funnel definition returned by funnel list, detail, create, and edit operations. Use its ordered goals and optional visit baseline with `funnelResult`. """ type Funnel { id: Int! siteId: Int! "Creation time in Unix seconds." createdAt: Int! name: String! "True when a synthetic site-visit baseline precedes the goal steps." visitStep: Boolean! "Accessible goals in saved step order; deleted or inaccessible goals are omitted." goalSteps: [FunnelGoal]! "Creator details, falling back to the saved ID and name when the current user record is unavailable." createdBy: User } "Accessible goal referenced by a saved funnel, returned in step order." type FunnelGoal { "Goal ID accepted by `funnelResult.steps.id`; not a funnel ID." id: Int! siteId: Int! "Configured goal name; null if no custom name is set." name: String "Generated goal label; null when unavailable." autoName: String "Goal creation time in Unix seconds." createdAt: Int } "Folder creation parameters for `createFolder`; ownership is derived from the current account." input FolderCreateParams { "Site id from `sites`; the site must be editable by the caller." siteId: Int! "Resource category: `snapshots`, `recordings`, `ab_testing`, or `editor`." type: String! "Non-blank folder title." title: String! } "Snapshots folder id and replacement title for `updateFolder`." input FolderUpdateParams { "Snapshots folder `id` from `folders` or `folder`; must belong to the current account on an editable site." id: Int! "Non-blank replacement folder title; other folder attributes are unchanged." title: String! } """ Fingerprint workflow update for `updateError`. Provide `status`, `note`, or both; any status can be selected, and omitting `status` keeps the current one. """ input ErrorStatusParams { "Fingerprint MD5 from `uniqueErrorList`; not an `errorList` occurrence UUID." fingerprintMd5: String! "Target workflow state; omit to preserve the existing state. No transition restriction is imposed." status: ErrorStatusEnum "Note appended to fingerprint history; required when `status` is omitted." note: String } "Saved fingerprint workflow state, selectable with `updateError`." enum ErrorStatusEnum { "Open workflow state, the default for a new fingerprint and the choice for reopening" UNRESOLVED "Resolved workflow state, for marking an investigated fingerprint complete" RESOLVED "Muted workflow state, for placing a fingerprint in the muted status bucket" MUTED } "Saved fingerprint status and acting-guest metadata returned by `updateError`." type UpdateErrorResponse { userId: Int siteId: Int "Group identifier accepted by fingerprint queries; not an occurrence UUID." fingerprintMd5: String! "Saved workflow state after the update." status: ErrorStatusEnum! "Acting guest ID recorded by this update." statusChangeGuestId: Int "Update time in Unix seconds." statusChangeAt: Int } "Requested flow status returned by `switchToFree` or `cancelSubscription`." type CancelSubscriptionResult { "`switched_to_free` from `switchToFree` or `canceled` from `cancelSubscription`." status: String! } """ Subscription payment status returned by `createSubscription`, with a client secret when payment confirmation is needed. """ type CreateSubscriptionResult { status: String! "Stripe payment confirmation secret; null when no confirmable payment is returned." clientSecret: String } "Refreshed default card summary returned by `setDefaultPaymentMethod`." type SetDefaultPaymentMethodResult { paymentMethod: DefaultPaymentMethod } "Embedded pricing-table customer session returned by `createStripeCustomerSession`." type StripeCustomerSessionResult { "The client secret for the customer session. Null if user has no Stripe customer." clientSecret: String } "Hosted checkout URL returned by `createCustomCheckoutSession`." type CustomCheckoutSessionResult { "Hosted Stripe checkout URL; opening it starts the checkout flow." checkoutUrl: String } """ Plan change response from `updateSubscriptionItems`; `kind` is always `UPDATED`, including deferred changes and checkout redirects. Confirm `clientSecret` when present, otherwise follow `url`. """ type UpdateSubscriptionResult { """ Redirect URL for checkout, payment completion, or a hosted invoice; null when `clientSecret` is supplied. """ url: String "Stripe payment confirmation secret; null when a redirect URL is returned." clientSecret: String kind: String "Reserved Unix-seconds timestamp; currently always null, including scheduled changes." scheduledAt: Int } "Authorization redirect returned by either Meta or Reddit connection initialization." type InitializeMetaAdsConnectionResult { "Provider authorization URL to navigate to; initialization failures return an operation error." redirectUrl: String } "Removed connection identity returned by `deleteAdPlatformConnection`." type DeleteAdPlatformConnectionResult { "Crazy Egg id of the deleted connection." connectionId: Int! platform: AdPlatformSource! } "Initial survey or CTA values for addonCreate; content is serialized separately from the audience definition." input AddonCreateParams { "Display name for the add-on." name: String! "JSON-encoded add-on content matching the current contract" content: String! """ JSON-encoded string. Audience object per audienceDefinitionContract; null targets all. Use before publication. Example: {"version":1,"operator":"and","conditions":[{"criteria":"device","comparison":"any","value":["phone"]}]} """ audienceDefinition: String "False saves an unpublished draft; true publishes and activates it immediately." active: Boolean! "Optional template ID from addonTemplatesList." addonTemplateId: Int "Optional suggestion ID from addonSuggestionsList." suggestionId: Int "Optional saved draft name." draftName: String "Optional JSON-encoded unpublished draft content matching the current contract" draftContent: String "SURVEY for questionnaires or CTA for calls to action." type: AddonType! "Optional goal ID from goalRefList to link to this add-on." goalId: Int } "Fields for addonEdit; omitted values preserve existing values, and a published add-on cannot move sites." input AddonEditParams { "Add-on UUID from addonList or addonDetail." id: String! "Replacement display name; omit to retain the current name." name: String "JSON-encoded live add-on content; AI may not change this after publication" content: String """ JSON-encoded string. Audience object per audienceDefinitionContract; null targets all. Use before publication. Example: {"version":1,"operator":"and","conditions":[{"criteria":"device","comparison":"any","value":["phone"]}]} """ audienceDefinition: String "Site ID from sites; changing the owning site is allowed only before publication." siteId: Int! "Saved unpublished name; null clears it." draftName: String "JSON-encoded unpublished content; AI may edit this even after publication" draftContent: String """ JSON-encoded string. Audience object per audienceDefinitionContract; null targets all. Requires a published add-on and draftContent. Example: {"version":1,"operator":"and","conditions":[{"criteria":"device","comparison":"any","value":["phone"]}]} """ draftAudienceDefinition: String "Goal ID from `goalRefList`; omit to keep the current link. A linked goal cannot be changed later." goalId: Int } "Saved add-on identity and preview token returned by addonCreate, addonEdit, and draft mutations." type AddonMutationResponse { "Add-on UUID accepted by addonDetail and add-on mutations." id: String! "Token for previewing the saved add-on on its site." previewToken: String! "SUCCESS after saving; DELETED when editing an already soft-deleted add-on." status: AddonMutationStatus! } "Reusable template content and catalog metadata for addonTemplateCreate." input AddonTemplateCreateParams { "Template display name." name: String! "Optional catalog description." description: String "Optional catalog category." category: String """ JSON-encoded string. The same content object `addonCreate` takes: `addonContentContract(type)` returns its JSON Schema and a full example, and the `addon-draft-create` skill is the long-form reference. Templates must not carry targeting: drop the example's `audience` and leave `behavior.activationURLs` empty. """ content: String! "SURVEY or CTA; selects the content contract." type: AddonType! } "Replacement template content and catalog metadata for addonTemplateEdit; the template type stays unchanged." input AddonTemplateEditParams { "Template ID from addonTemplatesList or addonTemplateDetail." id: Int! "Template display name." name: String! "Optional catalog description." description: String "Optional catalog category." category: String """ JSON-encoded string. The same content object `addonCreate` takes: `addonContentContract(type)` returns its JSON Schema and a full example, and the `addon-draft-create` skill is the long-form reference. Templates must not carry targeting: drop the example's `audience` and leave `behavior.activationURLs` empty. """ content: String! } "Deleted template identity returned by addonTemplateDelete." type AddonTemplateMutationResponse { id: Int! } "Result state returned by add-on create, edit, and draft mutations." enum AddonMutationStatus { "The add-on was saved successfully." SUCCESS "The add-on was already soft-deleted when edited." DELETED } "Normalized IP rule text and inline validation or save errors returned by `updateBlockedIps`." type UpdateBlockedIpsResult { "Normalized newline-separated IP rules, including comments and any invalid lines." text: String! errors: [UpdateBlockedIpsErrors!] } "One IP rule validation or save error returned by `updateBlockedIps`; `line` is absent for save failures." type UpdateBlockedIpsErrors { line: Int message: String! } "Interactions accepted by `trackGettingStarted` for onboarding checklist tasks." enum TrackGettingStartedEvents { "Record a click on an onboarding task" CLICK "Record a view of an onboarding task" VIEW } """ Settings for `abTestCreate`, `abTestUpdate`, and `abTestUpdateDraft`; `goal` holds draft form data only. Full updates preserve an omitted audience and ignore `variants`; use variant mutations to change variants. """ input AbTestCreateInput { "Test name; required when creating a test, while omitted full updates preserve the stored name." name: String "Site id from `sites`; use the `siteId` that `abTestCheckPage` returns for the page URL." siteId: Int! "Existing primary goal id from `goalRefList`; `goal` instead stores an unsaved draft form." goalId: Int """ Page URL the test runs on, saved as `pageUrl` after trimming and adding a missing HTTP scheme; `matchingUrl` is used when omitted. """ url: String """ URL pattern of the pages that run the test, where `*` is a wildcard, for example `https://example.com/products/*`; required even when `url` is set. """ matchingUrl: String! """ Device types the test runs on and its snapshots cover; required and non-empty. Must match the audience's effective devices; a null audience targets all three device types. """ devices: [SnapshotDevice!] """ Creates one snapshot per variant and device when a PATCH test is published or variants are added to it while RUNNING; omitted or false turns this off, including on `abTestUpdate`. """ createSnapshots: Boolean """ Variants for `abTestCreate`; the first becomes the control and the rest become variants. On `abTestSaveDraft`, include every existing variant exactly once with its numeric id and the original control first. Ignored by `abTestUpdate` and `abTestUpdateDraft`. """ variants: [AbTestVariantInput!] "PATCH applies editor changes; SPLIT redirects to variant URLs." type: AbTestType! "Whether automatic traffic reweighting is enabled; defaults to true when no stored or supplied value exists." autoReweight: Boolean "How the page applies PATCH transforms; defaults to `async` when omitted on `abTestCreate` or `abTestUpdate`." patchStrategy: AbTestPatchStrategy """ Notes saved on the test by `abTestSaveDraft`; other create/update inputs save them only in draft metadata. Use `abTestUpdateNotes` to change notes independently. """ notes: String """ JSON-encoded string. Audience object with `version`, `operator`, `conditions`, and optional `except`, defined by `audienceDefinitionContract`; preserve every requested criterion, including device criteria. Null targets everyone, an omitted value keeps the current audience on updates, and `devices` must match. Example: {"version":1,"operator":"and","conditions":[{"criteria":"device","comparison":"any","value":["desktop"]}]} """ audienceDefinition: String "Not used in the AB Test creation, it is there only for draft data" goal: GoalDraftParams } "Unsaved goal form stored inside the test's draft by create/update operations; it does not create or update a goal." input GoalDraftParams { "Site id from `sites`, saved only as draft goal form data." siteId: Int "Unsaved goal name; does not rename or create a goal." name: String "Generated goal name saved in the draft form." autoName: String "Unsaved trigger forms; not created as goal triggers by A/B test mutations." triggers: [GoalTriggerDraftParams!] "Draft form flag for synchronizing trigger values; does not change live goal values." syncValues: Boolean } """ Unsaved trigger form stored within the test's draft goal by create/update operations. Its fields are not executed or validated as a goal trigger. """ input GoalTriggerDraftParams { "Existing trigger id from `goalLinked.triggers`, saved only in the draft form." id: Int "Unsaved trigger name stored in the draft goal form." name: String "Generated trigger name saved in the draft goal form." autoName: String """ JSON-encoded string. Draft filter with `version`, `operator`, `conditions`; mirror `goalLinked`. Not decoded by A/B test saves. Example: {"version":3,"operator":"OR","conditions":[{"criteria":"code","multiple_values":"or","values":["1"]}]} """ filter: String "Device selections saved only in the draft trigger form." devices: [SnapshotDevice!] "Element selector mode saved only in the draft form; no allowed-value check is applied here." elementSelectorType: String "Whether the draft trigger form is expanded; does not affect live tracking." expanded: Boolean "Pixel provider saved only in the draft trigger form." pixelApi: String "Custom pixel event name saved only in the draft trigger form." pixelCustomEvent: String "Selected pixel event name saved only in the draft trigger form." pixelEvent: String "Pixel identifier saved only in the draft trigger form." pixelId: String "Code-trigger value saved only in the draft form; not executed by A/B test saves." code: String "Desktop CSS selector saved only in the draft trigger form." desktopSelector: String "Phone CSS selector saved only in the draft trigger form." phoneSelector: String "Tablet CSS selector saved only in the draft trigger form." tabletSelector: String "Wildcard URL pattern saved only in the draft trigger form." wildcardUrl: String "Trigger kind saved only in the draft form; no allowed-value check is applied here." trigger: String "Draft form flag for sharing element selectors across devices; does not update a live trigger." syncSelectors: Boolean "Target page URL saved only in the draft trigger form." targetUrl: String "Page matching mode saved only in the draft form; no allowed-value check is applied here." trackingOption: String } """ Variant settings for `abTestCreate`, `abTestAddVariants`, `abTestSaveDraft`, and `abTestUpdateVariants`. On create and add the position decides the role: the first variant of a test becomes CONTROL and later ones VARIANT, whatever `type` says. """ input AbTestVariantInput { """ Variant id from `abTestEditorDetail` or `abTestRefList`; required by `abTestSaveDraft` and `abTestUpdateVariants`, omitted on create and add. """ id: Int """ JSON-encoded string. Object with `default`, a list of transforms, plus optional global `style` (CSS) and `script` (JavaScript) strings. Each transform has a `target` CSS selector, `finalSelectors` (selectors for the element after the change), and exactly one change such as `text`, `style`, or `attr`. Required and validated for non-control PATCH variants when saved and at publish; ignored for controls and SPLIT tests. Full format: the `ab-test-variant-patches` skill. Example: {"default":[{"target":"h1","text":"New headline","finalSelectors":["h1"]}]} """ editorPatch: String "Split-test redirect URL; required for every non-control variant before publication, ignored on PATCH creation." redirectUrl: String """ Required by the schema, but on create and add the position sets the role. On `abTestUpdateVariants` it sets the role, and CONTROL clears `editorPatch`. """ type: AbTestVariantType! """ Traffic percentage, truncated to tenths; no bounds or total-of-100 check. Omission in `abTestUpdateVariants` clears the weight; omission in `abTestSaveDraft` preserves it. """ weight: Float "Descriptive text applied by `abTestUpdateVariants`; not saved during variant creation." description: String "Ignored by create/add/update; use `abTestRetireVariant` to retire a variant." status: String } "Existing variant id and traffic percentage accepted by `abTestSetTrafficSplit`; other variants retain their weights." input AbTestVariantWeightInput { "Numeric variant id from `abTestRefList` or `abTestEditorDetail.variants`; must belong to the test." id: Int! """ Traffic percentage, truncated to tenths; no range or total-of-100 validation, and omitted variants keep weights. """ weight: Float! } "Page validation returned by `abTestCheckPage`, including site selection." type AbTestCheckPageResult { "Always DESKTOP, PHONE, and TABLET in the current check; device conflicts are not checked." devices: [SnapshotDevice!] "Lowercase registrable domain of the normalized URL; null for malformed URLs." domain: String "Validation problems; null when none were recorded, rather than an empty list." errors: [AbTestCheckPageError!] "Resolved or newly created site id for test inputs; null when no site is found or creation fails." siteId: Int "True after creating a site, false if creation fails, or null when no creation is attempted." siteCreationSuccessful: Boolean "True when the caller should use the returned `siteId`; null when no site is selected or created." needToUpdateSiteId: Boolean "Legacy login-redirect result; null because login detection now runs in the browser." isLoginPage: Boolean @deprecated(reason: "Login redirects are checked in the browser.") "Legacy final URL; null because login detection now runs in the browser." finalUrl: String @deprecated(reason: "The browser proxy response supplies the final URL.") } "New draft id returned by `abTestDuplicate`; fetch its editor data with `abTestEditorDetail`." type AbTestMutationResult { id: Int! } "Stage of page validation used by `abTestCheckPage`; only INITIAL suppresses creation of a missing site." enum AbTestCheckPageType { "Validate a URL without side effects; never creates a missing site." INITIAL "Validate when leaving the URL step; creates a missing site for the domain." TRANSITION "Validate after editing variants; same site creation as `TRANSITION`." EDITOR_DONE } "Page validation problems returned by `abTestCheckPage`; some device error values are not currently emitted." enum AbTestCheckPageError { "URL cannot be normalized to a supported HTTP or HTTPS page." MALFORMED_URL "The domain belongs to a site this account cannot use, or no site exists and the caller cannot create sites." NO_PERMISSION "A required site could not be created." SITE_CREATION_FAILED "Device availability failure; not emitted by the current page check." NO_AVAILABLE_DEVICES "Device conflict with a running test; not emitted by the current page check." DEVICE_HAS_RUNNING_AB_TEST "Device selection required; not emitted by the current page check." DEVICE_SELECTION_REQUIRED } """ The Crazy Egg user behind a `createdBy` or `publishedBy` field on A/B tests, goals, funnels, and notifications. `login` is the user's email address and is null when only a saved author name is available. """ type User { id: Int login: String name: String } """ Heatmap snapshot returned by `snapshot`, `snapshots`, `snapshotsList` and `pageCameraSnapshots`, with collection settings and derived state. """ type Snapshot { "Creation time in Unix seconds; null when unavailable." createdAt: Int "Saved descriptive text; new snapshots use an empty string, and null means no value is recorded." description: String "Screenshot device as `desktop`, `phone` or `tablet`; separate from the devices whose traffic is tracked." device: String id: Int! "Visit limit for collection; null when no limit is recorded." maxVisits: Int name: String """ Saved lifecycle text: `active`, `stopped` or `deleted`; use `snapshotStatus` for the derived display state. """ status: String "Derived lifecycle state combining screenshot errors, schedule, limits and saved status." snapshotStatus: SnapshotStatus "Visit count; list queries refresh it when possible and cap it at a positive `maxVisits`." totalVisits: Int "Click count; list queries refresh it when possible." totalClicks: Int "Screenshot/report format version; may be null if not recorded." formatVersion: Int sourceUrl: String "Site ID usable with `site`; null when no site is associated." siteId: Int "Unix seconds when collection is stopped; null when no stop time is recorded." stoppedAt: Int "Unix seconds when deletion is recorded; null before deletion." deletedAt: Int "True for page camera snapshots using a user-uploaded screenshot and element data." manualScreenshot: Boolean """ Capture state: `needs_user_files`, `needs_processing`, `processing`, `processed` or `error`; may be null if unset. """ screenshotStatus: String "Pending log count awaiting processing; null when no count is recorded." numUnprocessedLogs: Int "Folder ID from `folders`; null when unfiled." folderId: Int "Collection expiration in Unix seconds; null when no expiration is recorded." expiresAt: Int "First recorded event time in Unix seconds; null when not recorded." firstEvent: Int "Last recorded event time in Unix seconds; null when not recorded." lastEvent: Int "Owning account ID; may be null if not available in the response." userId: Int """ Signed thumbnail URL valid for about one hour; an empty string until the screenshot is processed or when no URL can be generated. Reading it does not request a new capture. """ thumbnailUrl: String """ Elapsed collection duration in whole days, truncated toward zero, using the computed end or current time. """ duration: Int "Configured collection span in whole days, truncated toward zero; null when expiration is absent." totalDays: Int "Always zero in transformed snapshot query responses." recordingCount: Int """ Unix seconds of stop, visit-limit completion or expiration, in that priority order; null when no end is determined. """ endedAt: Int "`DEFAULT` only when both the 60-day span and 25000-visit limit match; otherwise `CUSTOM`." expiresAtOption: SnapshotExpiredAtOption "Scheduled collection start in Unix seconds; null for an immediate start, which uses creation time." startsAt: Int "`SCHEDULED` when a start time is stored, even after that time passes; otherwise `IMMEDIATELY`." startsAtOption: SnapshotStartsAtOption "True when a custom `samplingRatio` is stored." useSamplingRatio: Boolean """ One-in-N visit sampling denominator; null when custom sampling is disabled. New values range from 2 to 50000. """ samplingRatio: Int "Devices selected by the matching rule; defaults to all devices when no device restriction is present." trackingDevices: [SnapshotDevice] """ Rule type inferred from stored matching flags; `URL` is returned only when at least one strict flag is enabled. """ trackingOption: SnapshotTrackingOption """ JSON-encoded object of the current rule's `MatchingRule` values with snake_case keys, such as `{"wildcard":"example.com/*"}` or `{"regex":"^https://example[.]com/"}`; `{}` for `DEFAULT`. """ matchingRuleParams: String "Capture cleanup inferred from stored popup or selector options; defaults to `DEFAULT`." removeElementsOption: SnapshotRemoveElementsOption """ Plain CSS selector text used for capture removal; null when not configured, and newly saved text is capped at 1000 characters. """ removeElements: String "True when a custom capture delay is stored, including a zero-second delay." useWaitAfterLoad: Boolean """ Custom capture delay after page load in seconds, from 0 to 60 for newly saved settings; null when not configured. """ waitAfterLoad: Int "True when saved visits or clicks are greater than zero." hasData: Boolean "Always false in transformed snapshot query responses." isDemo: Boolean "True when `expiresAt` is null or in the past." isExpired: Boolean "True when the snapshot belongs to an A/B test variant." isAbTestVariant: Boolean "Deprecated alias of `isAbTestVariant`." isFlowVariant: Boolean @deprecated(reason: "Use is_ab_test_variant instead") "Action availability for this snapshot and current session." permissions: SnapshotPermissions! "True when automatic creation of a successor is enabled; false when unset." reoccurring: Boolean "Creating user ID; null when no creator is recorded." createdByUserId: Int "Deprecated alias of `createdByName`; null when no creator name is recorded." createdByUserName: String @deprecated(reason: "Use created_by_name instead") "Saved creator name; null when no creator name is recorded." createdByName: String "Auto-export cadence; null when the heatmap does not export itself." autoExport: SnapshotAutoExport "Addresses emailed each auto-export's download link; empty when exports only reach the Exports list." autoExportEmails: [String!] } """ Per-snapshot action availability returned with snapshot queries, accounting for session rights and snapshot state. """ type SnapshotPermissions { """ Whether recurrence can be turned on: needs edit rights and an automatic snapshot that is not an A/B test variant and is not completed or stopped. """ canSetReoccurring: Boolean! "Whether recurrence can be disabled before completion or creation of a successor." canUnsetReoccurring: Boolean! "Whether the snapshot has visits or clicks available to view." canView: Boolean! "Whether the session can edit this snapshot; A/B test variants are excluded." canEdit: Boolean! "Whether a future start can be changed; recurring snapshots and those with successors are excluded." canEditStartDate: Boolean! """ Whether `expiresAt` and `maxVisits` can be changed: needs edit rights, under three years of running time, visits below the account cap and no recurring successor. """ canEditExpiration: Boolean! """ Whether copying is available; manual captures, A/B test variants, recurring snapshots and those with successors are excluded. """ canDuplicate: Boolean! "Whether automatic recapture is available for a non-manual snapshot in running or error state." canRefresh: Boolean! "Whether a stopped, unexpired snapshot has visits remaining and no variant or successor restriction." canResume: Boolean! "Whether the snapshot has data and no screenshot error; export capability requirements still apply." canExport: Boolean! """ Whether the current session can pause a started active snapshot without variant or successor restrictions. """ canPause: Boolean! } """ Derived lifecycle states returned by snapshot queries; the first applicable state takes precedence in enum order. """ enum SnapshotStatus { "Screenshot capture failed; takes precedence over every other state." ERROR "Active with a start time still in the future." SCHEDULED "Paused, expired or at its visit limit; collection has finished." COMPLETED "Active and collecting visits." RUNNING "Deleted snapshot that matches none of the states above." DELETED "None of the other states applies." UNKNOWN } "Screenshot or tracked-traffic device category used by snapshot operations." enum SnapshotDevice { "Desktop screenshot or traffic, when targeting desktop visits." DESKTOP "Tablet screenshot or traffic, when targeting tablet visits." TABLET "Phone screenshot or traffic, when targeting phone visits." PHONE } "Expiration mode returned by snapshot queries." enum SnapshotExpiredAtOption { "60-day span and 25000-visit limit, when identifying standard collection limits." DEFAULT "Non-default date or visit limits, when identifying customized collection limits." CUSTOM } "Stored start mode returned by snapshot queries." enum SnapshotStartsAtOption { "A stored scheduled start, when a start time exists even if it is now in the past." SCHEDULED "No scheduled start, when collection uses creation time as its start." IMMEDIATELY } "Matching rule type inferred by snapshot queries." enum SnapshotTrackingOption { "Normalized source URL matching without strict flags, for standard page tracking." DEFAULT "Source URL matching with at least one strict `MatchingRule` flag set." URL "Whole-URL wildcard pattern, for matching URL groups with `*`." WILDCARD "Regular-expression matching, for advanced URL patterns." REGEX "Page-name matching via `CE_SNAPSHOT_NAME`, for different pages that share one URL." NAMED "Legacy Google Optimize matching on an exact stored value." GOOGLE_OPTIMIZE } "Screenshot cleanup mode returned by snapshot queries." enum SnapshotRemoveElementsOption { "No explicit cleanup rule, when capture has no popup or selector removal option." DEFAULT "Automatic popup removal, when capture hides popups." REMOVE_POPUPS "Plain CSS selector removal, when capture hides specified elements." REMOVE_ELEMENTS } "When a heatmap exports itself. Weekday cadences run at 08:00 UTC; `null` means never." enum SnapshotAutoExport { "When the heatmap ends: it expires, reaches its visit limit or is paused." ON_END "Every Monday at 08:00 UTC while the heatmap runs." MONDAY "Every Tuesday at 08:00 UTC while the heatmap runs." TUESDAY "Every Wednesday at 08:00 UTC while the heatmap runs." WEDNESDAY "Every Thursday at 08:00 UTC while the heatmap runs." THURSDAY "Every Friday at 08:00 UTC while the heatmap runs." FRIDAY "Every Saturday at 08:00 UTC while the heatmap runs." SATURDAY "Every Sunday at 08:00 UTC while the heatmap runs." SUNDAY "Every 30 days from the heatmap's start while it runs." EVERY_30_DAYS } "Share-link metadata returned by `sharedUrl`, `sharedUrls`, and share-link mutations." type SharedUrlResult { "Share-link record id for update/regeneration mutations, distinct from the resource id." id: Int "Public share URL containing the code accepted by `sharedResource`." fullPath: String "Numeric resource id; null for string-keyed errors, surveys, and CTAs." itemId: Int "Resource id as a string, falling back to the numeric id; use with `itemType`." itemIdStr: ID "Resource type derived from the saved link; `UNKNOWN` for unrecognized types." itemType: SharedUrlType "Owner account id; can be null on legacy links." userId: Int """ Site the link is scoped to; null for Heatmap, recording, and A/B test links, and the property id for Google Analytics property links. """ siteId: Int "`ENABLED` unless the link was disabled; an enabled link still fails in `sharedResource` when its resource is gone." status: SharedUrlStatus "Saved management note; null when unset." note: String "Title captured from the shared resource when the link is created; null when unavailable." title: String "User who created the link; null for legacy links without a recorded sharer." sharedByUserId: Int "Recorded successful share lookups, incremented when at least one second has elapsed since the last counted lookup." totalViews: Int "Email of the user who created the link; set by `sharedUrls` and for existing links from `sharedUrl`, else null." sharedByUserEmail: String "Name of the user who created the link; set by `sharedUrls` and for existing links from `sharedUrl`, else null." sharedByUserName: String "Share-link creation time in Unix seconds." createdAt: Int "Last counted share lookup in Unix seconds; null before a counted lookup." lastViewedAt: Int } "Resource kind used to create a share link and interpret its resource identifier." enum SharedUrlType { "Heatmap id from `snapshotsList`, for sharing a report with collected visits." SNAPSHOT "Numeric id from `recordingsIdsInGroup`, for sharing playback." RECORDING "A/B test id from `abTestList`, for sharing test results." ABTEST "Fingerprint from `uniqueErrorList`, for sharing a site error." ERROR "Survey add-on id from `addonList`, for sharing survey results." SURVEY "CTA add-on id from `addonList`, for sharing CTA results." CTA "Goal id from `goalCardList`, for sharing conversion results." GOAL "Funnel id from `funnelList`, for sharing a funnel report." FUNNEL "Page id from `pageSpeedPages`, for sharing a speed report." PAGE_SPEED_REPORT "Site id from `sites`, for sharing site Web Analytics." WEB_ANALYTICS_SITE "Property id from `gaProperties`, for sharing imported analytics." WEB_ANALYTICS_GA_PROPERTY "Unrecognized stored resource type, for interpreting legacy results only." UNKNOWN } "Public lookup state saved by share-link update mutations." enum SharedUrlStatus { "Public lookup enabled, while the resource and required subscription remain available." ENABLED "Public lookup disabled, while retaining the saved share link." DISABLED } """ Named recordings filter returned by `playlistsList` or `savePlaylist`; recommended presets have negative ids and custom site playlists have positive ids. """ type Playlist { "Positive custom or negative recommended playlist id for playlist operations." id: Int! name: String! "Custom site playlist or recommended preset, determined by the sign of `id`." type: PlaylistType! "JSON-encoded recordings filter with `version`, `operator`, and `conditions`; pass as recordings query `filters`." filter: String! } "Playlist usage returned by `playlistsMostRecent`; includes recommendations used to fill a short usage history." type PlaylistUsage { "Custom site playlist or recommended preset, determined by the sign of `id`." type: PlaylistType! "Playlist id for playlist operations, not an id for the usage entry; negative ids are recommendations." id: Int! "Last use in Unix seconds; backfilled recommendations use their preset timestamp rather than an actual view." lastUsedAt: Int! "Playlist name; returns `No name` when the saved playlist no longer exists." name: String! } "Whether a playlist is a saved custom site filter or a built-in recommended preset." enum PlaylistType { "Custom site playlist that can be saved, renamed, or deleted" USER "Built-in preset with a negative id that cannot be renamed or deleted" RECOMMENDED } "Ids affected by a bulk mutation, including `notificationDelete` and `notificationToggleEnabled`." type Affected { "Ids returned by the mutation; inaccessible or unchanged records may be omitted." affected: [Int!]! } "Sort direction used by list operations such as `notificationsList` and `channelsList`." enum SortOrder { "Ascending order, for earliest or lowest values first." ASC "Descending order, for latest or highest values first." DESC } "Calendar aggregation unit used by date-based reporting operations." enum TimeUnit { "Daily grouping, for one bucket per day." DAY "Weekly grouping, for one bucket per week." WEEK "Monthly grouping, for one bucket per month." MONTH } "Advertising provider used by `adPerformance` and ad connection operations." enum AdPlatformSource { "Meta ads, for Meta connections and metrics." META "Google ads, for Google connections and metrics." GOOGLE "Reddit ads, for Reddit connections and metrics." REDDIT } """ Site-scoped resource folder returned by `folders` and folder mutations; the single `folder` lookup supports snapshots folders only. """ type Folder { id: Int "Site that owns the folder." siteId: Int "Resource category: `snapshots`, `recordings`, `ab_testing`, or `editor`." type: String title: String "Computed count of accessible, non-deleted snapshots assigned to this folder." snapshotsCount: Int } "Site-scoped notification delivery destination returned by `channelsList` and a notification's `channel`." type Channel { id: Int! "Site the channel belongs to." siteId: Int! type: ChannelType! "Email address, API URL, Slack channel name, or `Zapier`; null if unavailable." destination: String "Not populated by the server today; selecting it returns a field error." createdAt: Int! } "Delivery integration used by a notification channel." enum ChannelType { "Slack channel delivery, for an existing Slack connection." SLACK "Email delivery, for an email recipient." EMAIL "API delivery, for a webhook URL." API "Zapier delivery, for rules managed through Zapier." ZAPIER } """ Export request returned by `createAiExport`, `aiExport`, and `aiExports`. Generation and notification states are independent; completed exports expire 30 days after completion. """ type AiExport { id: Int! "Generation state: pending, running, completed, or failed; retryable failures return to pending." status: String! "Inclusive exported window start in Unix seconds, aligned to UTC midnight." startAt: Int! "Exclusive exported window end in Unix seconds, aligned to UTC midnight." endAt: Int! "Selected feature strings: HEATMAPS, RECORDINGS, SURVEYS, or WEB_ANALYTICS." features: [String!]! "Email address supplied for the completion notification." notificationEmail: String! "Notification state: pending, sent, unconfirmed after a delivery claim, or not sent for a failed export." notificationStatus: String! "Request creation timestamp as an ISO 8601 UTC string." createdAt: String! "Download expiry as an ISO 8601 UTC string, 30 days after completion; null before completion." expiresAt: String """ Most recent generation failure text; null when no error is recorded. A pending request may retain a retryable error. """ error: String """ Temporary download URL, valid for up to 900 seconds or remaining export lifetime. Null unless completed with an unexpired file. """ downloadUrl: String } """ Site-data export settings for `createAiExport`. Dates must be UTC midnights, ordered, and no more than 90 days apart. """ input AiExportInput { "Site ID from `sites`; requires site access and view access for every selected feature." siteId: Int! "Inclusive Unix seconds at UTC midnight; must not be in the future and must precede `endAt`." startAt: Int! """ Exclusive Unix seconds at UTC midnight; after `startAt`, at most 90 days later, and no more than 24 hours beyond now. """ endAt: Int! """ Nonempty list of distinct, case-sensitive strings: HEATMAPS, RECORDINGS, SURVEYS, WEB_ANALYTICS. Web analytics must fall within available history. """ features: [String!]! "Completion-notification email, trimmed before validation; at most 254 bytes and must contain a valid address." notificationEmail: String! } """ A/B test settings and lifecycle returned by test lists, detail queries, and create/update operations. Metrics are populated by list queries; use `abTestResultCounts` for goal/date-scoped results. """ type AbTest { id: Int! "Whether automatic traffic reweighting is enabled; null only if no stored value is present." autoReweight: Boolean "Id of the site that owns the test, as listed by `sites`." siteId: Int! name: String! "Saved effective device set used for test execution." devices: [SnapshotDevice!]! "Current lifecycle state: DRAFT, RUNNING, STOPPED, or DELETED; a missing stored status is reported as DELETED." status: AbTestStatus! "Normalized source page URL used to capture and preview variants." pageUrl: String! "Stored URL matching pattern, falling back to `pageUrl` when none is set." matchingUrl: String "Signed control-variant thumbnail URL; null when no control variant or asset path is available." thumbnailUrl: String "Signed control-variant screenshot URL; null when no control variant or asset path is available." screenshotUrl: String "PATCH changes page elements; SPLIT redirects visitors to variant URLs." type: AbTestType! "Primary goal when loaded and on the same site; null when no accessible matching goal is linked." goal: AbTestGoal "Primary goal for `abTestResultDetail`; null in test lists, editor details, and create/update responses." selectedGoal: AbTestGoal "Loaded variants, including retired variants; empty when variant data is not loaded." variants: [AbTestVariant!] "Count of variants including retired variants; null when result processing has not populated the count." variantsCount: Int """ JSON-encoded string of the wizard inputs last saved by `abTestCreate`, `abTestUpdate`, or `abTestUpdateDraft`: the input fields except `variants`, with snake_case keys, including the unsaved `goal` form and `notes`. Duplicates hold a reduced copy of the settings; a test without a draft returns the string `null`. """ draft: String "Audience JSON value, not a JSON-encoded string; null targets everyone. See `audienceDefinitionContract`." audienceDefinition: JSON "Source test id for a duplicate; null when no source test is recorded." originalId: Int "Test notes set by `abTestUpdateNotes`; null when none. Notes sent in create or update inputs are only in `draft`." notes: String "Goals with recorded conversions for this test; empty in lists and detail queries, which do not load them." conversionGoals: [AbTestGoal] "Unique test visitors in the loaded metrics; null when metrics have not been loaded." totalVisitors: Int "Converted visitors for the primary goal in the loaded metrics; null when metrics have not been loaded." totalConversions: Int "Not populated by current A/B test queries; null." totalViews: Int """ Conversions divided by visitors as percent, rounded to two decimals; zero with no visitors, null without metrics. """ avgConversionRate: Float "Conversion value in ten-thousandths of `displayCurrency`; zero when metrics or recorded amounts are absent." totalValue: AbTestValue """ Seconds the test has run, from publication (or creation) to its stop or deletion time, or to now while running; null for a never-published DRAFT. """ duration: Int "Whether loaded metrics have at least one visitor; false when metrics are not loaded." hasResults: Boolean! """ Id of the non-retired variant, control included, with the highest non-zero conversion rate; null on a tie, without conversions, or when results are not loaded. """ bestVariantId: Int "Variant identified by `bestVariantId`; null if the highest conversion rate is tied or metrics are not loaded." bestVariant: AbTestVariant "Creation time in Unix seconds." createdAt: Int! "Publication time in Unix seconds; null until the test has been published." publishedAt: Int "Stop time in Unix seconds; null until the test has been stopped." stoppedAt: Int "Creator details; missing user records fall back to the saved id/name, which may be null." createdBy: User "Publisher details; saved id/name may be null before publication or for older records." publishedBy: User "Saved creator user id; null when no creator id was recorded." createdByUserId: Int @deprecated(reason: "Use created_by instead") "Deprecated creator name; current test payloads do not populate this field." createdByUserName: String @deprecated(reason: "Use created_by instead") "Whether the test is known to be installed on the site; becomes true once the test records a visitor." scriptInstalled: Boolean! "Whether creation was less than two days ago." recentlyCreated: Boolean! "Viewer-specific action flags; mutations enforce their own access and lifecycle checks." permissions: AbTestPermissions! """ Overall chi-square significance, 0-100 percent; null without metrics, visitors, a control, or VARIANT comparison. """ significance: Float } "Represents an uploaded file." scalar Upload