Ayuda de Net Tinker

Read in English

Quiero… — encontrar la herramienta adecuada

Cada nombre en negrita está escrito exactamente como aparece en la extensión, así que puedes buscarlo con Ctrl+F aquí y encontrarlo igual en la interfaz.

…cambiar lo que hace una petición o una respuesta

Todo esto es una regla. El tipo se elige en el desplegable Tipo de regla al crearla.

Quiero… Usa esto
Que un endpoint devuelva un 500, un 404, un 401 — un error difícil de provocar de verdad Tipo Mockear la respuesta (API) (la petición no llega a salir), y ajusta el Código de estado. Ver Tu primera regla.
Devolver datos de prueba de un endpoint que todavía no existe Tipo Mockear la respuesta (API), escribe el JSON en Body de respuesta. Ver Tu primera regla.
Empezar un mock desde lo que devolvió el servidor de verdad, en vez de escribir un fixture El botón Mockear del panel de DevTools — ver Crear reglas a partir de tráfico real.
Cambiar un solo campo de una respuesta real de la API y dejar el resto igual Tipo Modificar el body de la respuesta real, Modo = Sobrescribir un campo JSON, p. ej. Ruta del campo user.status.
Sustituir un texto dentro de una respuesta real Tipo Modificar el body de la respuesta real, Modo = Buscar y reemplazar.
Añadir, sobrescribir o quitar una cabecera Tipo Modificar headers — ver la sintaxis y los Presets de ahí abajo.
Mandar una cabecera Authorization que la app no envía Tipo Modificar headers, preset Cabeceras de auth. Escribe Authorization: Bearer {{token}}, así que define una variable token para acompañarlo.
Que el navegador deje de servir de caché y mi regla tenga ocasión de aplicarse Puntual: ↻ Recargar sin caché en el popup. Para todas las recargas: tipo Modificar headers, preset Bypass de caché.
Sortear una queja de CORS mientras desarrollo Tipo Modificar headers, preset CORS de desarrollo — pero lee antes Cosas que parecen fallos y no lo son: no levanta un bloqueo real del navegador.
Apuntar una llamada a localhost o a otro entorno Tipo Redirigir petición, rellena Redirigir a.
Cambiar staging por local en todas las URL, conservando el resto Tipo Reemplazar texto en la URL (Buscar / Reemplazar por).
Mandar todas las llamadas /api/v1/… a /api/v2/… conservando el resto de la ruta Pon Comparar en regex, captura entre paréntesis lo que quieras conservar y escríbelo con $1, $2… Patrón /api/v1/(.*) y destino /api/v2/$1 es una regla en vez de una por endpoint. El probador de patrones que hay debajo del campo de URL te enseña qué capturó cada grupo, así que se comprueba antes de guardar. Funciona en Redirigir a y en Reemplazar por; $$ escribe un dólar literal, y un $N sin grupo detrás se queda en nada en vez de colarse en la URL.
Forzar un parámetro de query que la interfaz no expone (un flag de debug, un tamaño de página) Tipo Parámetro de query.
Que una llamada falle, para ver qué hace mi manejo de errores Tipo Cancelar petición.
Probar con red lenta, spinners y estados de carga Pon Latencia (ms) en el bloque Simulación de red de la regla. Funciona con cualquier tipo — incluida una regla que no haga nada más.
Probar con red inestable, donde cada llamada tarda algo distinto Mín (ms) y Máx (ms) en el mismo bloque. Ver Latencia aleatoria.
Ver qué hace mi interfaz cuando una llamada no contesta nunca Timeout simulado (ms). No es lo mismo que una latencia larga: la petición acaba fallando. Ver Timeout simulado.
Que un endpoint falle a veces, no siempre — para probar reintentos Modo caos: pon un % errores o un % timeouts y el resto de las peticiones seguirán funcionando. Ver Modo caos.
Ver qué hace mi interfaz si este endpoint devuelve un 500, pero con el payload real y sin escribir un mock Pon Sobrescribir el estado real en el bloque Simulación de red de la regla. La petición sigue saliendo, el body real sigue volviendo y solo cambia el código de estado. Ver Sobrescribir el estado de una respuesta real.
Enviar al backend un payload que la interfaz nunca mandaría Tipo Modificar body de la petición.
Mockear un endpoint y que además tarde — o redirigir una llamada y añadirle una cabecera Dos reglas que coincidan con la misma URL, una para cada mitad: se aplican todas. Ver Cuando varias reglas coinciden con la misma petición.
Afectar a una sola operación GraphQL, no a todo el endpoint Cualquier tipo de regla, más una Condición de body como "operationName":"GetUser". El panel de DevTools te la rellena.
Limitar una regla a una pestaña para que no afecte a todo lo que tengo abierto El botón 📌 junto a la regla en el popup — ver condiciones extra.
Tengo un cURL —de unas DevTools, de un ticket, de la documentación— y quiero una regla para esa llamada En el formulario, junto a Patrón: Pegar un cURL. Ver Pegar un cURL.
Que mi aplicación entera hable con mi backend local en vez de con producción Apuntar a otro backend, junto al campo de patrón: dos campos y ya. Ver el atajo.

…moverme por la extensión

La página de opciones tiene dos filas de mandos, y en qué fila está una cosa te dice a qué afecta. La cabecera lleva lo que gobierna todo: el proyecto en el que estás, después Exportar · Importar ▾ · + Nueva regla, y en la esquina el interruptor maestro, el 🌐 idioma de la interfaz y la ayuda.

La tira de pestañas de debajo abre lo que vive dentro del proyecto activo: 📁 Grupos · 🎭 Escenarios · {{ }} Variables · 🌐 Entornos · 🎯 Alcance · 📡 Capturas · 🗑 Papelera. Solo hay un panel abierto a la vez, y el que dejes abierto es el que te encuentras la próxima vez. El orden es a propósito: los cinco primeros configuran cómo se comportan tus reglas y los dos últimos no configuran nada — 📡 Capturas es el registro de lo que hicieron tus reglas, y 🗑 Papelera es lo que has borrado.

Quiero… Usa esto
Averiguar por qué mi regla no hace nada Por qué una regla puede no estar aplicándose — la lista completa, en orden.
Comprobar que mi patrón coincide con una URL antes de guardar la regla URL de prueba (opcional), justo debajo del patrón en el formulario. Ver matching.
Saber cuál de mis reglas gana cuando dos coinciden con la misma URL Cuando varias reglas coinciden con la misma petición — respuesta corta: se aplican todas, y donde chocan gana la que esté más abajo en la lista.
Ver qué peticiones ha atrapado una regla de verdad Grabar esta pestaña en el popup y luego 📡 Capturas en la página de opciones. Ver Ver qué ha pasado de verdad.
Recuperar algo que acabo de borrar 🗑 Papelera — ver La papelera: deshacer un borrado.
Leer la extensión en otro idioma El botón 🌐 de la cabecera, junto al interruptor maestro. Español e inglés; Automático sigue al navegador. Lo que elijas vale para el popup, la página de opciones, el panel de DevTools y esta ayuda, no es de ningún proyecto y no viaja en un export — es un ajuste tuyo, no de tus reglas.
Cambiar un host entre Local, Staging y Prod sin editar todas las reglas Variables más Entornos.
Activar o desactivar varias reglas a la vez Métetelas en un Grupo (panel Grupos, arriba de la página de opciones) y activa o desactiva el grupo. O selecciona varias reglas del listado —a mano, o con Marcar todo, que actúa sobre lo que el filtro esté enseñando— y usa la barra que aparece. Ver Actuar sobre lo que el filtro enseña.
Tener listos los cinco estados de error de un endpoint sin escribir cinco mocks 🎭 Escenarios en la página de opciones → + Desde plantilla. Eliges Errores HTTP típicos o Colección REST, dices sobre qué URL, y cada variante llega con su regla ya escrita —estado, cabeceras y cuerpo—. No se activa ninguna hasta que la elijas.
Encontrar una regla entre muchas Los cuatro mandos que hay encima del listado: el buscador, y los filtros por tipo, por grupo y por escenario. Ver Encontrar una regla entre doscientas.
Mockear una API entera de la que tengo la spec, sin escribir regla por regla Importar en la página de opciones, y elige el openapi.json — ver Partir de una spec de OpenAPI / Swagger.
Aprovechar los ejemplos de respuesta que tengo guardados en Postman El mismo Importar, con el fichero de la colección — ver Traer una colección de Postman. Si la colección no lleva ejemplos guardados no sale ninguna regla, y ahí está cómo se guardan.
Recuperar mis perfiles de ModHeader, ahora que esa extensión ya no está en la tienda El mismo Importar, con el fichero que exportaste de allí — ver Traer un perfil de ModHeader.
Saber qué ficheros acepta Importar, sin tener que probar uno a uno La flecha ▾ de al lado los enumera. El menú informa, no enruta: todas sus entradas abren el mismo selector de archivos y el fichero se reconoce por su contenido, así que elegir la entrada equivocada no rompe nada. Pulsar Importar a secas sigue yendo directo al selector, sin menú de por medio.
Compartir mi configuración con alguien, o llevármela a otra máquina Exportar / Importar en la página de opciones. Lee qué cubre "sanitizar al exportar" antes de mandar el fichero.
Darle a alguien una traza de lo que hizo la página Exportar HAR en el panel de DevTools — ver Crear reglas a partir de tráfico real.
Copiar una petición a una terminal o a la consola Copiar como… en el panel de DevTools (cURL o fetch()).
Reutilizar mis reglas en mis tests de Playwright o Cypress Copiar como… en la fila de la regla (una sola), o Exportar → los botones de mocks del diálogo (todas, o las seleccionadas). Lee los comentarios del fragmento antes de commitearlo: dicen qué se ha tapado y qué no se ha podido traducir.
Llamar al endpoint que una regla intercepta, para comparar con lo real El mismo Copiar como… de la fila, opciones cURL y fetch().
Que una regla gane a otra que también coincide Súbela o bájala con ↑ y ↓: gana la que está más abajo. Ver Cuando varias reglas coinciden.
Que la extensión no toque más que mis sitios Alcance en la página de opciones: en todas partes, solo localhost, o solo los dominios que escribas.
Convertir una navegación entera en mocks de una vez En el panel Net Tinker de DevTools, marca las peticiones que quieras y pulsa Guardar como escenario: una regla de mock por petición, con el estado, las cabeceras y el cuerpo que volvieron de verdad. Antes de crearlo, el diálogo te enseña la lista de reglas que van a nacer: las repeticiones de una misma petición se funden en una —quedándose la última respuesta—, así que un sondeo que salió veinte veces no te deja veinte reglas iguales. El escenario se crea apagado y con una sola variante, «Tal como se grabó» — actívalo cuando quieras que se aplique, y duplica esa variante para escribir encima la versión de «y ahora falla».
Que un mock grabado siga valiendo cuando cambian los parámetros Al guardar la grabación, marca Ignorar los parámetros de la URL. Sin eso, una regla grabada sobre /api/pedidos?page=2 es exactamente esa URL y solo contesta a esa: en cuanto tu aplicación mande otro parámetro —otra página, otro identificador de seguimiento— la regla deja de aplicarse y no hay nada que lo explique. Con la casilla marcada se crea una regla por endpoint, y el resumen del diálogo te enseña cuántas quedan antes de aceptar. Elige tú: si lo que estás probando es justamente la diferencia entre ?page=1 y ?page=2, déjala sin marcar.
Saber qué permisos pide, y para qué En Alcance, al final: Qué le pide a Chrome, y para qué. Son dos, contados del propio manifiesto — no de una lista escrita a mano que pueda quedarse vieja. Y ahí está la mitad que no se ve desde fuera: donde el alcance no llega, la extensión se quita de en medio y deja fetch y XMLHttpRequest como estaban.
Leer un JWT sin pegarlo en una web de terceros Si el valor de una variable es un token, su fila enseña una insignia JWT — en rojo y diciendo caducado cuando lo está, que suele ser la respuesta que buscas. Al pulsarla se ven los claims, el algoritmo y la fecha de caducidad en claro. Se decodifica aquí, no sale nada de tu equipo; la firma no se comprueba, porque sin la clave de quien lo emitió no hay forma.
Que la extensión deje de tocar una web que va rara Abre el popup en esa web y pulsa Excluir este sitio. El dominio va a la lista No actuar nunca en estos dominios de Alcance, que gana sea cual sea el modo — todo lo demás se queda como estaba. Recarga la página después: lo que ya estaba parcheado sigue parcheado hasta entonces.
Apagar todo un momento sin borrar nada El interruptor maestro: Activa en el popup, Extensión activa en la página de opciones.

