Il n’existe aucune documentation officielle de Naim Audio pour cette API. Tout a été reverse-engineered depuis le trafic réseau de l’app Naim et confirmé par des intégrations open-source (Home Assistant, Homebridge, Unfolded Circle, etc.).

Connexion

  • Port HTTP : 15081
  • Port TCP streaming : 4545 (push JSON temps réel, pas HTTP)
  • Pas d’authentification (réseau local uniquement)
  • URL de base : http://<IP>:15081
  • Hostname mDNS : <modèle>-<serial>.local
http://192.168.1.42:15081

Informations système

  • curl http://<IP>:15081/
    
    • Retourne la version de l’API, le changestamp, la classe (object.api.support), la charge CPU.
  • curl http://<IP>:15081/system
    
    • Infos complètes : model, hostname, hardwareSerial, hardwareType, appVer (firmware), ipAddress, kernel, machine, udid, displayType, firstTimeSetupComplete.

Alimentation

  • curl http://<IP>:15081/power
    
    • État actuel : system (on / lona), state (on / standby), powerMode, serverMode, standbyTimeout.
  • curl -X PUT "http://<IP>:15081/power?system=on"
    
    • Allumer l’appareil.
  • curl -X PUT "http://<IP>:15081/power?system=lona"
    
    • Mettre en veille. La valeur est bien lona, pas off ni standby.

Volume / Audio

  • curl http://<IP>:15081/levels/room
    
    • Retourne volume (0-100), mute (0/1), balance (-50 à 50), headphoneDetect (0/1).
  • curl http://<IP>:15081/levels
    
    • Vue d’ensemble des niveaux audio (idem + mode).
  • curl -X PUT "http://<IP>:15081/levels/room?volume=45"
    
    • Régler le volume (entier, 0 à 100).
  • curl -X PUT "http://<IP>:15081/levels/room?mute=1"
    
    • Couper le son.
  • curl -X PUT "http://<IP>:15081/levels/room?mute=0"
    
    • Rétablir le son.
  • curl -X PUT "http://<IP>:15081/levels/room?balance=-20"
    
    • Régler la balance (-50 = tout à gauche, 50 = tout à droite).

Lecture / Transport

  • curl http://<IP>:15081/nowplaying
    
    • Métadonnées complètes : transportState, title, artist, album, artwork, codec, bitDepth, bitRate, sampleRate, channels, duration, transportPosition, repeat, shuffle, source, station, genre, live.

    • transportState : 0 = arrêté, 1 = en pause, 2 = en lecture, 3 = buffering.

  • curl "http://<IP>:15081/nowplaying?cmd=play"
    
    • Lecture.
  • curl "http://<IP>:15081/nowplaying?cmd=pause"
    
    • Pause.
  • curl "http://<IP>:15081/nowplaying?cmd=playpause"
    
    • Basculer lecture/pause.
  • curl "http://<IP>:15081/nowplaying?cmd=stop"
    
    • Arrêt.
  • curl "http://<IP>:15081/nowplaying?cmd=next"
    
    • Piste suivante.
  • curl "http://<IP>:15081/nowplaying?cmd=prev"
    
    • Piste précédente.
  • curl "http://<IP>:15081/nowplaying?cmd=seek&position=120000"
    
    • Seek à la position donnée (en millisecondes, ici 2 min).
  • curl -X PUT "http://<IP>:15081/nowplaying?repeat=0"
    
    • Répétition désactivée.
  • curl -X PUT "http://<IP>:15081/nowplaying?repeat=1"
    
    • Répéter la piste en cours.
  • curl -X PUT "http://<IP>:15081/nowplaying?repeat=2"
    
    • Répéter toute la file.
  • curl -X PUT "http://<IP>:15081/nowplaying?shuffle=1"
    
    • Activer la lecture aléatoire.
  • curl -X PUT "http://<IP>:15081/nowplaying?shuffle=0"
    
    • Désactiver la lecture aléatoire.

Sources / Entrées

  • curl http://<IP>:15081/inputs
    
    • Liste toutes les sources disponibles. Chaque entrée contient name, ussi, class, alias, disabled, selectable, multiroomMaster.
  • curl http://<IP>:15081/inputs/spotify
    
    • Infos sur une source spécifique.
  • curl "http://<IP>:15081/inputs/spotify?cmd=select"
    
    • Basculer sur cette source.
  • curl "http://<IP>:15081/inputs/radio?cmd=play"
    
    • Sélectionner et lancer la lecture d’une source streaming.

Identifiants de source connus

IDNomClasse
ana1ana4Analogique 1–4object.input.analogue
dig1dig5Numérique 1–5object.input.digital
hdmiHDMI (ARC)object.input.hdmi
bluetoothBluetoothobject.input.bluetooth
radioRadio Internetobject.input.radio.internet
spotifySpotify Connectobject.input.spotify
tidalTIDALobject.input.tidal
qobuzQobuzobject.input.qobuz
usbUSBobject.input.usb
airplayAirPlayobject.input.airplay
gcastChromecast built-inobject.input.googlecast
upnpServeurs UPnPobject.input.upnp
playqueueFile de lectureobject.input.playqueue
filesFichiers locaux / Démoobject.input.files
roonRoon Ready
multiroomMultiroom

Toutes les sources ne sont pas présentes sur tous les modèles. L’endpoint /inputs retourne uniquement celles disponibles sur votre appareil.

Favoris / Presets

  • curl http://<IP>:15081/favourites
    
    • Liste tous les favoris. Chaque favori contient name, ussi, available.
  • curl "http://<IP>:15081/favourites/3754de0b49624983ab2179ed8524e9a2?cmd=play"
    
    • Lancer un favori par son UUID (portion après favourites/ dans le champ ussi).

File de lecture

  • curl http://<IP>:15081/inputs/playqueue
    
    • Infos sur la file de lecture. Le champ current contient le chemin vers la piste en cours (utilisable comme endpoint GET pour les métadonnées détaillées).

Réseau

  • curl http://<IP>:15081/network
    
    • Configuration réseau : connectionState, current (network/wired ou network/wifi), dhcp, dns1, dns2, dnsName, gateway, hostname, ipAddress, macAddress, netmask, workgroup.

Découverte SSDP/UPnP

Les appareils Naim s’annoncent comme MediaRenderer UPnP. Pour les trouver sur le réseau :

  • gssdp-discover -t urn:schemas-upnp-org:device:MediaRenderer:2 --timeout=5
    
    • Recherche SSDP des MediaRenderers. L’en-tête LOCATION pointe vers le XML de description contenant manufacturer, friendlyName, modelName, serialNumber, UDN.

Socket TCP temps réel (port 4545)

Ce n’est pas du HTTP. C’est une connexion TCP brute qui pousse du JSON en continu.

  • nc <IP> 4545
    
    • Se connecter et recevoir les mises à jour en temps réel (état de lecture, métadonnées, position).

    • Valeurs de state : playing, paused, stopped.

Structure JSON poussée :

{
  "data": {
    "state": "playing",
    "trackRoles": {
      "title": "Nom de la piste",
      "icon": "https://url-artwork...",
      "mediaData": {
        "metaData": {
          "artist": "Artiste",
          "album": "Album"
        },
        "activeResource": {
          "bitsPerSample": "24",
          "sampleFrequency": "96000"
        }
      }
    },
    "mediaRoles": {
      "title": "Nom de la source",
      "mediaData": {
        "metaData": {
          "serviceID": "spotify"
        }
      }
    },
    "status": {
      "duration": 355000
    }
  },
  "playTime": {
    "i64_": 45000
  }
}