- Brand
- Hoot Lens
- Category
- Data & Analytics
- Primary Subcategory
- Product Analytics & Experimentation
Integration details
Description
Investigate website visits with session replay, timed narratives, click maps, funnels and JavaScript error evidence. Trace a snag to its page, device cohort and recorded moment before proposing a fix. Connect your Hoot Lens account and choose the sites and permissions to share. Authorized workflows can annotate findings, preview settings or create a site in your own account. Site creation needs explicit OAuth approval, an available site slot and required visitor consent. Sparse evidence stays qualified; Hoot Lens does not infer visitor opinions, feelings or causation.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Product Analytics & Experimentation
- Secondary Subcategories
- None listed
- Brand
- Hoot Lens
- Access
- Account required
- First tracked
- 2026-10-29
- Tool count
- 45
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Agent DiscoverabilityChatGPT Discoverability ScoreUpdated dailyThe first to track the ChatGPT, Claude, Muse, Grok & Google ecosystems, with the largest database on the core platforms. Tracked daily since .
0/100
Invisible#19of 39
in Product Analytics & Experimentation- Picked
- 0.0/100
- Found
- 0.0/100
- Positioned
- –/100
Category leaderboard
Product Analytics & Experimentation
- 1P
PostHog62
- 2M
Mixpanel54
- 3A
Amplitude42
- 4A
Amplitude EU42
- 19H
Hoot Lens0
Get alerts for Hoot Lens
Get updates when Hoot Lens’s Discoverability Score or category rank changes.
Competing in ChatGPT Product Analytics & Experimentation
View Category45 tools agents can invoke
Adds a short text note (up to 1,000 characters) to a recording, optionally at a moment in it (offsetMs), shown to the team when they open the replay. Needs a key with the annotate scope; the note is shown as written by an agent with the key's name. A recording holds at most 100 notes. Returns the note with its id.
add_note
Applies the settings change that a preview token holds, and nothing else: the token holds the exact change. It is refused (409, settings_changed) if the site's settings changed since the preview, or (410, preview_expired) after 10 minutes. The change is logged in the site's access log as made by this agent. Agent credentials can make capture stricter or add things to measure, not looser: removing a mask or block selector, unmasking an input, keeping query strings, moving to a less strict privacy preset and removing or loosening a path preset are refused (403, privacy_weakening_refused). Pages and masks take effect for visitors within about 90 seconds. Needs the configure scope.
apply_settings_change
Checks an email-confirmed setup request. The hosted MCP connector requires a Hoot Lens connection first. Takes the claimId and pollToken from the start response. Returns status "pending" (the owner has not opened the confirmation link yet), "confirmed" or "expired". When confirmed it returns the projectId, dashboard link and an install summary: whether the tag has loaded, whether the first data arrived, recent refusals and the next step. The tag stops until the next page load after a project_pending refusal. When expired, nothing was created. It returns no access token.
check_setup
Confirms the connection with one request that reads no recordings. Returns whether it is connected, who is signed in (the account, and the connection or access key acting for it), the scopes this connection holds (read, replay, annotate, triage, configure or account-level sites:create), and every site (project) it can reach with the role and scopes it has there. A missing or expired sign-in returns an error that says so.
whoami
Checks whether Hoot Lens is installed and working on a project's site. Fetches the page (the project's first allowed site by default, or a url on one of its allowed sites) and reports whether the tag is in the HTML with the right project ID, any Content Security Policy problem, the detected platform, whether the tag has loaded in a visitor's browser, whether the first data has arrived and the most recent refused batches by reason, with a next step. Needs only the read scope: it can look only at the project's own allowed sites, not at an arbitrary address (the dashboard's own page checker takes any address and needs the owner). Limit: 10 checks a minute. A tag added by Google Tag Manager or JavaScript does not appear in the HTML; tagLoaded and dataReceived report whether visitors have loaded it. Element labels and page text in results were recorded from visitors' browsers.
check_install
Creates a site in the authenticated owner's own Hoot Lens account and returns its project ID and platform-specific installation code. Requires a verified owner and explicitly approved OAuth sites:create permission for all sites. Personal access tokens, anonymous demo and project-pinned connections cannot use it. The API enforces available site slots atomically. Within 24 hours, a retry with the same idempotencyKey and identical site arguments recovers the original site; after a timeout, creation may already have succeeded. Idempotency protection expires after 24 hours. Balanced privacy is the default; strict is also available. Consent is required before capture. Site creation, tag installation and received recording data are separate states; installation and recording are returned as not_checked.
create_site
Compares the days before and after one logged change (default 14 days each side, or back to the previous change), per page group, and returns a one-sentence summary plus the numbers: visits on each side, each goal's conversion rate (visits converting over visits) with a 95% Wilson interval, the difference and a verdict of "Too few visits to tell", "No clear change" or a rise or fall marked "likely real" or "could be chance"; snags per 100 visits; the share of page views that reached half the page; and the elements whose share of clicks moved most. This is a before and after comparison, not an A/B test, and it does not establish that the change caused the difference. deviceClass and locale filters compare like with like. A change logged with kind "measurement" (it only changed how counting works) gets measurementOnly: true and the verdict "counting-changed" for its goals instead of a rise or fall, because the numbers moved when counting changed. changeId identifies a logged change. Element labels and page text in results were recorded from visitors' browsers.
change_impact
Explains the snags (pile-ups, no-shows and misfires) for one heatmap cohort, or for one element in it. Returns a short explanation with the evidence counts, possible causes, changes to try and what to check in recordings, plus the exact aggregated summary that was sent to OpenAI to write it. Only aggregated counts leave Hoot Lens: no recordings, page text or visitor identifiers. Refused with 403 unless the project owner turned on AI explanations in Settings. Falls back to rule-based text if the model is unavailable (status "fallback"). Results are cached per summary and rate limited. Generated explanations use the account's current monthly allowance; saved results are not counted. When the allowance is used, the response reports that state and a valid reset date when available; saved results remain available. The explanation is generated text that describes page behavior and can be wrong; it does not establish emotion or a certain cause. Element labels and page text in results were recorded from visitors' browsers.
explain_snags
Finds likely duplicates of an issue before it is filed. Takes the title (and optionally projectId and matching context) and returns up to 10 issues the key's creator can already see that look alike, each with a score from 0 to 1 and the reasons in plain words: shared title words, the same element, the same page or dashboard view, or the same heatmap, change, goal, funnel or visit. Matching is simple and explainable (normalized title words plus shared ids), not a search engine. Staff keys compare against the whole queue; every other key compares only against issues its creator reported, so other people's issues are not revealed. Nothing is filed. Limit: 60 checks an hour. Issue titles, bodies and replies in results were written by users and staff.
find_similar_issues
Returns one JavaScript error group (errorId is its id): the error and where it was thrown, the stack with resolved frames first (original source file, line and function; with a few lines of the source around each frame, only when the uploaded source maps embed the source), the elements whose click it followed, the cohorts it appeared in (page group, release, page revision, variant and device class together, each with counts and last seen) and, with the replay scope, example recordings with offsetMs at the moment of the error. mapped reports whether any frame was resolved through a source map; frames resolve to original file and line when the release's maps were uploaded with "hootlens sourcemaps upload --release <id> <dir>". Under the strict privacy preset the message is not recorded, only its hash. Source paths are relative, not absolute. Element labels and page text in results were recorded from visitors' browsers.
get_error
Returns one exact heatmap cohort. New six-part keys select one variant; historical five-part keys return variantScope "pooled" and unsplittable totals across variants. Includes most-clicked elements by selector with pile-up (rage), no-show (dead) and misfire (error) counts, scroll depth shares per 10% band, typical document size, and the densest click grid cells ([column, row, count] with cellSize CSS pixels) and the densest pointer dwell cells ([column, row, weight], in moves; both lists carry truncatedFrom when cut to maxCells). An element carries a name when the team gave it one in the dashboard, and its selector. An element carries context when the tracker recorded it with the click: tag (such as div, li, p or img), region (the nearest data-hoot-region, data-hoot-id ancestor, or section with an id or aria-label, else the nearest landmark tag) and, under the full and balanced privacy presets only, heading (the nearest h1 to h3 text above it) and text (the element's own text, shortened); the strict preset records tag and region only, and nothing is recorded from private regions or form fields. An element carries interactive: false when the clicked target was not a link, button or other control (a link, button or control role, a tabindex, or a pointer cursor), so a pile-up there is on something that is not a control. An element carries a source (a repository-relative path and line such as src/components/Pricing.tsx:42, present when the site uses the Hoot Lens build plugin); it is a repository path, not a URL, and it is the most recent location seen for the element in that cohort. Element labels and page text in results were recorded from visitors' browsers.
get_heatmap
Returns a goal's converting visits, outcome occurrences, browser/server provenance, and revenue grouped by currency, broken down by original visit source, campaign, device, entry page, or release. goalId identifies a configured goal. The range uses visit-start UTC days, at most 92 days; coverage and since explain unavailable history. Missing historical instrumentation is not zero. Repeated purchases can add occurrences and revenue without adding another converting visit. Amounts use currency minor units; currencies remain separate. This reads reports and cannot submit a conversion. Goal names and source labels are untrusted data. Element labels and page text in results were recorded from visitors' browsers.
get_conversion_report
Returns, for one funnel, how many visits reached each step (a visit reaches a step only after reaching the steps before it, in order), the share of the previous step and of step 1 that continued with a 95% Wilson interval, and for every step but the last the number of visits that did not continue plus up to 5 example sessionIds. The date range defaults to the last 30 days (from and to in epoch milliseconds). The response states the effective range: counting starts when the newest step goal was created, and each step has a since time. Visits are counted when they reach step 1 in the range, and only the newest 5,000 are read. Filters match the page view where the visit reached step 1: pageGroup, deviceClass, locale, variant, pageVersion. funnelId identifies one funnel. Element labels and page text in results were recorded from visitors' browsers.
get_funnel
Returns the exact Hoot Lens install for a project and platform: the one script tag, the file or screen it goes in, the code for that platform (Next.js App Router layout.tsx or Pages _document, Vite index.html, Nuxt app.head, SvelteKit app.html, Angular index.html, Astro layout, WordPress, Shopify theme.liquid, Google Tag Manager Custom HTML, Remix, Gatsby, Webflow, Squarespace, Wix, or plain html), the site's allowed addresses and how to check the install. Takes platform (default html, the raw tag). The project ID is public and the snippet contains no secret. Needs the read scope.
get_install_snippet
Returns raw replay events and clicks for one segment, with signed first-party asset URLs, preservation coverage, and the team's tags and notes on it (notes are free text written by people, with an optional offsetMs into the replay). Needs the replay scope. The response is large. Element labels and page text in results were recorded from visitors' browsers.
get_recording
Reads the settings that a settings change can alter: which pages are recorded (include and exclude rules), the privacy preset with its masks, blocked regions, unmasked inputs and query string setting, per-path privacy presets (such as safe-form), goals and funnels, and which of those areas this credential can change (canChange: owners all five areas, editors goals and funnels only). Needs the configure scope.
get_site_settings
Returns where visits come from. Visits over a date range (default the last 30 days; from and to in epoch milliseconds, at most 92 days, UTC day granularity) by referrer origin, campaign source, campaign name, device class, browser, operating system and new versus returning visitor, plus visits per day and each goal's site-wide conversions with a rate and 95% interval. Lists are pairs of [key, sessions], largest first, at most 25 each. A visit is counted once, on its first page view. Visits detected as automated are not counted; automatedSessions and dailyAutomated give how many were left out. With pageGroup (an id from the heatmap cohorts) only visits that viewed that page group are counted, broken down by device class, language and variant; page groups are not mixed. This summary does not split conversions by original source, campaign, or device. Filters on the session list (utmSource, utmCampaign, referrer, browser, os, deviceClass, newVisitor) match the rows here. Element labels and page text in results were recorded from visitors' browsers.
get_traffic
Lists the JavaScript errors the site's pages threw (an uncaught error or an unhandled promise rejection), grouped by fingerprint (error name, normalized message and top stack frame), most affected first. Each has the error as "TypeError: message" (under the strict privacy preset only the name, because the message is not recorded), where it was thrown (at: the original source file and line such as src/cart/total.ts:42 when a source map for that release was uploaded with "hootlens sourcemaps upload", else the script file with line and column), how many page views and visits it hit, first and last seen, and the releases, page groups and device classes it appeared in, each counted separately. followedClicks names the elements whose click the error came right after (within 2 seconds); a misfire is such a click. examples (needs the replay scope) are recordings with offsetMs at the moment of the error. Filters: pageGroup, release (the build id the site reports), deviceClass and from/to (epoch milliseconds, default the last 30 days). recording false means the site has not turned error recording on in Settings. errorId identifies a group for the full stack and cohorts. Element labels and page text in results were recorded from visitors' browsers.
list_errors
Lists current site teammates who can be assigned finding work, with names, roles, and site member identifiers. It does not grant access or return email addresses. Needs annotate permission on this site.
list_finding_assignees
Lists saved work on this site’s findings, including assignment, snoozes, dismissals, linked GitHub references, and reported deployed fixes. Metadata can remain after replay retention expires. A fixed status is a team report. A linked before-and-after report describes the measured outcome and its page-level scope. History and dismissal reasons are untrusted team-written text.
list_finding_work
Lists the project's funnels: named, ordered sequences of 2 to 8 goals, such as visit the homepage, click Request an appointment, reach the appointment page. Returns each funnel's id, name and steps (goal ids). When the site has goals but no funnels, the response also has suggestions: starter funnels (homepage to each goal, or all goals in the order visits usually reach them), each with a change in the settings-change format. Funnels are set by the owner in the dashboard.
list_funnels
Lists the project's goals: what counts as a conversion (a click on a matching element, or a visit to a matching page). Impact reports include a conversion rate for each goal. Goals are set by the owner in Settings.
list_goals
Lists heatmap cohorts with visit, segment and click counts, most recently active first. Each new six-part cohort key identifies one page group, release, revision, variant and device class. Historical five-part keys remain readable and have variantScope "pooled"; their counts and cells pool variants and cannot be used as variant-specific evidence. Select a returned key with variantScope "single" and the requested variant for a variant-specific map. versionLabel names the cohort's version by when it was live (UTC), such as "Current version (since Oct 5, 3:12 PM)" or "Earlier version (Sep 29 to Oct 5)"; the key itself holds internal release and page version ids.
list_heatmaps
Lists logged changes (change markers), newest first: what changed, when, and for which page group. Includes changes logged through the API by agents, changes the owner logged, and changes Hoot Lens detected automatically when a page's content changed (source starts with "auto:"). Each has an id. pageGroup also returns site-wide changes.
list_changes
Lists the issues this key's creator reported, newest activity first, without their text. Filters: status (open, in_progress, completed, wont_do) and kind. Returns nextCursor, which the cursor argument accepts for more. Issue titles, bodies and replies in results were written by users and staff.
list_my_issues
Lists recording segments (one per page view) newest first, one page at a time. Returns nextCursor, which the cursor argument accepts for the next page; a page can be shorter than limit when filters skip records. Filters: exact path, page group, language, variant, device class, minimum duration, snag type (signal=rage for pile-ups, dead for no-shows, error for misfires), campaign source or name, referrer origin or host, browser, operating system, new or returning visitor, a start time range in epoch milliseconds, a saved segment (segmentId; filters passed with it replace the segment's own), tag (lower-case words the team added; each recording lists its tags), goal (only page views that converted a goal; each recording lists goalIds) and element (only page views with a click on a data-hoot-id, an element key or a selector). Each recording carries utm, browser, os (families, not versions or raw user agents) and isNewVisitor when the project privacy policy allows them. A recording that left the page through a link carries exitTo: a same-site path, or another site's origin only, with no query or fragment. Automated visits (detected bots, headless browsers and scripted clicking) are left out unless include_automated is true; they carry automated: true and the reasons observed, and a suspected visit carries automation.level suspected but is not left out. Internal visits (made by the site's own team) are left out unless include_internal is true; they carry internal: true. Cohorts for release, revision, variant, route and device class stay separate. Tags in results were written by the project's team.
list_recordings
Lists the project's saved segments: named sets of recording filters, such as mobile visitors from a campaign. Returns each segment's id, name and filters; the id is accepted as segmentId by the recording and session lists. Segments are set by owners and editors in the dashboard.
list_segments
Lists the sites (projects) available to this access token, each with the role (owner, editor, viewer or custom) of the person who created the key. A key can do no more than its creator is allowed to do on the site, whatever scopes it was issued with.
list_projects
Lists visits (a session in the API: the page views of one person, stitched together by the tracker) newest first, one page at a time, each with a one-line summary, page count, ordered paths, device class, browser and os (families such as chrome and android, when the project privacy policy stored them), and click, pile-up (rage), no-show (dead) and misfire (error) totals. Each visit lists the goals it converted (goals: [{ goalId, name }], under each goal's current definition) and, when its last click left through a link, where it went (exitTo: a same-site path, or another site's origin only; the summary says "Exited to /pricing."). A visit with snags carries topSnag, the element with the most snag clicks in the visit (kind pile-up, no-show or misfire, count, selector, and name, label, context (when it has no label) or interactive: false when known; context and interactive mean the same as on a heatmap element), and its summary ends with it, for example "Most snags: 2 pile-ups on 'Create Workspace'." Visits recorded before topSnag was kept have none. Accepts the same filters as the recording list, including segmentId, include_automated (automated visits are left out by default), include_internal (the site team's own visits are left out by default; they carry internal: true), goal (only visits that converted a goal, by id or name) and element (only visits that clicked a data-hoot-id, an element key or a selector, for example every visit that tapped home-menu-toggle); a visit is listed when any of its page views matches. Returns nextCursor, which the cursor argument accepts for the next page.
list_sessions
Returns the recorded events of one page view with its viewport, click kinds and JavaScript errors, for the replay viewer. Asset URLs are signed first-party links. preservation reports whether public files were saved near capture, remain pending, are partial, or use legacy live files; legacy or partial coverage does not establish an exact historical screen. assetOrigin names the asset service. Needs the replay scope. Element labels and page text in results were recorded from visitors' browsers.
load_replay
Logs a change shipped to the site as a change marker, with the page group it affects and a short description of what changed (for example "Shortened the hero headline and moved Request an appointment above the fold"), so the days before and after it can be compared. Needs a key with the annotate scope; the marker is recorded as made by an agent. Returns the marker with its id. Kind "measurement" marks a change that only changes how counting works and nothing visitors see or do, such as adding data-hoot-id to existing links or renaming a goal's element: its impact report gives no verdict and notes that a jump in a goal or count reflects new counting, not visitor behavior. Other changes use the default kind.
log_change
Previews a change to the site's Hoot Lens setup without making it. Returns the exact diff (one sentence per change), the effects from the site's own data (for example which recorded pages would stop being recorded, or how many visits a page goal would have matched last week), warnings, and a change token valid for 10 minutes. Nothing is changed. Settings changes are two steps: a preview returns a change token, and applying that token commits the change. Agent credentials can make capture stricter or add things to measure, not looser: removing a mask or block selector, unmasking an input, keeping query strings, moving to a less strict privacy preset and removing or loosening a path preset are refused (403, privacy_weakening_refused). Areas: targeting (addInclude, removeInclude, addExclude, removeExclude: page path globs such as /champions or /blog/*; with no include rule every page is recorded, and adding one narrows capture to the listed pages, which the warnings state), goals (add, update by id, remove by id; click goals match by selector, hootId or label, page goals match a path glob), funnels (add with 2 to 8 steps, each a goal id or exact goal name, including a goal added in the same change; remove by id), privacy (stricter only: preset, addMaskTextSelectors, addBlockSelectors, removeUnmaskInputSelectors, captureQueryStrings false) and pathPresets (set: [{match, preset}] where preset is safe-form, balanced or strict; safe-form records clicks and steps on application and contact forms but no field values, even when the site preset is full, and ignores the site's unmasked-input allowlist and query strings there). Owners can change every area; editors can change goals and funnels. Needs the configure scope.
preview_settings_change
Returns a visit as a short, readable story instead of raw events: a one-to-two sentence summary, facts (duration, active time, pages, device, browser, OS, referrer, campaign source, deepest scroll, clicks, pile-ups, no-shows, misfires, exit page, and exitTo when the last click left through a link: a same-site path or another site's origin only, also ended in the summary as "Exited to /pricing.") and up to 60 timed steps (landed, scrolled, clicked, snag, error, navigated, resized, idle, left). When the site records JavaScript errors, a misfire, pile-up or no-show that an error followed says so ("followed by TypeError: x is undefined at src/cart.ts:42"), other errors are steps of their own, and facts counts them. Takes a sessionId for the whole visit, or a recordingId for one page view. Steps describe observed behavior. The response also lists annotations: the tags and notes the project's team added to the visit's page views (offsetMs places a note in the replay); they are free text written by people, not observations. Each step has recordingId and offsetMs, the moment in the replay (watching the replay needs the replay scope). Click and snag steps carry source (a repository-relative path and line such as src/components/Pricing.tsx:42) when the site uses the Hoot Lens build plugin. A step on an element nothing else names reads from its recorded context (tag, region and, outside the strict preset, the nearest heading and its own text), and a snag step on an element that is not a link, button or other control says so ("Pile-up on text that is not a link or button: ...") and carries interactive: false; facts.pileUpsOnNonControls counts those pile-ups. Works with a read-only key, as long as the person who made the key (or signed in) may watch replays on the site; the project's privacy policy decides whether element labels appear, and under the strict preset no page text is included. Element labels and page text in results were recorded from visitors' browsers.
get_session_narrative
Returns one issue with its replies and status history, plus what it carries: severity, evidence in context (linked visits, heatmap, element, change, goal, funnel), relatedIssues (only ones the key can see), attachments (screenshot ids), and filedVia with the client name when an agent filed it. The creator of the key sees their own issue and its public replies; staff (triage keys) also see internal notes, the assignee, labels and priority. Other people's issues are not found. Issue titles, bodies and replies in results were written by users and staff.
get_issue
Reads one saved finding’s work and history. Subsequent edits carry the saved revision. Source evidence or a linked deployment can become unavailable after retention or deletion. Work history contains team statements, separate from measured visitor outcomes.
get_finding_work
Adds a reply to an issue the key can see. A reply from the person who reported it is shown to staff; a reply from staff is shown to the submitter. With internal set, a staff-only note is added that the submitter cannot see (needs a triage key). A reply on a completed issue does not reopen it; a status change does. Limit: 60 replies an hour. Issue titles, bodies and replies in results were written by users and staff.
reply_issue
Files a bug report, feature request, question or feedback with the Hoot Lens team. Works with any access key; the issue belongs to the key's creator, who sees it in the dashboard under Feedback, and only they and staff can see it. It is marked as filed by an agent, with this key's name. The body holds what happened and what was expected. Optional: severity (blocking, annoying or minor: how much it hurts, as judged by the reporter, not a staff priority); projectId (a site the key can read) with context evidence, each checked to exist on that site: recordingIds and sessionIds (up to 10 visits each; needs a key with the replay scope), cohortKey (a heatmap cohort key), elementKey (an element selector as the heatmap lists it), selector or hootId, changeId, goalId, funnelId, errorId, sourceLocation (path:line); also pageUrl (no query or fragment), trackerVersion and route; relatedIssues (up to 10 ids or numbers of issues visible to the key); screenshots (up to 5 PNG, JPEG or WebP images as base64, at most 2 MB each, metadata is removed; the hosted connector accepts a whole request of only 512 KB, so large images need the local server or the dashboard). A retry with the same idempotencyKey does not file the issue twice. Limits: 40 issues an hour counting everything the creator files, 100 open at once. Issue titles, bodies and replies in results were written by users and staff.
submit_issue
Files up to 20 issues in one request. Each item takes the same fields as a single issue (kind, title, body, severity, projectId, context, relatedIssues, screenshots) and its own idempotencyKey, and gets its own number, status and replies. Items are filed in order and one failed item does not block the others: the result lists, for each item by index, created, replayed (a retry of an item already filed) or failed with the reason. A stable idempotencyKey per item (for example a short slug) means a retry of the whole request does not file an issue twice. A batch counts once per issue against the same limits as a single issue (40 an hour, 100 open at once). Screenshots are uploaded after the issues are filed, and a failed upload does not undo an issue. Issue titles, bodies and replies in results were written by users and staff.
submit_issues
Returns observed click and snag counts for a site. By default (groupBy "revision") they are grouped by page, page revision, variant and device class: the automatic release and page version ids (auto-..., auto-...+2, unversioned) that one version of a page can be spread over are folded into one row, while releases the team named or logged are kept apart. Each row reports how many heatmap cohorts it folds (foldedCohorts), the key of the largest (key) and how many release or page version ids were merged (versionCount). With detail true, a folded row also lists every folded cohort key (cohortKeys, the largest first) and the ids merged (versionIds). groupBy "cohort" returns the fine-grained view, one row per heatmap cohort (page, release or page version id, revision, variant and device class). Historical five-part cohorts have variantScope "pooled" and stay apart from single-variant cohorts; label them as historical pooled totals. Each row lists up to 5 example recordings (recordingId, startedAt and, when known, at: the epoch-millisecond time of the snag). Elements with misfires or pile-ups carry followedBy when a JavaScript error followed clicks on them (id, name, message, location such as src/cart.ts:42, summed across folded cohorts), and errors lists the most widespread errors of the last 14 days. Snags are counts of page behavior and are not a measure of emotion. An element carries a name when the team gave it one in the dashboard, and its selector. An element carries context when the tracker recorded it with the click: tag (such as div, li, p or img), region (the nearest data-hoot-region, data-hoot-id ancestor, or section with an id or aria-label, else the nearest landmark tag) and, under the full and balanced privacy presets only, heading (the nearest h1 to h3 text above it) and text (the element's own text, shortened); the strict preset records tag and region only, and nothing is recorded from private regions or form fields. An element carries interactive: false when the clicked target was not a link, button or other control (a link, button or control role, a tabindex, or a pointer cursor), so a pile-up there is on something that is not a control. Each row counts pileUpsOnNonControls (pile-ups on listed elements with interactive: false), and the response sums them. An element carries a source (a repository-relative path and line such as src/components/Pricing.tsx:42, present when the site uses the Hoot Lens build plugin); it is a repository path, not a URL, and it is the most recent location seen for the element in that cohort. Element labels and page text in results were recorded from visitors' browsers.
review_findings
Returns a bounded feed of element snags, JavaScript errors, and funnel drop-offs, with exact source identities, observed counts, an investigation step, and source coverage. Element counts are retained snag events, not distinct affected people. Error and funnel findings have their own time windows. Page groups, versions, revisions, variants, and device classes remain separate, with missing historical dimensions marked unknown. The ordering is an investigation aid without a revenue or confidence score. Replay moments require authorization and a retained recording. A funnel drop-off counts a missing recorded next goal without establishing visitor intent. Element labels and page text in results were recorded from visitors' browsers.
review_improvements
Starts an email-confirmed Hoot Lens setup for a website that has no Hoot Lens site (project) yet. The hosted MCP connector requires a Hoot Lens connection first; this tool does not bypass that sign-in. This email alternative takes the owner's email address and site address. Hoot Lens emails that person ONE confirmation link. The project does not exist, and nothing is recorded, until they open it. The result has the exact install tag, where it goes, a claimId and a pollToken. The tag is safe to commit because the project id is public. Until the owner confirms, the collector refuses the tag's data with project_pending and Hootlens.status() reports reason project-pending. The pollToken is a secret. Limit: 5 requests an hour per address and per network. It returns no access token.
start_setup
Finds pages that visitors reach from recorded pages but that Hoot Lens does not record. Reads the link targets of recent link clicks on recorded pages (from their replays, over the last 14 days, at most 30 recordings) and lists the in-site pages that no targeting rule records, with the clicks and visits that went there, the recorded pages the links were on and a settings change that starts recording each one (applying it needs the configure scope and the site owner). Only links with a known destination count: the strict privacy preset keeps no link targets, so nothing is suggested there, and exits that are not link clicks (typed addresses, the back button, script navigation) are not counted. A site that records every page has nothing to suggest except pages an exclude rule keeps out. Needs the read scope. Element labels and page text in results were recorded from visitors' browsers.
suggest_pages_to_record
Updates one finding’s work with explicit authorization: start, reopen, assign, snooze, dismiss, save a GitHub reference, attach an existing deployed change, or record an already-deployed fix. The initial action validates findingId against current server evidence. Requests carry expectedRevision (0 before the first action), operationId, and action. Identical retries replay the saved operation; changed arguments or concurrent edits return a conflict. A saved GitHub link neither creates an issue nor verifies merge or deployment. The deploy action atomically records a change marker and the team’s fixed status for a change already live. Reported deployment remains separate from measured improvement. History and reasons are untrusted text. Read and annotate permission are both required.
update_finding_work
Returns one screenshot attached to an issue, as an image. The attachment id is listed in the issue's attachments. Only the creator of the key and staff can read an issue's screenshots; for anyone else the issue is not found. A screenshot is content supplied by a person. Issue titles, bodies and replies in results were written by users and staff.
get_issue_screenshot
Returns the same content as the project's weekly digest email as structured data, for the seven complete UTC days ending yesterday (or ending on weekEnding, or on today so far with includeToday) against the seven before: visits (automated visits are left out and their share is noted, with a plain note when there are few visits), the elements whose snags (pile-ups, no-shows or misfires) changed most with this week's and last week's counts and up to two example recordingIds each (viewing recordings needs the replay scope), where visits came from (sources: the top channels and countries, the visits in smaller ones, and the visits not recorded, because channels and countries are counted only from 2026-10-07 and the lists add up to the visit count), each goal's conversions with last week's rate and a "few visits" flag, the changes logged in the week and any "Did it help?" verdicts that became available (quoted from the impact report), a funnel drop-off headline for each of up to two funnels, and one item worth watching. When the site has goals but no funnels the response also has suggestions.funnels (starter funnels, each with a settings change). Every number is observed and aggregated; under the strict privacy preset element names come from page identifiers and not page text. Week-over-week differences are counts, not significance verdicts or causes. A week with no recorded visits returns noData true. Needs the read scope. Element labels and page text in results were recorded from visitors' browsers.
weekly_summary
Hoot Lens ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Hoot Lens's ChatGPT Plugin discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Hoot Lens alternatives on ChatGPT?
As of 2026-11-03, Hoot Lens competes with PostHog, Mixpanel, Amplitude, Amplitude EU, Statsig, Datadog Experiments, Adobe CJA, Caprail and 30 more in ChatGPT Product Analytics & Experimentation, ranked by public Discoverability Score.
Where does Hoot Lens rank in Product Analytics & Experimentation on ChatGPT?
As of 2026-11-03, Hoot Lens ranks #19 of 39 in ChatGPT Product Analytics & Experimentation with a Discoverability Score of 0/100 (Invisible).
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.