Tu primera regla: qué campos importan de verdad

Pulsa + Nueva regla (en el popup o en la página de opciones). El formulario se abre en Mockear la respuesta (API), que es el caso más común: contestar una petición desde el navegador en vez de dejar que llegue al servidor. Lo que el formulario enseña de entrada es poco —el resto va plegado en cuatro bloques, que se explican justo debajo— y casi todo es opcional. Esto es lo que necesita de verdad un mock JSON:

  1. URL / patrón — el único campo sin el cual la extensión no guarda la regla. Por defecto se lee como Contiene, así que con /api/users basta para atrapar todas las URL que lleven ese fragmento. Ver Elegir con qué peticiones coincide una regla.
  2. Código de estado — empieza en 200. Es una caja numérica normal con una lista de sugerencias asociada (200, 201, 204, 301, 400, 401, 403, 404, 429, 500, 502, 503…): pincha para elegir una, o escribe directamente el código que quieras.
  3. Headers — una regla de mock nueva se abre con Content-Type: application/json ya escrito en la caja, como valor de verdad: puedes editarlo o borrarlo, y lo que se ve es lo que se guarda. Si lo borras, el mock vuelve como texto plano —algo perfectamente legítimo, para reproducir un servidor que no manda el tipo—, y al guardar nadie te repone la cabecera. Abrir una regla que ya existe no le añade nada, ni aunque tenga los headers vacíos.
  4. Body de respuesta — lo que recibe quien llama. Los botones { } Formatear y { } Minificar de encima ordenan el JSON, y un aviso debajo te dice si lo que has escrito es JSON válido.

Todo lo demás sirve para afinar la regla o para encontrarla después, y vive en cuatro bloques plegables: Organización (descripción, etiquetas, grupo), Coincidencia avanzada (origen, tipo de match, método), Condiciones adicionales (opcional) (condiciones de header, body e iniciador) y Simulación de red (latencia y código de estado, que se aplican a cualquier tipo de regla). En una regla nueva los cuatro empiezan cerrados; al editar una que ya existe se abre cada bloque que esa regla use, así que un bloque plegado nunca esconde algo que hayas puesto. Dos cosas que conviene hacer antes de cerrar:

Atajo: apuntar toda tu app a otro backend

El caso más repetido de todos —quiero que esto hable con mi servidor local en vez de con producción— no necesita que teclees un patrón. En el formulario, junto al campo Patrón, tienes Apuntar a otro backend: escribe el host de origen y el de destino, pulsa, y la regla queda hecha — patrón, tipo Reemplazar texto en la URL y los dos campos de reemplazo.

Lo que escribe es una regla normal y corriente, así que puedes retocarla después. Y afecta a todas las llamadas a ese host, que es justo lo que se quiere aquí: si solo querías una, usa el panel de DevTools.

Tipos de regla

Cada regla tiene exactamente un tipo, que decide qué ocurre cuando coincide con una petición. El nombre en negrita es el del desplegable Tipo de regla, donde los nueve van agrupados por lo que le hacen a la petición —Mock, Passthrough modificado, Redirect y Block, la división que explica Mock vs. passthrough modificado—; el nombre corto entre corchetes es como aparece ese mismo tipo en el listado de reglas, en el filtro de tipo y en la lista de capturas. Una regla hace una sola de estas cosas — pero una petición puede estar gobernada por varias reglas a la vez, así que combinar dos tipos es cuestión de escribir dos reglas. Ver Cuando varias reglas coinciden con la misma petición.

Tipo Qué hace Cuándo usarlo
Mockear la respuesta (API)
[Respuesta]
La petición no llega a la red. Tú defines el status, los headers y el body. El endpoint todavía no existe, o necesitas un caso concreto (500, lista vacía, datos malformados) difícil de provocar de verdad.
Modificar body de la petición
[Body petición]
La petición sale de verdad, pero con un body distinto al que envió la página. Dos modos: reemplazar el cuerpo entero, o sobrescribir un campo JSON por ruta con puntos (variables.userId) dejando el resto del cuerpo tal y como lo construyó la página. El valor nuevo se lee como JSON cuando lo es (42, true, null, {"a":1}) y como texto si no. Si el cuerpo no es JSON —o no es texto siquiera, como un FormData— la petición sale sin tocar y el panel de Actividad dice que la regla coincidió pero no se pudo aplicar. Probar cómo reacciona el backend a un payload que la interfaz normalmente no enviaría. El modo de un solo campo es lo que hace esto usable con GraphQL: puedes cambiar variables.userId sin pegar la query entera dentro de la regla — y sin que la regla envejezca la próxima vez que el front añada un campo a esa query.
Modificar headers
[Headers]
Añade, sobrescribe o quita headers de petición y/o respuesta. La petición sale de verdad. Uno por línea: Clave: Valor sobrescribe o añade, +Clave: Valor añade sin quitar lo que ya hubiera, -Clave elimina. El desplegable Presets te rellena las cajas con tres conjuntos habituales —Bypass de caché, CORS de desarrollo y Cabeceras de auth—, sumándose a lo que ya hubieras escrito y sustituyendo solo las líneas de la misma cabecera. Forzar un header de feature flag, probar un header CORS que falta o sobra, simular un header de auth en local.
Redirigir petición
[Redirección]
Envía la petición a otra URL completamente distinta. Apuntar una llamada a un servidor local o a otro entorno sin tocar la configuración de la app.
Cancelar petición
[Cancelar]
La petición falla directamente — fetch se rechaza, XHR dispara un evento de error. Probar qué hace tu interfaz cuando una llamada falla o un script no carga.
Parámetro de query
[Query param]
Añade o quita parámetros de la query string. La petición sale de verdad. Uno por línea: +clave=valor añade o sobrescribe, -clave elimina. Forzar un parámetro que la interfaz no expone (un flag de debug, un tamaño de página).
Reemplazar texto en la URL
[Reemplazo]
Sustituye todas las apariciones de un texto dentro de la URL, manteniendo el resto igual. La petición sale de verdad. El texto que escribes en Buscar sigue el tipo de coincidencia de la propia regla: con los otros tres se busca literalmente, carácter a carácter, así que un . solo coincide con un punto de verdad. Si eliges Regex pasa a ser una expresión regular de verdad, y Reemplazar por puede usar $1…$N para sus grupos — un grupo que no casó queda vacío, nunca como un $1 literal. Cambiar staging por production en una URL sin montar una redirección completa.
Sin cambios (solo retrasar)
[Sin cambios]
No le hace nada a la petición por sí misma: sale exactamente como la construyó la página. Existe para que una regla pueda llevar solo un modificador —hoy, una latencia— sin tener que cambiar además otra cosa. Hacer lento un endpoint sin alterarlo de ninguna otra forma.
Modificar el body de la respuesta real
[Body respuesta]
La petición sale completamente igual; solo se transforma el body que vuelve, antes de que tu código lo vea. Dos modos: Buscar y reemplazar (texto literal, todas las apariciones) o Sobrescribir un campo JSON (una ruta con puntos como user.status, dejando el resto del JSON tal cual). Tiene límites propios — ver Cosas que parecen fallos y no lo son. Cambiar un campo de una respuesta real de la API (p. ej. un status) sin escribir un mock completo a mano.

