Primeros pasos con ApiCatcher

ApiCatcher captura, muestra y analiza el tráfico HTTP/HTTPS y WebSocket de una app en local.

Esta guía cubre el día a día: certificados, filtros, historial, exportación y documentación de API. Reescritura, scripts, reproducción combinada y el resto están en los documentos de abajo.

Más documentación:


Índice

  1. Certificados
  2. Filtros de tráfico
  3. Sesiones de captura y búsqueda
  4. Buscar Cookie
  5. Exportar HAR, archivos y una petición
  6. Documentación de API generada
  7. API Scan

1. Certificados

1.1 Instalar y confiar en el certificado CA (imprescindible para HTTPS)

Casi todo el tráfico de las apps va por HTTPS. Por defecto ApiCatcher no captura HTTPS: sin un CA de confianza no hay descifrado, así que no hay nada útil que mirar. Instala el CA y dale confianza completa antes de capturar HTTPS.

Dos formas de configurar el certificado:

  1. Usar el CA que genera ApiCatcher (lo habitual). Sigue los pasos de abajo.
  2. Importar el tuyo (certificado de empresa). Salta a 1.2.

CA por defecto:

  1. Toca Instalar certificado en la app. iOS abre Safari y descarga un perfil de configuración.
  2. Entra en Ajustes → General → VPN y gestión de dispositivos e instala el perfil de ApiCatcher.
  3. Luego Ajustes → General → Información → Ajustes de confianza de certificados, busca el certificado que empieza por ApiCatcher CA y activa la confianza completa.

Si algo falla

  • Timeouts o códigos de estado raros: casi siempre falta el paso 3.
  • Si borras y reinstalar la app, el perfil viejo ya no vale. Quítalo en Ajustes y vuelve a empezar.

1.2 Certificados de empresa

Algunas apps internas solo confían en la CA de la compañía.

  • Para qué: importar un .pem o .p12 de la organización y ligarlo a hosts internos (p. ej. *.corp.internal) para que el handshake TLS local cierre.
  • Ojo: importa o edita con la captura parada. Luego vuelve a arrancarla.

1.3 Certificado autofirmado

Sin CA de empresa y sin ganas de usar el de ApiCatcher, importa el tuyo por el mismo flujo de certificado de empresa. Ver CA personalizada.


2. Filtros de tráfico

El sistema y las apps en segundo plano meten mucho ruido. Los filtros deciden qué se guarda.

  • Lista de bloqueo: esos hosts no se registran. Lista de permiso vacía = se registra todo lo demás.
  • Lista de permiso: en cuanto hay una regla, solo se registran las peticiones que coinciden.
  • Comodín: * vale. *.example-api.com cubre los subdominios de prueba de ese host.

Si algo falla

  • No ves el tráfico: el host está en la lista de bloqueo, o la de permiso está activa y falta ese host.
  • Usa un asterisco simple (*.api.com). Aquí no hay expresiones regulares.

3. Sesiones de captura y búsqueda

Las listas deciden qué se almacena. Después, en Historial, Session y la búsqueda recortan lo ya capturado.

3.1 Sesión de captura

Una sesión es una pasada de captura VPN. La interfaz la etiqueta con la hora de inicio (yyyy-MM-dd HH:mm:ss). No se puede renombrar.

Arrancar la captura VPN crea una sesión. Al parar se escribe la hora de fin y el recuento. Cero peticiones = se borra la sesión. Mientras captura, el fin muestra Capturing....

El filtro Session del historial fija una pasada o muestra Todas. El selector también enseña el rango, la duración, el recuento y hasta cinco hosts vistos. Borrar una sesión elimina sus registros.

3.2 Filtros

La barra de filtros del historial se configura. Configurar filtros elige qué chips se ven; Restablecer filtros los limpia.

FiltroCoincide
SessionUna pasada, o todas
HostHost exacto
App (UA)Nombre de app sacado del User-Agent, exacto
MétodoGET / POST / PUT / DELETE / PATCH / OPTIONS / HEAD
EsquemaHTTP / HTTPS / WS / WSS
TipoTodos, HTML, JSON, XML, imagen, vídeo, audio, Protobuf (Content-Type)
Estado1xx–5xx, más Sin respuesta
TiempoÚltimos 15 minutos, última hora, hoy, últimos 7 días, últimos 30 días, rango propio

3.3 Búsqueda por palabra

El campo busca en URL por defecto (placeholder: Search url...). Subcadena sin distinguir mayúsculas. Ni regex ni AND / OR.

Cambia el destino desde Historial … → Cambiar destino de búsqueda:

DestinoDónde mira
URLURL de la petición
Cabeceras de peticiónNombres o valores
Cabeceras de respuestaNombres o valores
Body de peticiónTexto del cuerpo
Body de respuestaTexto del cuerpo

