Política de privacidad

AdLupahttps://adlupa.netlify.app


Resumen en una línea

La extensión lee, en tu propia máquina, el Post ID de los anuncios que ya están cargados en la página de Meta Ads Manager que tenés abierta, lo guarda en chrome.storage.local, donde vence a los 30 días, y no lo manda a ningún lado. No hay servidores, no hay cuentas, no hay analytics.


1. Qué datos lee la extensión

Mientras tenés abierta una pestaña de Meta Ads Manager (y solo ahí), la extensión lee tres cosas del contenido de esa página:

DatoQué esDe dónde sale
Ad IDEl identificador numérico del anuncio (adgroup)Respuestas JSON que Ads Manager ya pidió, y los props internos de la tabla
Post ID / Story IDEl campo effective_object_story_id (alternativa: object_story_id), con forma pageId_postIdLas mismas respuestas JSON
Nombre del anuncioEl texto que vos le pusiste al anuncioLas mismas respuestas JSON y la tabla

Cada registro que se guarda lleva esos tres campos y nada más que se haya leído de la página. Lo que sí lleva además son dos cosas que la extensión deriva sola: el Story ID guardado partido en sus dos mitades (pageId y postId, para no tener que partirlo cada vez que se dibuja un badge) y la fecha de la última vez que se vio ese anuncio, que es lo que hace funcionar el vencimiento a los 30 días. El id de la cuenta publicitaria va en la clave del registro.

Los registros de una misma cuenta se guardan juntos adentro de un envoltorio, y ese envoltorio lleva otras dos cosas que también quedan en disco: un número de versión del formato del caché (hoy 1), que sirve para descartar de una un caché escrito por una versión vieja de la extensión, y el id de la cuenta otra vez, esta vez adentro del valor además de en la clave. Con eso está completo el inventario de lo que se escribe.

También guarda cuatro preferencias tuyas: si la extensión está encendida, el idioma elegido, si el panel flotante está abierto y si el modo debug está encendido (apagado por defecto).

Nada más se guarda. No se guardan métricas, ni presupuestos, ni gasto, ni datos de facturación, ni el resto de la cuenta publicitaria.

Precisión sobre "leer" y "guardar", que no es lo mismo: para encontrar los Post IDs, la extensión parsea el cuerpo completo de las respuestas que pasan el filtro de URL. Esas respuestas pueden contener otras cosas además de los Post IDs. De todo eso, lo único que se retiene son los tres campos de la tabla de arriba; el resto se descarta al terminar de parsear y nunca se guarda ni se transmite. Decir "no se leen métricas" sería inexacto; lo exacto es que no se guardan.

Aviso honesto sobre el nombre del anuncio: el nombre es texto libre que escribiste vos. Si pusiste datos personales adentro del nombre de un anuncio, esos datos quedan en el caché local igual que ya estaban en Ads Manager. La extensión no los interpreta ni los separa.

2. Cómo los obtiene: extracción 100 % pasiva

Esto es lo que más importa entender, porque es lo que separa a esta extensión de otras parecidas:

Si Meta cambia la forma de su JSON, la extracción deja de encontrar datos y no aparecen badges. La página sigue funcionando normal. Esa es la degradación buscada: nunca hay un plan B que implique pedirle algo a un servidor.

Con la extensión apagada sigue leyendo y guardando. El interruptor del popup apaga todo lo que se ve —badges, panel flotante, contador del icono— pero la lectura pasiva y el guardado en chrome.storage.local continúan, para que los Post IDs ya estén listos apenas la vuelvas a encender. Lo decimos acá y no solo en la ayuda del interruptor porque apagada no significa que deje de recolectar, y esa diferencia te la tenemos que contar sin que la tengas que descubrir. Si querés que no lea nada, desactivá la extensión desde chrome://extensions o desinstalala.

3. Dónde quedan los datos

3.1 Las tres salidas fuera de chrome.storage.local

Nada de esto sale de tu máquina, pero sí sale del pedazo de disco que la extensión administra, y por eso va escrito. Las tres las disparás vos con un click:

4. A dónde se transmiten los datos

A ningún lado.

Podés verificarlo vos mismo: abrí las DevTools en una pestaña de Ads Manager, pestaña Network, y no vas a encontrar una sola petición originada por la extensión.