La latencia no es un tipo de regla

Retrasar una petición era un tipo aparte y ha dejado de serlo. Latencia (ms) vive en el bloque Simulación de red del formulario y se aplica a todos los tipos: un mock llega tarde, una redirección sale tarde, una petición cancelada falla tarde. Si dejas el campo vacío la regla no añade ninguna latencia; 0 no es lo mismo que vacío — es una espera real, aunque sea mínima.

Si lo único que quieres es hacer lento un endpoint, usa el tipo Sin cambios (solo retrasar) y ponle una latencia. Las reglas que eran del antiguo tipo Retraso se convirtieron exactamente en eso, conservando sus milisegundos, la primera vez que abriste esta versión.

Simulación de red: latencia aleatoria, timeout y caos

El bloque Simulación de red del formulario tiene cuatro maneras de hacer que una petición se porte mal, y las cuatro funcionan con cualquier tipo de regla — un mock, una redirección o una regla Sin cambios (solo retrasar) las admiten igual. Todos los campos son opcionales, y vacío significa "esto no". La Latencia (ms) fija está explicada justo arriba; aquí van las otras tres.

Latencia aleatoria

Mín (ms) y Máx (ms), la fila que hay debajo de la latencia fija. Cada petición espera algo distinto entre esos dos valores, extremos incluidos: con 100 y 200 puede salir 100, puede salir 200 y puede salir cualquier cosa de en medio, y se sortea otra vez en cada petición.

Para qué sirve: un spinner que solo parpadea, una carrera entre dos llamadas que siempre gana la misma, un "cargando…" que nunca llega a verse. Con una latencia fija esos fallos se reproducen siempre o no se reproducen nunca; con un rango aparecen unas veces sí y otras no, que es como aparecen de verdad.

Timeout simulado

Timeout simulado (ms) espera ese tiempo y luego hace fallar la petición como lo haría un timeout de red de verdad. Es el vecino de la latencia en el formulario y no es lo mismo:

Esto… …le hace esto a la petición
Latencia (ms) Acaba bien, solo que tarde. Tu código recibe una respuesta.
Timeout simulado (ms) Tarda y luego falla. Tu código recibe un error de red, no una respuesta.
Tipo Cancelar petición Falla al instante, sin esperar nada.

Modo caos

Tres campos —% errores, Estado del error y % timeouts— que sortean el desenlace en cada petición. El porcentaje de éxito no se pide: es el que sobra. Con 20 y 10, dos de cada diez peticiones reciben el error, una de cada diez se queda sin respuesta, y las siete restantes hacen exactamente lo que diga la regla.

Con el caos puesto, dos recargas iguales no dan el mismo resultado. Es lo que se busca al probar reintentos y estados de error, y es también lo que hace que un caos olvidado en una regla se parezca mucho a un fallo intermitente de tu aplicación. Si algo se comporta raro a ratos, mira este bloque antes de buscar el fallo en otro sitio.

Límite de llamadas y fallo intermitente

Los dos únicos campos de toda la extensión que cuentan peticiones. Los demás miran solo la petición que tienen delante; estos dos miran además cuántas lleva ya esa regla.

Esto… …le hace esto a la petición
Límite de llamadas Las primeras Tras N llamadas pasan como siempre; desde la siguiente, la regla responde con el Estado que digas (429 si lo dejas vacío). Es lo que hace un servidor que te corta por llamar demasiado.
Fallo intermitente Falla la petición N-ésima y deja pasar las demás: con 1 de cada 3 fallan la 3.ª, la 6.ª y la 9.ª, con el Estado que digas (500 si lo dejas vacío). La primera petición nunca falla, para que puedas ver funcionar la regla antes de verla fallar.

De dónde sale la cuenta, que es lo que hay que saber antes de usarlos:

Y si pones dos a la vez —o los dos con caos— gana el más previsible: primero el Límite de llamadas, luego el Fallo intermitente, y el Modo caos el último. Cruzado el límite ya no hay sorteo que valga: lo que puedes predecir mirando tu regla le gana a lo que no puede predecir nadie.

Para probar reintentos: 1 de cada 2 con estado 503. La primera llamada funciona, la segunda falla, la tercera vuelve a funcionar — así se ve si tu código reintenta y si el segundo intento llega. Con el Límite de llamadas a 3 y 429 se ve lo contrario: qué hace tu interfaz cuando algo deja de funcionar y ya no vuelve.

La consola de la página

Anotar en la consola de la página cuando esta regla coincida es la última casilla del bloque, y la única que no le hace nada a la petición: sale exactamente igual que habría salido. Lo que añade es una línea [Net Tinker] por petición en la consola de la propia página —el nombre de la regla, el método, la URL y qué le pasó— justo al lado de los logs de tu aplicación. Ése es todo el asunto: la misma información ya está en 📡 Capturas, pero en otra ventana, y mientras persigues un fallo estás leyendo la consola, no cambiando de pestaña.

La página también lo ve, y conviene saberlo antes de marcarla. Net Tinker escribe esa línea desde dentro de la página, así que lo que la página haga con su consola —un recolector de errores, un grabador de sesión, una pantalla que estés compartiendo— lo recibe igual. Por eso la línea no lleva nunca cabeceras, cuerpo ni valores de variables: tu preset de auth es literalmente Authorization: Bearer {{token}}, y un token no pinta nada en una consola. Si lo que necesitas es ver qué aplicó la regla, para eso está el detalle de la captura.

Sobrescribir el estado de una respuesta real

Hay dos campos en el formulario que son un código de estado HTTP, y no son lo mismo. Es la confusión más fácil de tener aquí, así que va primero:

Campo Qué es Dónde está
Código de estado El estado de una respuesta que fabrica la extensión. La petición no llega a salir, así que no hay ninguna respuesta real por ninguna parte. Solo con el tipo Mockear la respuesta (API), junto al body y las cabeceras del mock.
Sobrescribir el estado real Sustituye el estado de la respuesta que sí ha vuelto del servidor. El body real, las cabeceras reales y todo lo demás llegan intactos. En el bloque Simulación de red, con cualquier tipo de regla.

El caso para el que existe: quieres ver qué hace tu manejo de errores ante un 500 de ese endpoint, pero con los datos de verdad. Con un mock tendrías que escribir el body entero a mano — y entonces ya no estarías probando contra la respuesta real, que era justo lo que querías conservar.

Y como cualquier modificador, se combina: una misma regla puede sobrescribir el estado y transformar el body de la respuesta, y cambiarle una cabecera, y llegar tarde.

Mock vs. passthrough modificado

Es la confusión más habitual, así que merece explicarse aparte:

Mock — la petición nunca sale del navegador. Net Tinker construye un Response falso (o simula las propiedades del XHR) y lo devuelve directamente. El servidor real nunca llega a verla.
Passthrough modificado (body de la petición, headers, redirección, query params, reemplazo en la URL, sin cambios) — la petición sale de verdad por la red, solo que no exactamente como —ni cuando, porque cualquier regla puede llevar una latencia— la construyó la página. El servidor real la ve, y su respuesta real vuelve (posiblemente con los headers de respuesta también modificados de vuelta, en el caso del tipo "headers").
Modificar el body de la respuesta real — la petición sale completamente igual, y solo el body que vuelve se transforma (buscar/reemplazar, o sobrescribir un campo JSON) antes de que tu código lo lea. Los bodies que no son JSON no se pueden inspeccionar para el modo "sobrescribir un campo", así que se dejan intactos en vez de fallar en silencio sin que se note.

Una forma práctica de distinguirlos mientras depuras: abre la pestaña Network de DevTools. Una petición mockeada nunca aparece ahí (no llegó a la red); una modificada-y-dejada-pasar sí, con la URL/body/headers ya reescritos. La lista de capturas dice lo mismo con palabras, petición a petición: "llegó a la red" o "no llegó a la red".

Es una propiedad de la petición, no de cada regla por separado: en cuanto una de las reglas que coinciden la mockea, la petición ya no sale del navegador, hagan lo que hagan las demás. Un mock con latencia es una respuesta que llega tarde y que sigue sin llegar al servidor — ver Cuando varias reglas coinciden con la misma petición.

Elegir con qué peticiones coincide una regla

Sea del tipo que sea, toda regla parte de un patrón: el desplegable Origen decide si ese patrón se compara con la URL completa o solo con el Host, y el desplegable Tipo de match decide cómo. Los dos están dentro del bloque Coincidencia avanzada del formulario, plegado hasta que lo abras:

