Skip to content

API local ​

El endpoint local escucha en 127.0.0.1:LOCAL_PORT (por defecto 3001). Corre en el mismo proceso que el endpoint público, pero hace bind solo en loopback — está destinado a la app del dueño, la CLI y las herramientas en la misma máquina (o alcanzado por un túnel como Tailscale o una VPN).

Aún sin autenticación

El endpoint local actualmente no tiene autenticación. El aislamiento depende enteramente del bind en 127.0.0.1. No hagas port-forward ni proxy inverso de este puerto hacia internet. La autenticación por challenge-response del dueño está planificada — consulta abajo.

URL base ​

http://127.0.0.1:3001

Rutas ​

El endpoint local expone las mismas rutas que la API pública, con una diferencia estructural: a qué base acceden.

RutaEndpoint públicoEndpoint local
GET /health—idéntica
POST /v1/devicesescribe raiznet_public.dbescribe raiznet_private.db
GET /v1/devices, GET /v1/devices/:idlee raiznet_public.dblee raiznet_private.db
GET /v1/devices/:id/telemetrylee raiznet_public.dblee raiznet_private.db
POST /v1/telemetrydestino de ingesta publicdestino de ingesta local

Esta asimetría es deliberada: registrar un dispositivo en el endpoint local lo crea como un dispositivo local en la base privada, invisible para el lado público.

Destino de la ingesta ​

POST /v1/telemetry en el endpoint local almacena las lecturas en raiznet_private.db cuando el publishTo del dispositivo es 0 (local_only) o 2 (both). Un dispositivo con publishTo: 1 (solo público) que postee aquí es validado y aceptado, pero no se almacena nada.

Un dispositivo both envía peticiones separadas a cada endpoint — una al público, una al local — cada una armada según las disposiciones de campo de ese destino.

Acceso remoto ​

Para leer datos locales desde fuera de la LAN, usa una red overlay privada (Tailscale, WireGuard) para alcanzar 127.0.0.1:3001 en el servidor — o marca los campos como encrypted para la red pública y descífralos en tu app (consulta Modelo de privacidad).


Planificado: autenticación del dueño ​

La autenticación por challenge-response con la clave de Usuario del dueño está diseñada pero aún no implementada:

  1. El cliente llama a GET /v1/auth/challenge → recibe 32 bytes aleatorios.
  2. El cliente firma el desafío con la clave secreta de Usuario.
  3. El cliente envía la firma a POST /v1/auth/verify → recibe un token de sesión.

Planificado: vista combinada ​

El endpoint local eventualmente fusionará raiznet_public.db + raiznet_private.db por (device_pubkey, seq), para que el dueño vea una serie continua por dispositivo, con los campos cifrados devueltos como cipher + nonce para descifrado local. Hoy, cada endpoint devuelve solo su propia base.