La búsqueda en el body solo lee Content-Type de texto (HTML / XML / JSON / texto plano / form-urlencoded / form-data). Imagen, vídeo y demás binarios se saltan.


4. Buscar Cookie

Buscar Cookie saca el header Cookie de la última petición a un host. No mira Set-Cookie ni junta cookies de varias peticiones.

  1. Abre Historial.
  2. Arriba a la derecha … → Buscar Cookie.
  3. Escribe un Host (obligatorio; de la lista ya capturada o a mano).
  4. Session es opcional. Vacío = todas las sesiones.
  5. Toca Buscar Cookie.

Si hay: Cookie reciente y los pares. Si no: No hay petición con Cookie.


5. Exportar HAR, archivos y una petición

5.1 Exportar como HAR

HAR 1.2 JSON, se abre en Charles, Fiddler, Burp, etc. El nombre parece apicatcher-export-yyyyMMddHHmmss.har.

EntradaQué saleSigue los filtros actuales
Historial Exportar como HARTodas las peticiones del resultado filtrado (no solo la página visible)Sí (Session, Host, tiempo, método, tipo, estado, palabra de búsqueda — igual que la lista)
Multiselección y luego compartir / exportarSolo las marcadasNo
Carpeta de favoritos → HARPeticiones de esa carpetaNo

La UI dice: Total requests to export: N. You can modify filters to change the requests to export. No cierres la página mientras exporta.

5.2 Imagen / vídeo / audio

Entrada: gestión de archivos en Historial (icono de carpeta).

  • Tres grupos: Imagen, Vídeo, Audio.
  • Recorta por Session y Host.
  • Los trozos Range / Content-Range se unen antes de exportar.
  • Un archivo suelto, o un ZIP agrupado por host.

En el detalle de la petición también puedes Exportar archivo sobre el body de petición o respuesta; el tipo sigue el Content-Type.

5.3 Una sola petición

En el detalle, Exportar petición:

  • Raw: HTTP original petición + respuesta (.txt)
  • cURL: comando para repetir en terminal (.sh)
  • Markdown: vista previa Markdown (.md)

6. Documentación de API generada

Cuando entra una petición HTTP/HTTPS que cumple las reglas, la app crea o actualiza la doc en local, agrupada por Host. Si el mismo endpoint vuelve, solo se añaden campos que aún no estaban; los nombres ya guardados no se pisan.

6.1 Qué se documenta

Solo HTTP/HTTPS con respuesta y estado fuera de 301–308. Content-Type de petición JSON / XML / multipart/form-data / x-www-form-urlencoded, o respuesta JSON / XML. Imagen, vídeo, HTML y texto plano se saltan.

Las peticiones tocadas por una regla de reescritura o un script no entran. La clave es método + host + path (p. ej. GET + api.example.com + /v1/user).

Fusión:

  • Query, Header, Body: solo añadir nombres que falten.
  • Ejemplo de body: se actualiza solo si esta respuesta es 200.
  • Cabeceras estándar habituales (Cookie, User-Agent) no van a parámetros. Authorization, Content-Type y las custom sí.

6.2 Exportar a Postman / Apifox / Bruno

Dónde empezar:

  • Exportar desde la lista de API de un Host (todos los endpoints de ese host).
  • Exportar desde el detalle de una API (solo ese endpoint).
  • Ajustes → API favoritas → Exportar solo para favoritos.
DestinoCómo
Exportar a PostmanAPI Key de Postman → cargar un Workspace → crear una Collection o elegir una
Exportar a ApifoxAPI Key de Apifox e ID de proyecto; ID de carpeta opcional (vacío = raíz)
Exportar a BrunoZIP con bruno.json y .bru; Open Collection en Bruno

Capturas paso a paso:


7. API Scan

API Scan revisa el tráfico ya capturado: calidad, fugas evidentes, latencia. El análisis se queda en el dispositivo.

7.1 Motores incluidos

  • Datos sensibles: teléfono, documento de identidad, correo y credenciales cloud (clave AWS, clave OpenAI) en claro.
  • Stacks: trazas Java, Python o SQL que se colaron en un body de respuesta.
  • Llamadas demasiado frecuentes: intervalo medio por debajo del umbral que pongas — suele ser un bucle o un retry mal puesto.
  • Latencia: p95 / p99 por endpoint.

7.2 Custom Scan

Un script JS para tus reglas.

  • null si la petición está bien. Si no, una nota corta (≤200 caracteres): body enorme, falta un header de seguridad, … Esa nota entra en el informe.

Si algo falla

  • Sin resultados: ¿el alcance (Host / Session) tiene JSON/API de verdad, o solo estáticos? Cada pasada tiene un tope de registros.