Tipo de match Cómo se lee el patrón
Contiene (el de por defecto) Coincide si el patrón aparece en cualquier parte de la URL/host. /api/users atrapa todas las URL que lleven ese fragmento.
Es igual a Coincide solo si la URL/host es exactamente el patrón, carácter a carácter.
Regex El patrón es una expresión regular de JavaScript que se prueba contra la URL/host. No tiene que coincidir con todo salvo que la ancles con ^/$.
Wildcard (* ?) Un punto intermedio entre "Contiene" y "Regex": * representa cualquier secuencia de caracteres (incluida ninguna) y ? exactamente un carácter. Todo lo demás es literal, así que no hay que escapar nada — un . es un punto de verdad, no "cualquier carácter". Como Regex, tampoco va anclado: basta con que el patrón aparezca en algún sitio de la URL/host.
https://*.example.com/api/v?/users en modo Wildcard coincide con https://api.example.com/api/v2/users y con https://staging.example.com/api/v3/users, pero no con https://example.com/api/v10/users — ? es exactamente un carácter.

En vez de adivinar, pega una URL real en URL de prueba (opcional), la caja que hay justo debajo del patrón. Responde ✓ Coincide o ✗ No coincide mientras escribes, te dice contra qué ha comparado (la URL entera o solo el host) y te avisa si un patrón Regex no compila. No guarda nada ni lanza ninguna petición. Decide con el patrón, el tipo de match, el origen y las exclusiones; el método y las condiciones de header/body/iniciador las nombra en vez de juzgarlas — una URL no lleva método ni body, así que las enumera como lo que no ha podido comprobar en lugar de dar por hecho que sí.

Todo lo de /api/ menos el health check

Un patrón lo bastante amplio como para ser útil suele serlo también para atrapar algo que no querías: el health check que tu panel pide cada cinco segundos, la llamada de login, la única petición que ya lleva un token de verdad. Para eso está Excepto URLs que contengan (una por línea), justo debajo de los tres desplegables de Coincidencia avanzada. Un patrón por línea; si alguno aparece en la URL de la petición, la regla la deja en paz.

Patrón /api/ con /api/health y /api/auth/ como exclusiones: se mockean todas las llamadas a la API menos el health check y todo lo que cuelgue de auth.

Dos cosas de esta caja son deliberadas, y conviene saberlas antes de pelearse con ella:

La caja de URL de prueba tiene en cuenta las exclusiones: una URL excluida responde ✗ La excluye «…» y dice qué línea es la responsable, en vez de prometer una coincidencia que no va a ocurrir.

Además del patrón, una regla puede llevar condiciones extra, en Condiciones adicionales (opcional) del formulario —salvo el Método, que está con los otros dos desplegables en Coincidencia avanzada—. Todas son opcionales, y todas tienen que cumplirse a la vez (AND, nunca OR):

Encontrar una regla entre doscientas

Encima del listado hay cuatro mandos, y se combinan entre sí: lo que queda es lo que cumple todas las condiciones a la vez.

A cada regla se le ve el grupo al principio de su fila, en una etiqueta antes del nombre. Si el grupo está desactivado lleva un ⚠ y la fila sale atenuada. Las reglas sin grupo no llevan ninguna etiqueta: para encontrarlas, el filtro.

Lo que hay que tener en cuenta al filtrar. El orden del listado es el orden de prioridad (gana la de más abajo), y filtrar no lo cambia: lo que queda sigue en su orden real. Pero una regla que el filtro esconde sigue compitiendo, así que con un filtro puesto "la última que veo" no es necesariamente "la que gana". Por eso, en cuanto un filtro esconde reglas, encima del listado aparece una línea diciendo cuántas se ven de cuántas y recordándolo — con un botón para quitar los cuatro mandos de golpe. Si estás decidiendo prioridades con las flechas ↑ y ↓, quita los filtros antes.

Actuar sobre lo que el filtro enseña

Junto al buscador y a los tres filtros hay dos botones más, Marcar todo y Desmarcar todo, y actúan sobre lo que el filtro esté enseñando: con un filtro puesto, solo sobre esas reglas; sin filtro, sobre todas. El ☑ de cada grupo, en el panel Grupos, respeta el filtro igual. Una línea debajo de los dos botones lo dice con todas las letras, en vez de dejarlo en un tooltip —que no existe si tocas la pantalla, y que no aparece si llegas al botón con el tabulador—.

La selección sobrevive a cambiar de filtro, a propósito: buscar, marcar, buscar otra cosa, marcar más y actuar sobre la suma es justo para lo que sirven esos botones. Por eso el contador de la barra de selección lleva denominador y además dice lo que no estás viendo — «30 de 200 seleccionadas · 30 fuera del filtro»—, y por eso al borrar la confirmación dice cuántas van a quedar: «¿Borrar 30 de las 200 reglas? Quedarán 170.» Un número solo se puede leer de dos maneras opuestas ("creía que eran todas", "creía que eran solo las de la pantalla") y la resta cierra las dos. El ✕ de la barra cancela la selección entera, que es en lo que se diferencia de Desmarcar todo.

Cuando varias reglas coinciden con la misma petición

Nada impide que dos reglas coincidan con la misma petición, y cuando pasa se aplican todas, no solo la primera. Eso es lo que permite redirigir una llamada y añadirle una cabecera, sin tener que meter las dos cosas en una sola regla.

Se aplican en el orden de la lista, de arriba abajo, y cada regla solo opina sobre la parte de la petición de la que va su tipo: una de headers aporta cambios de cabecera, un mock aporta la respuesta, y cualquiera de ellas puede aportar además una latencia. Cuando dos reglas hablan de lo mismo, gana la que está más abajo en la lista. O sea que el orden de la lista de reglas es la prioridad — con los botones ↑ y ↓ de cada regla la mueves por encima o por debajo de otra, y eso cambia de verdad lo que acaba haciendo tu petición.

Dos reglas que coinciden y las dos… Qué acaba haciendo la petición
…mockean la respuesta Contesta la de más abajo: su status, sus headers, su body. La de arriba se sustituye entera, no se mezcla con ella.
…reescriben la URL (redirección, parámetro de query, reemplazo de texto) Las dos, encadenadas: cada una reescribe la URL que dejó la anterior. "Redirigir a localhost" más "añadir ?debug=1" te da una URL de localhost con el parámetro puesto, no una cosa o la otra.
…modifican headers Los dos conjuntos de líneas, ejecutados uno detrás de otro en el orden de la lista — así que para una misma cabecera gana la línea posterior, igual que si fueran dos líneas dentro de una sola regla.
…modifican el body de la respuesta real Las dos, en orden: la regla de más abajo transforma lo que dejó la de más arriba.
…ponen una latencia, o modifican el body de la petición El valor de la de más abajo. Una latencia de 0 ms y un body vacío son respuestas reales, no un "no opino".
Una sola regla que mockea /api/users con un 500 y lleva 2000 ms de latencia te da un 500 que tarda dos segundos en llegar. Dos reglas separadas —una que mockea y otra que solo pone la latencia— dan exactamente lo mismo, que es cómodo cuando quieres poder apagar la lentitud por su cuenta.

Hay dos combinaciones que no las decide el orden de la lista, sino una regla propia:

Para ver qué reglas gobernaron una petición concreta en vez de deducirlo, graba la pestaña y abre la lista de capturas: una petición que coincidió con tres reglas sale con una línea ⚡ por cada una, y la chapa del icono cuenta reglas aplicadas, no peticiones.

Proyectos: trabajos separados que no se mezclan

Un proyecto es todo lo que tienes montado para un trabajo: sus reglas, sus grupos, sus escenarios, sus variables y sus entornos. Y lo importante no es que estén juntos, sino que solo se aplica el proyecto activo: las reglas de los demás no tocan ni una petición, aunque estén encendidas.

Desde que instalas la extensión ya hay uno, y mientras sea el único no tienes que hacer nada: el nombre aparece arriba, al lado del título de la página, y ahí está todo lo tuyo. Al pulsarlo se abre el menú para cambiar de proyecto, crear otro, renombrarlo o borrarlo. En el popup aparece un desplegable Proyecto en cuanto haya más de uno.

Estás con el API de un cliente y te piden mirar un bug de otro. Creas un proyecto nuevo, montas ahí las cuatro reglas que necesitas, y al volver al primero te lo encuentras exactamente como lo dejaste — sin apagar nada, sin borrar nada y sin que las reglas de un trabajo se apliquen en el otro.

Todo lo que creas cae en el proyecto activo, incluido lo que importas: un pack, una spec de OpenAPI, una colección de Postman o un HAR entran donde estés trabajando.

Y lo que exportas es el proyecto en el que estás, solo eso: sus reglas, sus grupos, sus escenarios, sus variables y sus entornos. Lo de los demás proyectos no viaja en el fichero.

El pack dice de qué proyecto salió (su nombre y su alcance), y al importarlo puedes elegir dónde entra: en el proyecto en el que estás, o en uno con ese nombre — se crea si no lo tienes, y si ya lo tienes, lo que importas se añade a lo que ya hubiera. Así es como se lleva un cliente de una máquina a otra de una pieza. El destino siempre empieza en «este proyecto»: crear uno es una decisión tuya, nunca un efecto secundario. Si el pack salió del proyecto principal —el que no tiene nombre propio— no te preguntará nada, porque no hay ningún nombre que ofrecerte.