5. Qué NO se recolecta

Ninguna de estas cosas se lee, se guarda ni se transmite:

Nada de esta lista se le pide a Meta ni se guarda. Y donde "no se lee" no alcanza —lo que Meta ya haya metido adentro de una respuesta que la extensión parsea— vale la precisión de la sección 1: pasa por el parser y se descarta ahí mismo, sin guardarse y sin transmitirse.

6. Dónde corre la extensión

Los scripts de contenido se inyectan únicamente en estas tres rutas:

Solo en el marco principal de la pestaña (all_frames: false). En cualquier otra página — incluido el resto de facebook.com y de business.facebook.com — la extensión ni siquiera se carga.

Lo que te va a decir Chrome al instalarla, que suena más grande que esto: el aviso de instalación de Chrome nombra dominios y descarta la ruta del patrón. Como uno de los tres patrones es https://www.facebook.com/adsmanager/*, Chrome va a nombrar www.facebook.com entero —igual que adsmanager.facebook.com y business.facebook.com—, sin la parte /adsmanager/. Es una limitación de cómo Chrome redacta el aviso, no un permiso más ancho: lo que manda es el matches del manifest.json, y ahí la ruta está escrita. Fuera de /adsmanager/ el script no se inyecta. El patrón de www.facebook.com está porque esa URL sirve Ads Manager de verdad, y sacarlo dejaría afuera una puerta de entrada que la gente usa.

7. Permisos que pide y por qué

PermisoPara qué
storageGuardar el caché de Post IDs y tus cuatro preferencias en tu propia máquina. Es el único permiso declarado.

No pide host_permissions, ni tabs, ni cookies, ni webRequest, ni downloads, ni identity, ni activeTab. La justificación completa está en store/permissions.md.

8. Cómo borrar tus datos

Estas son todas las formas, con lo que alcanza cada una:

  1. Botón "Borrar datos" del popup (pide un segundo click para confirmar) o botón "Borrar lista" del pie del panel flotante: los dos hacen exactamente lo mismo, aunque se llamen distinto — borran de chrome.storage.local los Post IDs guardados de la cuenta publicitaria de la pestaña activa. No borran las otras cuentas.
  2. Desinstalar la extensión: Chrome elimina todo su chrome.storage.local automáticamente.
  3. Esperar: cada registro vence a los 30 días de la última vez que se vio y desde ese momento no se lee ni se muestra más. Que se vaya del disco depende de que vuelvas a abrir Ads Manager en esa cuenta y de que en esa visita la extensión vuelva a guardar datos de ella, porque lo que limpia la clave es la escritura, no la lectura, como dice la sección 3. Si no pensás volver a esa cuenta, usá una de las dos formas de arriba.
  4. Si exportaste un CSV, borralo vos desde tu carpeta de Descargas. Ninguna de las tres formas de arriba lo toca: es un archivo tuyo, fuera del alcance de la extensión.

No hay nada que borrar del lado de un servidor porque no hay servidor.

9. Declaración de manejo de datos ante la Chrome Web Store

Esto es contraintuitivo y conviene dejarlo por escrito: aunque todos los datos queden en tu máquina y no se transmitan a ningún lado, la Chrome Web Store igual exige declarar el manejo de datos. Leer el contenido de una página que el usuario visita cuenta como manejo de datos, sin importar que después no salga del dispositivo.

Por eso, en el formulario de "Prácticas de privacidad" de la tienda declaramos la categoría "Contenido del sitio web" (Website content), que es la que corresponde a leer ids y nombres de anuncios de la página de Ads Manager, y aclaramos que ese contenido no se transmite fuera del dispositivo.

Declaramos de más antes que de menos: es más barato ser explícito que que la review lo descubra sola. Y certificamos, porque es verdad:

10. Menores

La extensión es una herramienta de trabajo para gente que administra publicidad. No está dirigida a menores de 13 años.

No pide ni recibe la edad de nadie, ni ningún dato de identificación personal: lo único que guarda son ids de anuncios, ids de publicaciones y nombres de anuncios de la cuenta publicitaria que vos tenés abierta, y todo queda en tu máquina. No hay perfilado de usuarios ni forma de distinguir la edad de quien la usa, ni falta.

11. Relación con Meta

