Is AI Note taker for Google Meet, by Noty.ai safe?

Medium risk

Noty.ai is medium risk. The Meet/Zoom content script bundles Amplitude analytics, sending the page URL, title, and a persistent device ID to api2.amplitude.com on every page load, whether or not you use transcription.

noty.aiv1.58.23Chrome Web Store
45Risk
Who publishes it

noty.ai - no other listings under this identity

What this publisher told the store about itself, and the other listings that told it the same thing.

Publisher
noty.ai
Website

AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.

Publishers can request a review.

Findings

Noty.ai bundles Amplitude analytics that tracks every Meet/Zoom page you load

The Meet/Zoom content script bundles Amplitude analytics, sending the page URL, title, and a persistent device ID to api2.amplitude.com on every page load, whether or not you use transcription.

Severity
Medium unwanted
Type
Unexpected
CWE
CWE-200
Source
Dynamic sandbox
What actually happens
You did this

You open or navigate to a page on meet.google.com or any *.zoom.us subdomain.

gmeet.js runs on every matching page regardless of whether Noty's transcription feature is on.

The extension did this

The extension's bundled Amplitude analytics SDK reports the page's URL, title, and a persistent device ID to Amplitude.

The same script also watches every form on the page and reports its id and name when you interact with it.

Fields sent to Amplitude on every Meet/Zoom page load
  • Amplitude device ID
    2ec2b498-b4d1-4eb4-b68f-c2ca3a835f86

    A persistent ID that ties every page view and form interaction on Meet/Zoom back to the same browser across visits.

  • Session ID
    1788890296415

    Groups events from one browsing session together, linked to your device ID.

  • Page location
    https://meet.google.com/_meet/whoops?q=buy+usb+cable&sc=232

    The full URL of the Meet or Zoom page you're on, including any query text in the address bar.

  • Page title
    Something went wrong

    The title of the tab you have open, such as an error page or meeting name.

  • Form ID and name
    id: signin-form, name: identifierForm (illustrative)

    The id and name of any form on the page when you start typing into it or submit it, not the values you typed.

Captured request
POSThttps://api2.amplitude.com/2/httpapi

HTTP 200: {"code":200,"server_upload_time":1788890298220,"payload_size_bytes":2504,"events_ingested":3}

Headers
Referer
https://meet.google.com/_meet/whoops?q=buy+usb+cable&sc=232
Content-Type
application/json
Body
{  "api_key": "0bd1763bf883c8ab08b08ab726a7adc3",  "events": [    {      "device_id": "2ec2b498-b4d1-4eb4-b68f-c2ca3a835f86",      "session_id": 1788890296415,      "time": 1788890296415,      "platform": "Web",      "language": "en-US",      "ip": "$remote",      "insert_id": "cd2f2c9b-1997-4a72-a0b9-acb15e76fa4b",      "event_type": "session_start",      "event_id": 0,      "library": "amplitude-ts/2.3.5",      "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"    },    {      "device_id": "2ec2b498-b4d1-4eb4-b68f-c2ca3a835f86",      "session_id": 1788890296415,      "time": 1788890296946,      "platform": "Web",      "language": "en-US",      "ip": "$remote",      "insert_id": "c71052f0-3c9b-40f6-a2c8-c78a5bdfdcc1",      "event_type": "$identify",      "user_properties": {        "$setOnce": {          "initial_utm_campaign": "EMPTY",          "initial_utm_content": "EMPTY",          "initial_utm_id": "EMPTY",          "initial_utm_medium": "EMPTY",          "initial_utm_source": "EMPTY",          "initial_utm_term": "EMPTY",          "initial_referrer": "EMPTY",          "initial_referring_domain": "EMPTY",          "initial_dclid": "EMPTY",          "initial_gbraid": "EMPTY",          "initial_gclid": "EMPTY",          "initial_fbclid": "EMPTY",          "initial_ko_click_id": "EMPTY",          "initial_li_fat_id": "EMPTY",          "initial_msclkid": "EMPTY",          "initial_rtd_cid": "EMPTY",          "initial_ttclid": "EMPTY",          "initial_twclid": "EMPTY",          "initial_wbraid": "EMPTY"        },        "$unset": {          "utm_campaign": "-",          "utm_content": "-",          "utm_id": "-",          "utm_medium": "-",          "utm_source": "-",          "utm_term": "-",          "referrer": "-",          "referring_domain": "-",          "dclid": "-",          "gbraid": "-",          "gclid": "-",          "fbclid": "-",          "ko_click_id": "-",          "li_fat_id": "-",          "msclkid": "-",          "rtd_cid": "-",          "ttclid": "-",          "twclid": "-",          "wbraid": "-"        }      },      "event_id": 1,      "library": "amplitude-ts/2.3.5",      "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"    },    {      "device_id": "2ec2b498-b4d1-4eb4-b68f-c2ca3a835f86",      "session_id": 1788890296415,      "time": 1788890296973,      "platform": "Web",      "language": "en-US",      "ip": "$remote",      "insert_id": "59b06d67-c44a-4c74-892b-5d407d9fd4ad",      "event_type": "[Amplitude] Page Viewed",      "event_properties": {        "[Amplitude] Page Domain": "meet.google.com",        "[Amplitude] Page Location": "https://meet.google.com/_meet/whoops?q=buy+usb+cable&sc=232",        "[Amplitude] Page Path": "/_meet/whoops",        "[Amplitude] Page Title": "Something went wrong",        "[Amplitude] Page URL": "https://meet.google.com/_meet/whoops"      },      "event_id": 2,      "library": "amplitude-ts/2.3.5",      "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36"    }  ],  "options": {},  "client_upload_time": "2026-09-08T17:58:17.623Z"}
The code that does this