Lo que también es de cada proyecto, y suele sorprender la primera vez:

Borrar un proyecto se lo lleva todo y no pasa por la papelera. Reglas, grupos, escenarios, variables y entornos de ese proyecto desaparecen a la vez; el aviso te dice cuántos son antes de hacerlo. El proyecto principal no se puede borrar —es donde cae todo— pero sí vaciar y renombrar.

Y una pista para cuando algo no se aplica: si una regla que juras haber creado no aparece por ninguna parte, mira el nombre de arriba. Casi siempre está en el otro proyecto. Es el primer sitio donde mirar, antes incluso de los de Por qué una regla puede no estar aplicándose.

Usar variables

Define un par nombre/valor una vez (botón "{{ }} Variables" en la página de opciones) y reutilízalo como {{nombre}} en cualquier sitio donde repetirías la misma cadena: el body de una regla, el valor de un header, una URL de redirección, el valor de un query param, el texto de reemplazo de una regla "Reemplazar texto en la URL", y tanto el texto de reemplazo como el valor nuevo del campo JSON de una regla "Modificar el body de la respuesta real".

Define apiHost = api.staging.example.com y úsalo como https://{{apiHost}}/v2/users en una redirección. Cambias el entorno una vez, en un sitio, en vez de buscar cada regla que tenía el host viejo escrito a mano.

Un nombre que no coincide con ninguna variable definida se deja tal cual está escrito — {{typo}} aparece literalmente en la petición o respuesta, en vez de desaparecer en silencio, así que un error es evidente en vez de un misterio. Las variables no se sustituyen en los campos de matching de una regla (el patrón de URL, o una condición de header/body/iniciador) — esos comparan contra la petición real, así que una variable ahí no significaría nada.

Ver y copiar lo que lleva dentro un JWT

Cuando el valor de una variable tiene forma de JWT, aparece una insignia JWT al lado. Al pulsarla se abre el visor: la cabecera y los claims, con la fecha de caducidad en horas de reloj y no en el número de segundos que trae dentro.

El visor trae dos botones, y hacen cosas distintas a propósito: Copiar token copia el token tal cual, listo para pegar en una cabecera Authorization; Copiar claims copia el JSON de la cabecera y el payload, que es lo que se pega en un ticket o en un chat.

El visor no comprueba la firma, y no puede: eso exige la clave del servidor. Sirve para leer lo que el token dice, no para saber si el servidor lo va a aceptar.

Entornos

Un entorno (botón "🌐 Entornos", junto a Variables) es un conjunto con nombre de sobrescrituras sobre tus variables — Local, Staging, Prod, lo que necesites. Solo hace falta que sobrescriba lo que realmente cambia entre entornos; lo que no menciona conserva el valor propio de la variable.

Con apiHost = local.test como valor base, un entorno "Prod" puede sobrescribir solo apiHost = api.example.com y dejar el resto de variables tal cual.

Elige el entorno activo con el botón de estrella junto a él en la página de opciones, o desde el desplegable Entorno del popup (solo aparece cuando existe al menos un entorno). Sin entorno activo, cada variable usa simplemente su propio valor base — igual que antes de que existieran los entornos.

Escenarios: varias versiones de la misma API

Un escenario agrupa varias variantes con nombre de la misma API, de las que solo una está activa: Login → Éxito / Credenciales inválidas / Backend caído. Cada regla puede pertenecer a una variante, y las reglas de una variante que no está activa no se aplican — el motor ni siquiera las mira.

La exclusión es por API, no global. Dos escenarios pueden estar en estados distintos a la vez: el de Login en "Backend caído" mientras el de Pagos sigue en "Éxito". Es la diferencia con tener las reglas sueltas y ir encendiéndolas y apagándolas a mano, que es lo que esto viene a sustituir.

Para demostrar cómo se comporta tu aplicación cuando el login falla, no hace falta tocar ninguna regla: cambias la variante activa del escenario "Login" a "Credenciales inválidas" y recargas.

Se crean y se organizan en la página de opciones, con el botón 🎭 Escenarios; se cambia la variante activa desde ahí o, más cómodo mientras pruebas, desde el popup, que enseña una fila por escenario. Una regla se asigna a una variante desde su propio formulario.

Si no quieres empezar de cero, + Desde plantilla deja el escenario montado con sus variantes y sus reglas ya escritas — los errores HTTP típicos, o el esqueleto de una colección REST. Y los escenarios viajan en el fichero de export junto a las reglas, así que se comparten con el equipo como todo lo demás; al importar, uno que choque con otro que ya tengas te pregunta si sobrescribir, duplicar u omitir, igual que las reglas y los grupos.

Elegir una variante que ya no existe —porque alguien la borró— guarda "a ninguna", no un puntero muerto: la regla deja de pertenecer a nadie y se comporta como una regla suelta.

Borrar un escenario, o una sola variante, te pregunta qué hacer con sus reglas en vez de decidirlo por ti. El diálogo dice cuántas viven dentro y ofrece dos salidas: Conservar las reglas, desactivadas —salen de su variante y quedan apagadas, así que ninguna empieza a aplicarse sola por haber dejado de estar gobernada— o borrarlas también, que no tiene vuelta atrás. Si dentro no hay ninguna regla, la pregunta es la corta de siempre. Es el mismo trato que ya recibía borrar un Grupo con reglas dentro.

Escribir una variable desde una respuesta

Al revés que todo lo anterior: en vez de meter un valor en una petición, una regla puede sacar un valor de la respuesta y guardarlo en una de tus variables. A partir de ahí esa variable ya se interpola sola en todos los sitios de la sección anterior, así que el caso típico se resuelve entero con una sola regla: extrae token de la respuesta de tu /login a la variable JWT y todas las reglas que mandan Authorization: Bearer {{JWT}} empiezan a mandar el token recién emitido, sin copiarlo a mano nunca más.

Está en el bloque plegable "Escribir una variable desde la respuesta" del formulario de la regla, y no hace nada hasta que eliges una variable: ninguna de tus reglas actuales captura nada. Puedes localizar el valor de dos formas:

Regla sobre /api/login, sin cambiar nada de la respuesta ("Sin cambios" vale), con Escribir en = {{JWT}} y Ruta del campo = data.token. Otra regla, sobre /api/, de tipo "Modificar headers", que añade Authorization: Bearer {{JWT}}. Haces login una vez y el resto de la sesión va autenticada.

Dónde acaba el valor, que es lo que conviene saber antes de usarlo: en la memoria de la sesión del navegador. No se escribe en disco, no sale en ningún fichero exportado —y no hay ninguna casilla para incluirlo— y desaparece al cerrar el navegador. Al abrirlo otra vez la variable vuelve a valer lo que ponga en tu lista de variables (normalmente, nada) hasta que una respuesta vuelva a rellenarla: volver a hacer login basta. El botón "Borrar valores capturados", en el panel de Variables, los tira en el acto sin esperar a cerrar nada.

El valor capturado gana al que tengas escrito en la lista y al de un entorno, pero solo dentro del entorno en el que se capturó: un token que sacaste en "Staging" no se usa al cambiar a "Producción", donde la variable vuelve a su valor de siempre.

Una limitación que hay que tener presente: el valor no está disponible para las peticiones que salgan en ese mismo instante. Pasa antes por el segundo plano de la extensión — son milisegundos, y el caso normal (login, y después el resto de llamadas) ni lo nota; el que sí lo nota es disparar dos peticiones a la vez y esperar que la segunda ya lleve el token de la primera.

Si la extracción falla no pasa nada malo: la respuesta llega a la página entera y sin tocar, y el panel de Actividad marca esa petición diciendo cuál de las dos cosas pasó — que ahí no había nada que extraer (la ruta o el patrón no encontraron nada en esa respuesta), o que no se pudo extraer (el cuerpo no es JSON, la expresión regular no es válida, el campo existe pero es un objeto). Los cuerpos binarios y los que se mantienen abiertos (streaming) no se leen nunca, y también se dice.

Por qué una regla puede no estar aplicándose

Primero, una comprobación rápida que ahorra mucho tiempo: el icono de la extensión en la barra lleva una chapa con el número de reglas aplicadas en la pestaña actual. Si está vacía después de recargar, no ha coincidido nada y la lista de abajo es donde mirar. Si está contando, la regla sí se aplica y la sorpresa está en lo que hace, no en si se ejecuta.

Y un atajo para la mitad de esta lista. Abre la regla y pega la petición en URL de prueba: además de decirte si el patrón coincide, la caja enumera lo que impediría que esa regla actuara —el interruptor maestro, el suyo propio, su grupo, su variante de escenario, un tipo de regla que el motor ya no aplica— y por separado lo que no puede decidir desde una URL: el método, las condiciones de header, body e iniciador, el alcance y la pestaña a la que esté fijada. Cuando hay algo que explicar, la caja termina diciendo qué se le escapa, que son justamente los últimos de esta lista.