Este es un proyecto independiente. No está afiliado, patrocinado ni avalado por Meta Platforms, Inc. "Meta", "Facebook" y "Ads Manager" son marcas de sus respectivos titulares.

12. Cambios en esta política

Si alguna versión futura cambia lo que la extensión lee, guarda o transmite, este documento se actualiza en el mismo commit que el cambio de código, y se sube la fecha de arriba. La política describe lo que el código hace hoy; no es una lista de intenciones.

13. Contacto

adlupa@proton.me



Privacy Policy (English)

AdLupa — Last updated: 2026-08-20 — Covers version 0.1.0 — Contact: adlupa@proton.me

In one line

The extension reads the Post ID of the ads already loaded in the Meta Ads Manager page you have open, stores it locally in chrome.storage.local, where it expires after 30 days, and sends it nowhere. No servers, no accounts, no analytics.

What it reads

Only while a Meta Ads Manager tab is open, and only three things: the ad (adgroup) ID, the effective_object_story_id (fallback: object_story_id) in the form pageId_postId, and the ad name. Plus four of your own preferences (extension on/off, interface language, floating panel open, debug mode — off by default). Nothing else is stored: no metrics, no budgets, no spend, no billing data.

Each stored record carries those three fields and nothing else read from the page. It does carry two things the extension derives on its own: the Story ID also kept split into its two halves (pageId and postId, so it does not have to be split again every time a badge is drawn) and the date the ad was last seen, which is what makes the 30-day expiry work. The ad account id lives in the record's storage key.

All the records of one account are stored together inside a wrapper, and that wrapper carries two more things that also stay on disk: a cache-format version number (currently 1), which is what allows a cache written by an older version of the extension to be discarded outright, and the account id again — this time inside the value, on top of being in the key. That completes the inventory of what gets written.

"Reads" and "stores" are not the same thing, and the difference matters: to find the Post IDs, the extension parses the full body of every response that passes the URL filter. Those responses can contain things other than Post IDs. Out of all of that, the only things retained are the three fields above; the rest is discarded when parsing ends and is never stored or transmitted. Saying "it does not read metrics" would be inaccurate; what is accurate is that it does not store them.

Note in good faith: the ad name is free text that you wrote. If you put personal data inside an ad name, that text is cached locally exactly as it already existed in Ads Manager. The extension does not interpret it or separate it out.

How it reads it: passively

The extension never sends a request of its own — no background requests, no telemetry, no Graph API, no servers of ours or anyone else's. The one exception is user-initiated: the badge menu has an "Open on Facebook" item that opens the post in a new tab, exactly like clicking a link. It wraps the page's own fetch and XMLHttpRequest in order to read responses that Ads Manager itself already requested, and it looks at <script type="application/json"> blocks already present in the HTML. It only inspects responses whose URL contains graph.facebook.com, /api/graphql or /adsmanager/. It does not read cookies (the cookies permission is not declared), does not touch session tokens or credentials, and does not alter any request or response.

Switching the extension off does not stop it from reading. The popup switch hides everything visible — badges, floating panel, toolbar counter — but passive reading and local storage keep running, so the Post IDs are ready the moment you switch it back on. We say this here and not only in the switch's own tooltip because off does not mean it stops collecting, and you should not have to discover that. To stop it from reading anything, disable the extension from chrome://extensions or uninstall it.

Where it is stored