The bundled Amplitude form-interaction plugin: shipped minified vs. deobfuscated

Readable version

Same plugin, readable form: watches every form's change/submit and reports its id/name to Amplitude

    f_ = function() {      var e, t = [],        n = function(u, c, f) {          u.addEventListener(c, f), t.push({            element: u,            type: c,            handler: f          })        },        r = function() {          t.forEach(function(u) {            var c = u.element,              f = u.type,              h = u.handler;            c == null || c.removeEventListener(f, h)          }), t = []        },        i = "@amplitude/plugin-form-interaction-tracking-browser",        s = "enrichment",        o = function(u, c) {          return Pe(void 0, void 0, void 0, function() {            var f, h;            return Re(this, function(p) {              return c ? typeof document > "u" ? [2] : (f = function(v) {                var g = !1;                n(v, "change", function() {                  var m;                  g || c.track(Jf, (m = {}, m[Ka] = v.id, m[Xa] = Ja(v.name), m[Ga] = v.action, m)), g = !0                }), n(v, "submit", function() {                  var m, _;                  g || c.track(Jf, (m = {}, m[Ka] = v.id, m[Xa] = Ja(v.name), m[Ga] = v.action, m)), c.track(Bb, (_ = {}, _[Ka] = v.id, _[Xa] = Ja(v.name), _[Ga] = v.action, _)), g = !1                })              }, h = Array.from(document.getElementsByTagName("form")), h.forEach(f), typeof MutationObserver < "u" && (e = new MutationObserver(function(v) {                v.forEach(function(g) {                  g.addedNodes.forEach(function(m) {                    m.nodeName === "FORM" && f(m), "querySelectorAll" in m && typeof m.querySelectorAll == "function" && Array.from(m.querySelectorAll("form")).map(f)                  })                })              }), e.observe(document.body, {                subtree: !0,                childList: !0              })), [2]) : (u.loggerProvider.warn("Form interaction tracking requires a later version of @amplitude/analytics-browser. Form interaction events are not tracked."), [2])            })          })        },        a = function(u) {          return Pe(void 0, void 0, void 0, function() {            return Re(this, function(c) {              return [2, u]            })          })        },        l = function() {          return Pe(void 0, void 0, void 0, function() {            return Re(this, function(u) {              return e == null || e.disconnect(), r(), [2]            })          })        };      return {        name: i,        type: s,        setup: o,        execute: a,        teardown: l      }
Where the Meet/Zoom telemetry goes
    • api2.amplitude.com

    Third-party analytics platform (Amplitude, Inc.), unrelated to Google or Zoom. Receives page views, form interactions, and a persistent device ID from the Meet/Zoom content script.

Updated 30 September 2026kdkohcmkkplmkknlelglhfhjkegkiljd