Revisa esto en orden — cubre todos los motivos por los que una regla puede fallar en silencio:

  1. El interruptor maestro (Activa arriba del popup, Extensión activa en la página de opciones) está apagado. Nada se aplica mientras lo esté.
  2. El interruptor propio de la regla está apagado.
  3. La regla pertenece a un grupo desactivado. Un grupo desactivado apaga en silencio todas las reglas de dentro — en el listado, esas reglas muestran un ⚠ junto al nombre del grupo.
  4. La regla está fijada a una pestaña concreta (📌) y estás probando desde otra.
  5. Este sitio está fuera del alcance configurado. Es el que más despista, porque no depende de la regla: si en Alcance (página de opciones) has elegido «Solo localhost» o «Solo estos dominios», en los demás sitios ninguna regla se aplica. El icono de la extensión lo dice — pasa el ratón por encima y verás «fuera de alcance aquí»—, y en ese modo el popup también lo avisa. Ojo con el caso de la lista vacía: «Solo estos dominios» sin ningún dominio escrito no permite nada, en ninguna parte.
  6. El método HTTP de la petición no coincide con el Método configurado en la regla (si no está en "Cualquiera").
  7. El patrón de URL/host no coincide de verdad — revisa el tipo de match tanto como el patrón en sí, y pega la URL real en URL de prueba (opcional) para salir de dudas. Si es Regex, una errata que deja el patrón inválido hace que la regla no coincida con nada en vez de dar un error — la caja de prueba avisa expresamente de ese caso. Otro clásico: escribir * o ? en un patrón que sigue en "Contiene" o "Es igual a", donde son caracteres literales — solo significan algo en modo Wildcard.
  8. La regla tiene un patrón de exclusión que casa con esta URL. Es el motivo más fácil de pasar por alto, porque el patrón positivo sí coincide y todo parece correcto: mira Excepto URLs que contengan dentro de Coincidencia avanzada — el bloque se abre solo cuando la regla trae alguna, y el resumen plegado dice cuántas hay. Pegar la URL en URL de prueba (opcional) lo resuelve en el acto: dice cuál de las líneas la excluye.
  9. La regla tiene una Condición de header, una Condición de body o un Dominio iniciador y la petición actual no los cumple. Para condiciones de header y de body en peticiones XHR en concreto: una regla de redirección/query params/reemplazo en la URL nunca puede activarse por ninguna de las dos, porque la URL se decide antes de que la página haya puesto sus headers o haya llamado a send(body) — esto solo funciona para los tipos "mock", "cancelar", "sin cambios", "modificar body de la petición" y "modificar headers" en XHR (en fetch funciona para todos los tipos). Una condición de body además solo compara contenido de texto (JSON, form-encoded, texto plano) — los bodies FormData/Blob/binarios nunca se leen para esto.
  10. La petición no es fetch ni XMLHttpRequest. Net Tinker solo puede interceptar esas dos — no puede afectar a <img>, <script src>, CSS, fuentes ni ningún otro tipo de recurso a la hora de aplicar una regla (el panel de captura de DevTools sí puede verlos todos, simplemente no puede actuar sobre ellos). Cuidado con la lectura al revés: lo que cuenta es cómo se pidió, no qué se descargó. Un SVG o un PNG traídos con fetch() son fetch y sí se pueden mockear.
  11. La petición no la ha lanzado la página, sino su service worker. Muchos sitios registran un service worker (lo verás en DevTools → Application → Service Workers) que descarga por su cuenta parte del contenido. Esas peticiones parecen normales — el navegador las cuenta como fetch y salen en la pestaña Network igual que las demás — pero Net Tinker trabaja desde dentro de la página, y un service worker es un sitio aparte al que ninguna extensión de este tipo llega. Una regla sobre esa URL se crea, se ve activa y no se dispara nunca. No tiene arreglo: es cómo funciona el navegador, no un fallo. El panel de DevTools sí sabe reconocerlas y te lo dice antes de que pierdas la tarde. Lo mismo vale para lo que pidan los workers de la página, para navigator.sendBeacon, para los WebSocket y para las precargas que resuelve el navegador solo.
  12. La petición no ha llegado a ocurrir, porque el navegador la ha resuelto desde su propia caché. No hay nada que interceptar, y se parece exactamente a una regla que no funciona. Usa ↻ Recargar sin caché en el popup para recargar esa pestaña ignorando la caché, o añade una regla Modificar headers con el preset Bypass de caché para que pase en todas las recargas.
  13. Otra regla que también coincide la está pisando. Las reglas no se tapan entre ellas —se aplican todas—, pero cuando dos hablan de lo mismo gana la que está más abajo en la lista, y una regla Cancelar petición gana a todo. Así que la regla puede estar aplicándose perfectamente y aun así no dejar rastro: reordena la lista, o afina el patrón de la otra regla. Ver Cuando varias reglas coinciden con la misma petición.
  14. La regla tiene un tipo que esta versión no sabe aplicar. Puede pasar al importar un fichero escrito por una versión posterior, o si una actualización dejó una regla a medio migrar. Se ignora solo esa regla, exactamente como si no hubiera coincidido —nunca se responde con un mock vacío, y cualquier otra regla que coincidiera con esa misma petición sí se aplica— y la fila se marca en la lista de capturas con ⚠ y el nombre del tipo no reconocido, para que la situación se vea en vez de parecer tráfico normal. Abre la regla y vuelve a elegirle un tipo.
  15. Una regla Modificar el body de la respuesta real sí coincidió, pero la respuesta era un stream en vivo que no se puede bufferizar, así que se dejó intacta a propósito. Ver Cosas que parecen fallos y no lo son; la lista de capturas lo dice con estas palabras: "coincide pero no se aplicó — respuesta en streaming".
  16. Tienes dos copias de Net Tinker instaladas a la vez — lo normal es la de la Chrome Web Store más una de desarrollo cargada sin empaquetar. Las dos parchean la misma página, y la que responde primero se lleva la petición, así que la otra copia no ve nada: ni badge, ni línea en la lista de capturas, y la regla que estás mirando parece no hacer nada aunque sí se haya aplicado una. La pista es que la petición claramente se interceptó mientras la extensión que estás mirando no registra ninguna actividad. Desactiva una de las dos.

Ver qué ha pasado de verdad

Adivinar si una regla se ha aplicado es la vía lenta. Hay tres sitios que te lo dicen, y cada uno responde a una pregunta distinta:

La lista de capturas está apagada hasta que la pides. Abre el popup en la pestaña que quieras observar y activa Grabar esta pestaña — solo se capturan las peticiones de esa pestaña. Después abre la lista con 📡 Capturas en la página de opciones (o Ver capturas desde el popup), que muestra el panel Peticiones capturadas.

Cada fila te dice, en este orden: la página, el status, la hora, y luego qué hizo Net Tinker con ella.

A diferencia del panel de DevTools, estas capturas sí se guardan, así que siguen ahí después de cerrar la pestaña o el navegador. La lista conserva las 200 más recientes y Vaciar la limpia. La grabación se detiene sola si cierras la pestaña que estabas grabando.

La papelera: deshacer un borrado

La 🗑 Papelera guarda tus últimos borrados para que puedas devolverlos. Lo que deshace es el gesto, no el elemento: borrar doscientas reglas sobre un filtro es una entrada, y restaurarla devuelve las doscientas de golpe. Es también lo que hace que borrar un grupo o un escenario con sus reglas dentro vuelva entero — las reglas y su contenedor entraron juntos.

Están todas las formas de borrar, y cada fila dice cuál fue:

Guarda los diez últimos borrados, y como mucho 1 MB en total. Los viejos van cayendo según entran los nuevos — no caduca por días, y es a propósito: el proceso de fondo de una extensión se para a los segundos de no hacer nada, así que una papelera que se vaciara «a la semana» se vaciaría de verdad la próxima vez que abrieras el navegador. Contar borrados no necesita reloj.

El tope de 1 MB está porque diez borrados de una regla no pesan nada y diez de doscientas reglas con cuerpos de mock dentro sí. Y un borrado que por sí solo no cabe no se guarda: la extensión lo dice antes de borrar, para que puedas exportar primero. Un deshacer que la gente cree tener y no tiene es peor que no ofrecerlo.

Dos cosas que restaurar no hace en silencio, y te avisa cuando pasa cualquiera de las dos:

La papelera es por proyecto: enseña lo que has borrado en el proyecto en el que estás, y lo que borraste en otro te espera en ese otro. Borrar un proyecto no pasa por la papelera — se lleva sus reglas, grupos, escenarios, variables, entornos, capturas y su propia papelera, y no hay vuelta atrás. Lo dice la confirmación, que además enumera lo que vas a perder.

Cosas que parecen fallos y no lo son

Net Tinker funciona parcheando fetch/XMLHttpRequest dentro del propio JavaScript de la página. Ese enfoque trae algunos efectos secundarios inevitables:

Pegar un cURL para crear la regla

cURL es el formato en el que ya está todo: las DevTools de cualquier navegador tienen Copiar como cURL, la documentación de cualquier API pega ejemplos en cURL, y quien te reporta un fallo te manda un cURL. En el formulario de regla, junto al campo Patrón, el botón Pegar un cURL abre un cuadro donde pegarlo.

Un cURL describe una petición, no una respuesta, así que esto rellena con qué coincide la regla —la URL, el modo de comparación y el método— y la respuesta la escribes tú. El diálogo lo dice, y antes de aplicar nada te enseña lo que ha entendido.

El cuerpo y las cabeceras, si tú quieres. Debajo del resumen, el diálogo pregunta qué más usar del cURL, y por defecto no usa nada:

El patrón queda como la URL entera, en modo Es igual a. Si esa URL trae parámetros que cambian en cada llamada —un ?t=1725381000— el diálogo te avisa: recórtalos en el campo de patrón o la regla no volverá a coincidir.