In chrome.storage.local, on your own machine, under keys prefixed with postids: (one per ad account, e.g. postids:act_000000000000000) plus a settings key. Each record expires after 30 days counted from the last time that ad was seen; once expired, the extension stops reading it and stops showing it immediately. There is a cap of 5000 records per ad account; past that, the oldest ones are dropped. localStorage and sessionStorage are not used (the project's linter blocks them). chrome.storage.sync is not used, so nothing syncs to your Google account.

When it actually leaves the disk, precisely: reading the cache does not clean it. When you open Ads Manager on that account, the content script skips the expired records and does not load them into memory — which is why they stop being read and stop being shown immediately — but the key on disk is untouched: that read writes nothing. What removes them from disk is the next write of that key, which dumps to disk whatever is left in memory and therefore leaves the expired ones out. That write happens when the extension stores new pairs for that account, or when a record expires while the tab is already open. Opening the account is necessary but not sufficient: if no new pair is extracted during that visit, the expired key stays on disk. And there is no background sweep: the extension uses no chrome.alarms and runs nothing at browser startup. The uncomfortable consequence, which is why we write it down: if you stop opening an ad account, its postids: key stays on disk — expired, unused and never shown — until you open that account again and the extension writes something for it, clear its data by hand, or uninstall the extension.

Three ways data leaves chrome.storage.local

None of this leaves your machine, but it does leave the slice of disk the extension manages, which is why it is written down here. You trigger all three with a click:

Where it is transmitted

Nowhere. There is no backend for this project and no third-party service: no analytics, no error reporting, no license server, no payment processor, no user accounts, no telemetry. The manifest declares no host_permissions and no externally_connectable, so the extension has no way to talk to an external server. No remote code is loaded or executed; all shipped JavaScript is unminified and unobfuscated so it can be read.

What is never collected

Credentials, passwords, session tokens, cookies, payment or billing data, browsing history, open tabs, bookmarks, download history, contacts, email, messages, location, device identifiers, customer lists or audience data, or content from any site other than Meta Ads Manager.

None of that list is requested from Meta or stored. And where "not read" is not enough — whatever Meta already put inside a response the extension parses — the precision note above applies: it goes through the parser and is discarded right there, never stored and never transmitted.

Where it runs

Content scripts are injected only into https://adsmanager.facebook.com/adsmanager/*, https://business.facebook.com/adsmanager/* and https://www.facebook.com/adsmanager/*, main frame only. The extension does not load on any other page.

What Chrome will tell you at install time, which sounds broader than this: Chrome's install prompt names domains and drops the path of the pattern. Since one of the three patterns is https://www.facebook.com/adsmanager/*, Chrome will name the whole www.facebook.com domain — along with adsmanager.facebook.com and business.facebook.com — without the /adsmanager/ part. That is a limitation of how Chrome words the prompt, not a wider permission: what governs is the matches list in manifest.json, and the path is written there. Outside /adsmanager/ the script is not injected. The www.facebook.com pattern is there because that URL really does serve Ads Manager, and removing it would shut a door people actually use.

Permissions

storage only — to keep the Post ID cache and your four preferences on your own machine. No host_permissions, no tabs, no cookies, no webRequest, no downloads, no identity, no activeTab. The full justification is in store/permissions.md.

Deleting your data

These are all the ways, and what each one covers:

  1. The "Clear data" button in the popup (it asks for a second click to confirm) or the "Clear list" button in the floating panel's footer: both do exactly the same thing despite the different labels — they delete from chrome.storage.local the Post IDs stored for the ad account open in the active tab. Neither touches the other accounts.
  2. Uninstall the extension: Chrome wipes its chrome.storage.local automatically.
  3. Wait: every record expires 30 days after the ad was last seen and is neither read nor shown from that moment on. Whether it leaves the disk depends on you opening Ads Manager on that account again and on the extension writing data for it during that visit, because what clears the key is the write, not the read, as described above. If you do not plan to go back to that account, use one of the two options above.
  4. If you exported a CSV, delete it yourself from your Downloads folder. None of the three options above touches it: it is a file of yours, outside the extension's reach.

There is nothing to delete server-side, because there is no server.

Chrome Web Store data disclosure

Counterintuitive but important: even though everything stays on your device, the Chrome Web Store still requires a data-handling disclosure. Reading the content of a page a user visits counts as data handling regardless of whether it ever leaves the device. We therefore disclose the "Website content" category in the store's Privacy practices form, and state that this content is not transmitted off the device. We also certify — truthfully — that the data is not sold to third parties, is not used for any purpose unrelated to the extension's single purpose, and is not used to determine creditworthiness or for lending purposes.

Children

This is a professional advertising tool. It is not directed at children under 13.

It never asks for or receives anyone's age, or any identifying information: all it stores are ad IDs, post IDs and ad names from the ad account you have open, and everything stays on your machine. There is no user profiling and no way to tell the age of whoever is using it — nor any need to.

Relationship with Meta

Independent project. Not affiliated with, sponsored by, or endorsed by Meta Platforms, Inc. "Meta", "Facebook" and "Ads Manager" are trademarks of their respective owners.

Changes

If a future version changes what the extension reads, stores or transmits, this document is updated in the same commit as the code change. This policy describes what the code does today, not what we intend.