Cada regla tiene exactamente un tipo, que decide qué ocurre cuando coincide con una petición:
| Tipo | Qué hace | Cuándo usarlo |
|---|---|---|
| Mock de 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 | La petición sale de verdad, pero con un body distinto al que envió la página. | Probar cómo reacciona el backend a un payload que la interfaz normalmente no enviaría. |
| Modificar headers | Añade, sobrescribe o quita headers de petición y/o respuesta. La petición sale de verdad. | Forzar un header de feature flag, probar un header CORS que falta o sobra, simular un header de auth en local. |
| Redirigir | 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 | 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. |
| Modificar query params | Añade o quita parámetros de la query string. La petición sale de verdad. | Forzar un parámetro que la interfaz no expone (un flag de debug, un tamaño de página). |
| Reemplazar en la URL | Sustituye parte de la URL con una expresión regular, manteniendo el resto igual. La petición sale de verdad. | Cambiar staging por production en una URL sin montar una redirección completa. |
| Retrasar | Retiene la petición real un número fijo de milisegundos antes de dejarla pasar. | Comprobar que tus estados de carga y spinners aparecen de verdad. |
| Body de la respuesta | La petición sale de verdad; al body de la respuesta real se le aplica un buscar/reemplazar o se le sobrescribe un campo JSON concreto antes de que tu código lo vea. | Cambiar un campo de una respuesta real de la API (p. ej. un status) sin escribir un mock completo a mano. |
Es la confusión más habitual, así que merece explicarse aparte:
Response
falso (o simula las propiedades del XHR) y lo devuelve directamente. El servidor real nunca llega a verla.
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.
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, o el texto de reemplazo de una
regla "Reemplazar en la URL".
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.
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.
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 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.
Revisa esto en orden — cubre todos los motivos por los que una regla puede fallar en silencio:
send(body) — esto solo funciona para los tipos
"mock", "cancelar", "retrasar", "modificar body" 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.
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).
Net Tinker funciona parcheando fetch/XMLHttpRequest dentro del propio JavaScript
de la página. Ese enfoque trae algunos efectos secundarios inevitables:
interceptor.js en todas las
peticiones mientras haya alguna regla activa en la página, porque todas las peticiones pasan por el
fetch/XMLHttpRequest parcheado de Net Tinker antes de llegar (o no) a la red.
No afecta al funcionamiento, solo a la atribución. Si te molesta, añade interceptor.js a la
Ignore List de DevTools (Settings → Ignore List) — así DevTools ignora esos frames al calcular el
iniciador.
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.
curl o como fragmento fetch(), listo para pegar en una terminal o en la
consola.
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.
Al exportar reglas para compartir una configuración, la opción "sanitizar" revisa nombres de headers,
nombres de parámetros de query y nombres de campos del body JSON (de forma recursiva) buscando algo que
parezca una credencial — nombres que contengan palabras como auth,
token, secret, password, apikey,
credential, signature, cookie o session — y sustituye
su valor por __REDACTED__.
Deliberadamente no toca:
value o data no se detectaría, porque la comprobación se basa en el
nombre, no en el contenido.
"true"/"false", aunque estén bajo un nombre que
parezca sensible — access-control-allow-credentials: true no es un secreto, es un flag CORS
fijo, y redactarlo solo produciría una regla rota.
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.