Crear reglas a partir de tráfico real

Abre DevTools en cualquier página y busca la pestaña "Net Tinker" (junto a Elements, Console, Network, etc.). Lista todas las peticiones que hace la página mientras el panel está abierto — no solo fetch/XHR, todos los tipos de recurso — para que encuentres exactamente la llamada que te interesa. La cabecera muestra Capturando, y al pulsarla pasa a Pausado si prefieres congelar la lista; marca Conservar registro para que no se vacíe al navegar, y Vaciar la limpia.

  1. Cada fila tiene un desplegable "+ Regla…" y un botón dedicado Mockear. Elegir un tipo abre el editor de reglas ya relleno con la URL real de esa petición (como match Es igual a, así que solo afecta a esa llamada exacta) y su método. El desplegable ofrece todos los tipos de regla menos el mock, que tiene su propio botón.
  2. Una regla creada así llega desactivada salvo que sea un mock o una cancelación — esas dos están completas en cuanto se crean, mientras que el resto son esqueletos todavía vacíos, y activar una "redirección" o un "body de respuesta" vacíos rompería justo el endpoint que estás depurando. Rellénala y luego enciéndela. El panel te dice cuál de las dos cosas ha pasado cada vez.
  3. Mockear va más allá: también copia el código de estado, los headers de respuesta y el body reales de esa petición a la nueva regla, así partes de lo que devolvió el servidor de verdad en vez de escribir un fixture a mano.
  4. Una marca ⚡ junto a una fila significa que alguna de tus reglas activas ahora mismo interceptaría esa petición exacta — se evalúa en vivo contra tus reglas actuales, no contra las que hubiera activas cuando la petición ocurrió de verdad.
  5. Cada fila también tiene una opción "Copiar como…" para copiar la petición como comando cURL o como fragmento fetch(), listo para pegar en una terminal o en la consola.
  6. Exportar HAR guarda como fichero .har estándar las peticiones que se ven ahora mismo en la lista, para dárselas a otra persona o cargarlas en otra herramienta. El diálogo enumera los valores sensibles que ha encontrado y ofrece Sanear credenciales (siempre marcado al abrirse) e Incluir cuerpos de respuesta (siempre desmarcado, recortados a 1 MB cada uno, porque son lo que engorda el fichero). Las dos casillas se rearman cada vez que se abre, así que la opción segura nunca queda apagada de una exportación anterior. Un HAR lleva las cabeceras reales de la petición, Authorization incluida, además de las cookies — trata el fichero como una credencial.
  7. Para una petición GraphQL (detectada automáticamente y mostrada como su nombre de operación junto a la URL), crear una regla desde ella también rellena una Condición de body exigiendo ese nombre de operación — porque un endpoint GraphQL sirve todas sus operaciones en la misma URL, y una regla que solo mirase la URL aplicaría a todas ellas. Puedes verlo y editarlo en la regla que se abre (es la misma condición de body de arriba, ya rellena por ti). El filtro del panel también busca por nombre de operación.
  8. El panel lista todo lo que hace la página, pero no todo se puede mockear. Si creas una regla desde una fila que no lo es, el panel te avisa antes de que la des por buena: la regla se crea, pero nunca se disparará. Hay dos motivos distintos y te dice cuál es el tuyo:
    • Por cómo se pidió. Una imagen de un <img>, un <script src>, una hoja de estilos o una fuente no pasan por fetch/XMLHttpRequest, así que no hay nada que interceptar. Ojo: lo que cuenta es cómo se pidió y no qué se descargó — un SVG o un PNG traídos con fetch() sí se pueden mockear, y por eso siguen apareciendo en la lista.
    • Por quién la pidió. Si la lanzó el service worker del sitio y no la página, Net Tinker no llega ahí — y esta es la traicionera, porque la fila se ve idéntica a una normal. El panel nombra el script responsable para que puedas comprobarlo en Application → Service Workers.
    La casilla "Solo mockeables" (marcada de fábrica) esconde de un golpe las filas de los dos casos. Desmárcala para verlo todo: seguirás pudiendo copiarlas como cURL, compararlas y exportarlas a HAR, que eso sí funciona con cualquier petición.

Las capturas de este panel viven solo en memoria mientras DevTools está abierto — al cerrar DevTools se vacían, y no se guarda nada hasta que conviertes explícitamente una petición capturada en una regla o exportas un HAR. Esa es la diferencia con la lista de capturas de la página de opciones, que sí se guarda a propósito.

Peticiones repetidas, y cuánto tarda todo

Cuando la misma petición —mismo método y misma URL— sale varias veces seguidas, la fila lleva una insignia ×N. Es lo que convierte «esto va lento» en «esto se está pidiendo cuatro veces», que es otra conversación. La casilla Solo repetidas deja en la lista únicamente esas.

La cabecera del panel resume además los tiempos de lo capturado: P50, P90, P95 y P99 y la proporción de errores. Dos cosas que conviene saber para leerlo:

Buscar dentro de los cuerpos

El buscador de la cabecera filtra por URL. El botón Buscar en los cuerpos repite esa misma búsqueda dentro de lo que viajó: útil cuando lo que recuerdas no es la ruta sino un identificador, un mensaje de error o el nombre de una operación de GraphQL.

Los cuerpos se piden al navegador uno a uno y solo cuando lo pides, así que sobre una lista larga tarda un momento. Es el mismo precio que pagar por ver un cuerpo, multiplicado por las filas.

Copiar una petición a otro formato

Cada fila tiene Copiar como…, y lo que copia depende de para qué lo quieras:

Comparar dos respuestas

El botón ⇄ de una fila la fija, y el de otra abre la comparación. No se lanza ninguna petición: se comparan dos capturas que ya tienes.

Los cuerpos JSON se comparan por campos y no por líneas, así que el orden de las claves no produce diferencias, y las coincidencias se cuentan en vez de listarse. Dos mandos, en el propio diálogo:

Los tokens que aparecen sueltos dentro de un texto (un JWT, una clave de proveedor) se tapan siempre, sin depender de esa casilla. La asimetría es deliberada: ahí no hay falsos positivos que perder y sí un secreto que enseñar.

Partir de una spec de OpenAPI / Swagger

Si la API que estás mockeando publica su spec, no hace falta escribir las veinte reglas a mano. Pulsa Importar y elige el openapi.json (o el swagger.json): cada endpoint, método y código de respuesta se convierte en una regla con su patrón de URL, su estado y su cuerpo ya rellenos. Es el mismo botón con el que importas tus propios ficheros, una colección de Postman o un perfil de ModHeader: la spec se reconoce sola por su sello de versión, y la flecha ▾ de al lado enumera todo lo que el botón acepta.

Qué se soporta

De dónde sale el cuerpo de cada mock

En este orden, y el orden importa:

  1. el example que la spec da para esa respuesta;
  2. el primero de sus examples con nombre (los demás se listan como no importados, uno a uno);
  3. el example del esquema;
  4. un esqueleto generado a partir del esquema: la forma correcta con valores de relleno ("string", 0, true), salvo en los formatos que tu código sí parsea (fechas, UUID, correos), que llevan un valor plausible para que no revienten al llegar.

Ese último no es un dato de la API: se lo inventa esta extensión. Toda regla con un cuerpo generado lo dice en su propia descripción, para que dentro de tres semanas se siga distinguiendo. Edítalo y dale datos realistas antes de fiarte de lo que veas en pantalla.

Cómo queda organizado

Elegir qué endpoints entran

No se crea nada hasta que tú lo digas, y no es todo o nada. Primero sale un diálogo con lo que trae la spec —el mismo que sale con una colección de Postman, para que la pregunta no se conteste distinto según el fichero—: una fila por endpoint, con su método, la URL contra la que va a casar y cuántas reglas y variantes crearía — más un buscador, marcar todo / desmarcar todo sobre lo que el buscador esté enseñando, y un contador que dice a cada momento qué suma lo que llevas marcado. Las filas salen agrupadas por los tags de la spec, en el orden en que ella los declara, y el tag va escrito en la fila para que el buscador lo encuentre: en una spec de 300 endpoints, escribir un tag y pulsar marcar todo trae ese recurso y nada más.

Todo nace marcado, porque importar no destruye nada —llega todo desactivado— y "solo este endpoint" está a tres gestos. Lo que no marques no llega a crearse: la spec se recorre dos veces, y la primera solo lee y cuenta. Esto no es "impórtalo todo y borra el resto".

Qué te dice que no ha podido hacer

Cuando continúas, el diálogo de importar lista las cosas que no han sobrevivido a la traducción, con su motivo: $ref que apuntan a otro fichero, esquemas que se referencian a sí mismos, alternativas oneOf de las que solo se ha usado la primera, respuestas declaradas como default o 4XX (no hay un código de estado concreto que poner, y elegir uno sería inventarse la respuesta), formatos como image/png o text/csv para los que no se puede fabricar un cuerpo, y cabeceras de respuesta que declaran un tipo en lugar de un valor. Todo lo que se refiere a una respuesta concreta va además escrito en la descripción de su regla, así que sigue ahí cuando cierras el diálogo.

Reimportar una versión más nueva de la misma spec es seguro: las reglas se reconocen como ya existentes (mismo tipo, método y patrón) y eliges si sobrescribir, duplicar u omitir, igual que en cualquier otra importación. Un diff campo por campo que conserve tus ediciones locales todavía no existe.

