Naim Uniti — API HTTP
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.
- Retourne la version de l’API, le changestamp, la classe (
curl http://<IP>:15081/system- Infos complètes :
model,hostname,hardwareSerial,hardwareType,appVer(firmware),ipAddress,kernel,machine,udid,displayType,firstTimeSetupComplete.
- Infos complètes :
Alimentation
curl http://<IP>:15081/power- État actuel :
system(on/lona),state(on/standby),powerMode,serverMode,standbyTimeout.
- État actuel :
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, pasoffnistandby.
- Mettre en veille. La valeur est bien
Volume / Audio
curl http://<IP>:15081/levels/room- Retourne
volume(0-100),mute(0/1),balance(-50 à 50),headphoneDetect(0/1).
- Retourne
curl http://<IP>:15081/levels- Vue d’ensemble des niveaux audio (idem +
mode).
- Vue d’ensemble des niveaux audio (idem +
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/nowplayingMé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.
- Liste toutes les sources disponibles. Chaque entrée contient
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
| ID | Nom | Classe |
|---|---|---|
ana1 – ana4 | Analogique 1–4 | object.input.analogue |
dig1 – dig5 | Numérique 1–5 | object.input.digital |
hdmi | HDMI (ARC) | object.input.hdmi |
bluetooth | Bluetooth | object.input.bluetooth |
radio | Radio Internet | object.input.radio.internet |
spotify | Spotify Connect | object.input.spotify |
tidal | TIDAL | object.input.tidal |
qobuz | Qobuz | object.input.qobuz |
usb | USB | object.input.usb |
airplay | AirPlay | object.input.airplay |
gcast | Chromecast built-in | object.input.googlecast |
upnp | Serveurs UPnP | object.input.upnp |
playqueue | File de lecture | object.input.playqueue |
files | Fichiers locaux / Démo | object.input.files |
roon | Roon Ready | — |
multiroom | Multiroom | — |
Toutes les sources ne sont pas présentes sur tous les modèles. L’endpoint
/inputsretourne uniquement celles disponibles sur votre appareil.
Favoris / Presets
curl http://<IP>:15081/favourites- Liste tous les favoris. Chaque favori contient
name,ussi,available.
- Liste tous les favoris. Chaque favori contient
curl "http://<IP>:15081/favourites/3754de0b49624983ab2179ed8524e9a2?cmd=play"- Lancer un favori par son UUID (portion après
favourites/dans le champussi).
- Lancer un favori par son UUID (portion après
File de lecture
curl http://<IP>:15081/inputs/playqueue- Infos sur la file de lecture. Le champ
currentcontient le chemin vers la piste en cours (utilisable comme endpoint GET pour les métadonnées détaillées).
- Infos sur la file de lecture. Le champ
Réseau
curl http://<IP>:15081/network- Configuration réseau :
connectionState,current(network/wiredounetwork/wifi),dhcp,dns1,dns2,dnsName,gateway,hostname,ipAddress,macAddress,netmask,workgroup.
- Configuration réseau :
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
LOCATIONpointe vers le XML de description contenantmanufacturer,friendlyName,modelName,serialNumber,UDN.
- Recherche SSDP des MediaRenderers. L’en-tête
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> 4545Se 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
}
}