Utilisez HTTPS lorsqu’un appareil ne peut pas maintenir une connexion MQTT : appareils sur batterie qui se réveillent, envoient et se rendorment, ou réseaux qui bloquent MQTT. Les messages HTTP sont traités exactement comme les messages MQTT : les mêmes formes de charge utile, les mêmes règles de clés, les mêmes limites de débit, le même nombre mensuel de messages. Cette page répertorie chaque point de terminaison qu’un appareil peut appeler.
Bases
| Élément | Valeur |
|---|---|
| Adresse de base | L’adresse HTTPS telemetry de la carte Connection details de l’appareil : l’hôte d’appareils de la plateforme sur le port 443 |
| Connexion | Authorization: Bearer <device access token> |
| Type de contenu | application/json; charset=utf-8 |
| Taille du corps | Jusqu’à 64 KiB (la limite de charge utile du profil) |
| HTTP simple | Le port 80 fonctionne là où votre installation le propose, mais les commandes sont alors limitées (voir ci-dessous). Utilisez HTTPS. |
Le jeton ne figure jamais dans l’URL, sauf sur les profils qui activent Token in the URL (voir ci-dessous). Les certificats client ne sont pas utilisés avec l’API HTTP : les appareils qui se connectent avec X.509 utilisent MQTT. Tout chemin non listé ici répond 404.
Points de terminaison
| Méthode | Chemin | Identique à MQTT | Corps ou requête | Réponse |
|---|---|---|---|---|
| POST | /api/v1/telemetry | v1/telemetry | une charge utile de télémétrie | 200 |
| POST | /api/v1/attributes | v1/attributes | un objet d’attributs client | 200 |
| GET | /api/v1/rpc?timeout=20000 | v1/rpc/req/{id} | interrogation longue, jusqu’à 60 s | une commande {"id":n,"method":…,"params":…} |
| POST | /api/v1/rpc/{id} | v1/rpc/res/{id} | la réponse à la commande | 200 |
| POST | /api/v1/rpc | v1/rpc/up/req/{id} | {"method":…,"params":…} | la réponse du cloud |
| POST | /api/v1/provision | v1/provision/req | une demande de provisionnement, sans en-tête bearer | la réponse de provisionnement |
| POST | /api/v1/hello | v1/hello | la description de l’appareil | utilisé par le firmware des appareils sous licence |
Non disponible via HTTP : lecture des attributs (GET /api/v1/attributes), attente de changements d’attributs partagés, ouverture de la fenêtre de revendication et demande de firmware. Ces chemins répondent 404. Les appareils qui en ont besoin utilisent MQTT.
La télémétrie utilise les mêmes formes de charge utile que MQTT. Voir MQTT topics and payload reference. Un corps de POST /api/v1/telemetry qui n’est pas du JSON est stocké sous une seule clé raw (jusqu’à la taille raw du profil, 4 KB par défaut).
Détails des points de terminaison
POST/api/v1/telemetry
Envoyez la télémétrie. Utilisez n’importe quelle forme de charge utile : un objet plat, un objet avec ts et values, ou un tableau des deux. Envoyez Authorization: Bearer <device access token>. La réponse 200 n’arrive qu’après que le message est sûrement mis en file d’attente ; son corps est vide.
Corps de la requête application/json
{
"ts": 1759572000000,
"values": {
"temperature": 21.5,
"humidity": 40
}
}
Exemple curl
curl -X POST 'https://<your-host>/api/v1/telemetry' \
-H 'Content-Type: application/json' \
-d '{"ts":1759572000000,"values":{"temperature":21.5,"humidity":40}}'
Réponses
200OK
Pas de corps de réponse.
400Bad Request
{
"error": "invalid_payload"
}
401Unauthorized
Pas de corps de réponse.
413Payload Too Large
{
"error": "payload_too_large"
}
429Too Many Requests
{
"error": "rate_limited"
}
503Service Unavailable
Pas de corps de réponse.
POST/api/v1/attributes
Envoyez les attributs client. Seules les clés que vous envoyez sont modifiées.
Corps de la requête application/json
{
"current_fw_title": "boiler-fw",
"current_fw_version": "26.10.2",
"lan.ip": "192.168.1.1"
}
Exemple curl
curl -X POST 'https://<your-host>/api/v1/attributes' \
-H 'Content-Type: application/json' \
-d '{"current_fw_title":"boiler-fw","current_fw_version":"26.10.2","lan.ip":"192.168.1.1"}'
Réponses
200OK
Pas de corps de réponse.
400Bad Request
{
"error": "invalid_payload"
}
401Unauthorized
Pas de corps de réponse.
429Too Many Requests
{
"error": "rate_limited"
}
GET/api/v1/rpc?timeout=20000
Attendez la prochaine commande de cet appareil (interrogation longue, 60 secondes au maximum). Une seule interrogation par appareil peut être ouverte à la fois. Sur une connexion sans TLS, un profil qui n’autorise aucune commande sans TLS répond 403.
Exemple curl
curl -X GET 'https://<your-host>/api/v1/rpc?timeout=20000'
Réponses
200OK
{
"id": 42,
"method": "sys.ping",
"params": {
"host": "8.8.8.8",
"count": 3
}
}
403Forbidden
{
"error": "tls_required"
}
408Request Timeout
{
"error": "timeout"
}
409Conflict
{
"error": "poll_in_progress"
}
POST/api/v1/rpc/{id}
Répondez à la commande ayant cet id. Utilisez le même corps que sur MQTT v1/rpc/res/{id}.
Corps de la requête application/json
{
"ok": true,
"result": {
"sent": 3,
"received": 3,
"avg_ms": 18.2
}
}
Exemple curl
curl -X POST 'https://<your-host>/api/v1/rpc/{id}' \
-H 'Content-Type: application/json' \
-d '{"ok":true,"result":{"sent":3,"received":3,"avg_ms":18.2}}'
Réponses
200OK
Pas de corps de réponse.
413Payload Too Large
{
"error": "payload_too_large"
}
POST/api/v1/rpc
Envoyez une requête de l’appareil vers le cloud, avec method et params. Vos flux y répondent ; la réponse est le corps de la réponse. Si aucune réponse n’arrive dans les 10 secondes, l’appel répond 408. Un corps sans method répond 400.
Corps de la requête application/json
{
"method": "app.request",
"params": {}
}
Exemple curl
curl -X POST 'https://<your-host>/api/v1/rpc' \
-H 'Content-Type: application/json' \
-d '{"method":"app.request","params":{}}'
Réponses
200OK
Pas de corps de réponse.
400Bad Request
Pas de corps de réponse.
408Request Timeout
{
"error": "timeout"
}
POST/api/v1/provision
Enregistrez un appareil avec la clé et le secret de provisionnement de son profil. N’envoyez pas d’en-tête bearer. L’appel répond 200 avec la réponse de provisionnement ; un refus répond aussi 200, avec "status": "FAILURE" et la raison dans hermetry.error (par exemple {"status": "FAILURE", "hermetry": {"error": "rate_limited"}}). Voir Adding and claiming devices.
Corps de la requête application/json
{
"deviceName": "boiler-07",
"provisionDeviceKey": "pk_8f3b2c1e9d4a7b60",
"provisionDeviceSecret": "ps_1c9e7f2a4b6d8e03"
}
Exemple curl
curl -X POST 'https://<your-host>/api/v1/provision' \
-H 'Content-Type: application/json' \
-d '{"deviceName":"boiler-07","provisionDeviceKey":"pk_8f3b2c1e9d4a7b60","provisionDeviceSecret":"ps_1c9e7f2a4b6d8e03"}'
Réponses
200OK
{
"status": "SUCCESS",
"credentialsType": "ACCESS_TOKEN",
"credentialsValue": "aZ3…"
}
413Payload Too Large
{
"error": "payload_too_large"
}
503Service Unavailable
Pas de corps de réponse.
Exemples
Envoyez une mesure, horodatée par le serveur :
curl -X POST "https://<device host>/api/v1/telemetry" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"temperature": 21.5, "humidity": 40}'
Envoyez des mesures mises en mémoire tampon avec leurs propres heures (millisecondes depuis 1970, UTC) :
curl -X POST "https://<device host>/api/v1/telemetry" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '[{"ts":1759572000000,"values":{"temperature":21.5}},{"ts":1759572060000,"values":{"temperature":21.7}}]'
Attendez une commande et répondez-y :
curl -s "https://<device host>/api/v1/rpc?timeout=30000" -H "Authorization: Bearer <ACCESS_TOKEN>"
# → {"id": 42, "method": "sys.ping", "params": {...}}
curl -X POST "https://<device host>/api/v1/rpc/42" \
-H "Authorization: Bearer <ACCESS_TOKEN>" -H "Content-Type: application/json" \
-d '{"ok": true, "result": {"sent": 3, "received": 3}}'
Codes de statut
| Code | Signification |
|---|---|
| 200 | Accepté. Envoyé seulement après que le message est sûrement mis en file d’attente. |
| 400 | Charge utile invalide. |
| 401 | Jeton absent ou inconnu. |
| 403 | Appareil désactivé, organisation suspendue, adresse hors des réseaux autorisés par le profil, ou interrogation de commande en HTTP simple que le profil n’autorise pas (tls_required). |
| 404 | Chemin inconnu, ou jeton dans l’URL sur un profil sans Token in the URL. |
| 408 | Interrogation longue terminée sans données, ou requête de l’appareil sans réponse dans les 10 secondes. |
| 409 | Une autre interrogation de commande de cet appareil est déjà ouverte. |
| 413 | Corps trop volumineux. |
| 429 | Limite de débit, ou trop de requêtes ou d’échecs de connexion depuis votre adresse. Attendez le nombre de secondes indiqué dans Retry-After. |
| 503 | Surcharge. Attendez le nombre de secondes indiqué dans Retry-After. |
Statut en ligne des appareils HTTP
Les appareils HTTP ne maintiennent aucune connexion ; un profil avec Live connection ne les affiche donc jamais en ligne. Donnez aux appareils HTTP un profil avec Recent message (en ligne tant que le dernier message est plus récent que l’intervalle attendu multiplié par le facteur) ou Last seen only. Voir Connection status and activity.
Appareils incapables d’envoyer des en-têtes
Certains appareils ne peuvent pas définir un en-tête Authorization. Pour ceux-ci, activez Jeton dans l’URL dans l’onglet Transport & auth du profil. Les appareils peuvent alors utiliser :
POST /api/v1/{token}/telemetry
POST /api/v1/{token}/attributes
Avertissement
Un jeton placé dans une URL peut fuir via les journaux du proxy et l’historique du navigateur. Un profil avec cette option activée est réservé à HTTP : ses appareils ne peuvent pas se connecter via MQTT et ne reçoivent jamais de commandes. Donnez aux appareils capables d’envoyer des en-têtes un profil sans cette option.
Commandes via HTTP non chiffré
Une interrogation longue qui n’atteint pas Hermetry via TLS ne reçoit que les commandes listées dans le profil sous Commandes autorisées sans TLS. Toutes les autres commandes attendent une connexion TLS ou leur expiration. Si la liste est vide, une interrogation simple répond 403 tls_required.