Qué ha cambiado desde la última vez

Al importar algo que ya habías importado —la misma spec una versión después, el pack del equipo, una colección de Postman— el diálogo añade un resumen de qué ha cambiado respecto a las reglas que ya tienes:

No hace falta que la extensión haya guardado la spec anterior, y no la guarda: la comparación es entre lo que traes ahora y las reglas que tienes delante.

Traer una colección de Postman

Una colección de Postman entra por el mismo botón Importar y se reconoce sola por su sello, igual que una spec. Lo que se convierte en reglas no son las peticiones —esta extensión no envía nada, responde— sino los ejemplos de respuesta guardados que cada petición lleve dentro: cada uno tiene un código de estado, unas cabeceras y un cuerpo reales, y eso es un mock campo por campo. Al revés que con una spec, aquí no se genera ningún cuerpo: lo que veas en la regla es lo que el servidor contestó de verdad el día que se guardó el ejemplo.

Sin ejemplos guardados no sale nada, y ese es el caso más frecuente

Guardar un ejemplo es opcional en Postman y mucha gente no lo hace, así que es perfectamente posible importar una colección de doscientas peticiones y no obtener ni una regla. No es un fallo: no había ninguna respuesta que copiar. El arreglo está en Postman, no aquí — abre la petición, envíala, y usa Save Response → Save as example. Eso deja la respuesta real guardada dentro de la colección. Repítelo con cada petición que quieras mockear y vuelve a exportar la colección.

El importador lo cuenta con esas mismas palabras y de forma agregada —cuántas peticiones se han quedado sin nada, y unos cuantos nombres—, en vez de repetir la misma línea doscientas veces.

Varios ejemplos de una misma petición son un escenario

Es lo que hace que esto encaje tan bien: en Postman es habitual guardar varios ejemplos con nombre de la misma petición —"Success", "401 Unauthorized", "500"— y eso es literalmente un escenario, con una variante por ejemplo. Los nombres de las variantes son los que escribiste allí, así que la correspondencia no hay que inventarla, y se deja activa la primera respuesta 2xx. Con un solo ejemplo no se monta ningún escenario: la petición se queda como una regla suelta, porque un escenario de una variante es un contenedor de un elemento.

Cómo queda organizado

Qué no se trae, y por qué

Todo lo que se refiere a un ejemplo concreto va además escrito en la descripción de su propia regla, así que sigue ahí cuando cierras el diálogo.

Las variables se resuelven al importar, y el vínculo se pierde

Es lo único de este importador que se puede dar por hecho que funciona de una manera y funciona de otra, así que va con su propio apartado. La sintaxis es la misma en los dos sitios ({{nombre}}), pero el patrón de una regla no se interpola nunca: se compara contra peticiones reales, así que un patrón con {{baseUrl}} dentro sería una regla muerta. Por eso las variables que aparecen en la URL se sustituyen por su valor en el momento de importar, con el valor que traiga la colección.

La consecuencia, que es lo que hay que retener: cambiar la variable después no mueve las reglas. El patrón ya no la menciona, así que apuntar la colección a otro entorno es editar esos patrones a mano. En los valores —el cuerpo y las cabeceras del mock— sí se conservan escritas como {{nombre}} y se siguen interpolando en cada petición, igual que cualquier variable de aquí.

Y dos cosas sobre los nombres:

Qué versiones se aceptan

Elegir qué peticiones entran

Antes de construir nada sale el mismo diálogo que con una spec: una fila por petición, con su método, la URL ya resuelta contra la que va a casar y cuánto crearía —sus reglas, y su escenario con sus variantes si trae varios ejemplos—, más un buscador, Marcar todo / Desmarcar todo sobre lo que el buscador esté enseñando, y un contador que dice a cada momento qué suma lo que llevas marcado. Lo que no marques no llega a crearse.

Las peticiones sin ningún ejemplo utilizable no salen en esa lista, porque no hay nada que elegir en ellas — pero siguen contando en el aviso de arriba, que es donde su ausencia importa.

Reimportar una versión más nueva de la misma colección es seguro: las reglas se reconocen como ya existentes (mismo tipo, método y patrón) y eliges si sobrescribir, duplicar u omitir, igual que en cualquier otra importación.

El viaje de vuelta no existe

No se puede exportar un escenario como colección de Postman, y no es un pendiente: una regla no es una petición. De los nueve tipos solo el mock se le parecería, y para "modificar headers" o "cancelar petición" es que Postman no tiene ningún concepto donde ponerlos. Además el patrón de una regla es una expresión regular, y de una expresión regular no se puede recuperar la URL que la originó: un exportador tendría que inventarse una, y esa URL inventada es justo la que alguien enviaría contra un servidor de verdad. Para llevarte un endpoint a otra herramienta está Copiar como… (cURL o fetch()), que trabaja sobre la URL que estás viendo de verdad.

Importar una captura HAR

Un HAR es tráfico que de verdad ocurrió: lo que se pidió, y lo que el servidor contestó, con su código, sus cabeceras y su cuerpo exactos. Se graba en la pestaña Red de DevTools (botón derecho → Save all as HAR) y entra por el mismo botón Importar, reconocido solo.

Para qué sirve de verdad, que es lo que lo distingue del panel de Actividad: para tráfico capturado en otra máquina. El panel solo ve lo que pasa por este navegador; un HAR llega por correo desde el portátil de quien reprodujo el fallo, desde la máquina de un cliente o desde una ejecución de CI. Cada petición se convierte en un mock con la respuesta que hubo aquel día.

Qué se importa y qué no:

Las reglas nacen apagadas y dentro de un grupo con el nombre del host, para que puedas encender las que quieras —o borrarlas todas juntas— sin que la aplicación se ponga a contestar una sesión de ayer en cuanto acabas de importar.

Un HAR lleva credenciales dentro. Cookies de sesión, cabeceras Authorization y tokens dentro del JSON de respuesta viajan tal cual, y las reglas importadas los conservan — tienen que conservarlos, o el mock no serviría. Al importar se te dice cuántas reglas los llevan y de qué tipo son. Tenlo presente antes de exportar tu pack y compartirlo: ahí sí hay un saneador, y es el que hay que marcar (qué cubre y qué no).

Traer un perfil de ModHeader

ModHeader salió de las tiendas de Chrome y de Edge en julio de 2026, y mucha gente se quedó con sus perfiles exportados y sin nada que los leyera. Ese fichero entra por el mismo botón Importar y se reconoce solo: cada perfil se convierte en una regla Modificar headers, que es el tipo que cubre su caso central entero. Se acepta tanto el array de perfiles que escribe su exportador como un perfil suelto, porque su propio importador aceptaba las dos formas.

Qué se convierte en qué

Las entradas que en ModHeader estuvieran desactivadas no se traen apagadas: para su propio motor una cabecera sin marcar no existía, así que traerla habría sido inventar una regla que allí no estaba.

Todo llega desactivado, y aquí importa más que en el resto

ModHeader aplicaba un perfil a la vez —el seleccionado, más los que tuvieras en always on—. Encender de golpe todo lo importado montaría a la vez combinaciones de cabeceras que nunca tuviste juntas; y un perfil que no filtraba por URL se convierte en una regla que casa con todo. Las dos cosas son exactamente "romper el sitio que estás depurando". Los perfiles que estaban en always on se señalan al importar como los primeros candidatos a encender, que es la información que separa "esto lo quiero activo ya" del resto del lote.

Qué no se convierte, y por qué

Todo lo de abajo se cuenta al importar, perfil a perfil y con su motivo:

Un perfil del que no se pueda convertir nada —porque solo llevaba cosas de esa lista— no produce ninguna regla, y también se dice.

Al importar no se sanea nada, al revés que al exportar: un fichero exportado se comparte, pero uno importado son tus propios datos volviendo a tu máquina. Redactar aquí un Authorization no protegería a nadie y dejaría una regla que no funciona, sin ningún sitio de donde recuperar el valor.

Qué cubre (y qué no) "sanitizar al exportar"

Exportar escribe tus reglas y grupos en un fichero JSON, junto con tus variables y entornos. Exportarlo todo incluye todas las variables que tengas; exportar una selección de reglas incluye solo las variables que esas reglas referencian por nombre, y poda cada entorno a ese mismo conjunto. Cuál es el entorno activo es una preferencia local tuya y nunca va en el fichero.

Como ese fichero acaba compartiéndose, la exportación pasa antes por un diálogo. Ahí se enumera lo que ha encontrado con pinta de credencial, y se marca por ti Sustituir credenciales por __REDACTED__ cuando hay algo que ocultar. Sanear busca nombres que sugieran una credencial — cualquiera que contenga auth, token, secret, password, passwd, apikey, api_key, api-key, credential, signature, cookie o session — y sustituye el valor correspondiente por __REDACTED__. Revisa:

Deliberadamente no toca:

Trata "sanitizar al exportar" como una red de seguridad contra la fuga accidental más común, no como una garantía de que el fichero exportado no contiene ningún secreto — revisa lo que vas a compartir antes de enviarlo.

A la vuelta, Importar te deja elegir qué traer y avisa cuando una regla ya existe (mismo tipo, método y patrón), ofreciéndote importarla como copia, omitirla o sobrescribir la existente — con la misma elección, por separado, para las variables cuyo valor difiera del tuyo. Es el mismo camino que recorren una spec, una colección de Postman y un perfil de ModHeader, que por eso no tienen un mecanismo de importación aparte.