Documentation de l'API
Dernière mise à jour : mai 2026 — Par Laurent X. Dubois, fondateur de LXD Corp
Zling vous permet de recevoir des notifications push sur votre iPhone via un simple appel HTTP. Les URL complètes de vos webhooks sont uniques et disponibles directement au sein de l'application iOS Zling.
Fonctionnement de vos webhooks
Dans l'application Zling, vous trouverez deux types de webhooks :
- Webhook partagé (
br_usr_...) : envoie la notification vers tous vos appareils en une seule fois. - Webhook appareil (
br_dev_...) : cible un seul appareil spécifique.
Le domaine de votre webhook ressemble à ceci :
https://<votre-projet>.convex.site/v1/br_usr_abc123def456ghi789⚠️ Attention : toute personne possédant ce lien complet peut vous envoyer des notifications. Gardez vos secrets privés. En cas de fuite, vous pouvez facilement révoquer et générer de nouveaux secrets dans l'onglet « Paramètres » ou en cliquant sur « Rotation » dans l'application.
Envoyer une notification push (Texte brut)
La méthode la plus rapide est d'effectuer une requête POST avec du texte brut (text/plain). Ce texte sera assigné comme message principal de l'alerte.
Exemple avec cURL
curl -X POST https://<votre-projet>.convex.site/v1/br_usr_abc123def456ghi789 \
-H "Content-Type: text/plain" \
-d 'Déploiement terminé avec succès ! 🚀'Vous pouvez également déclencher une notification via une simple requête GET, pratique pour tester l'alerte manuellement depuis un navigateur. Passez le contenu via les paramètres message et title :
https://<votre-projet>.convex.site/v1/br_usr_abc123def456ghi789?message=Test%20rapide%20!&title=SalutPersonnalisation avancée avec JSON
Pour davantage de flexibilité (titres, images, liens, priorités), envoyez un payload formaté en JSON (application/json).
Exemple cURL
curl -X POST https://<votre-projet>.convex.site/v1/br_usr_abc123def456ghi789 \
-H 'Content-Type: application/json' \
-d '{
"title": "Alerte de surveillance",
"subtitle": "Serveur de production",
"message": "L\'utilisation du CPU a dépassé les 90%.",
"thread_id": "monitoring-alerts",
"interruption_level": "time-sensitive",
"open_url": "https://dashboard.mon-app.com"
}'Liste complète des paramètres
Tous les paramètres sont optionnels. L'idéal est de toujours renseigner un message.
| Paramètre | Type | Description |
|---|---|---|
| title | string | Titre principal de la notification. |
| subtitle | string | Sous-titre affiché sous le titre (iOS uniquement). |
| message | string | Corps textuel principal. Tronqué à 2 000 caractères côté serveur. |
| thread_id | string | Identifiant de groupage. Permet d'empiler plusieurs notifications similaires dans une seule pile sur l'écran de verrouillage iOS. |
| open_url | string | URL (https://…) ou deep link (myapp://…) ouvert au tap sur la notification. |
| image_url | string | URL d'une image affichée en pièce jointe dans la notification. |
| expiration_date | date ISO 8601 | Date de péremption (ex: 2026-04-23T09:00:00.000Z). La notification sera ignorée par APNs si l'appareil n'a pas eu de réseau avant cette date. |
| filter_criteria | string | Clé de dérogation pour les Modes de Concentration (Focus) iOS. |
| interruption_level | string | Comportement d'interruption. Valeurs acceptées : passive, active, time-sensitive. |
Niveaux d'interruption (interruption_level)
| Valeur | Comportement |
|---|---|
| passive | Ajouté silencieusement au centre de notifications, sans son ni allumage d'écran. |
| active | Allume l'écran et produit une vibration/son standard (comportement par défaut). |
| time-sensitive | Traverse les résumés planifiés et certains blocages de concentration. |
Note : le niveaucriticaln'est pas supporté par Zling. Il nécessite une autorisation spéciale Apple réservée aux applications médicales, de sécurité domestique ou de sécurité nationale. Si vous envoyez"critical", l'API retournera une erreur400avec la liste des valeurs autorisées.
Limites et codes d'erreur
| Règle | Valeur | HTTP |
|---|---|---|
| Taille maximale du payload HTTP | 10 Ko | 413 Payload Too Large |
Troncature du champ message | 2 000 caractères | (silencieux) |
interruption_level invalide | passive, active, time-sensitive uniquement | 400 Bad Request |
| Rate limiting par webhook | 5 requêtes / minute | 429 Too Many Requests |
| Limite gratuite (free) | 10 notifications / mois | 402 Payment Required |
| Secret invalide ou manquant | — | 401 Unauthorized |
Passer le secret de façon sécurisée
Exposer un secret directement dans l'URL n'est pas idéal (certains proxy ou services tiers loguent les URL complètes). Il est préférable d'utiliser l'endpoint racine /v1/send avec le header Authorization :
Exemple via header Authorization
curl -X POST https://<votre-projet>.convex.site/v1/send \
-H 'Authorization: Bearer br_usr_abc123def456ghi789' \
-H 'Content-Type: application/json' \
-d '{"message": "Envoi sécurisé via Bearer token !"}'Cette méthode fonctionne également en GET :
curl -G https://<votre-projet>.convex.site/v1/send \
-H 'Authorization: Bearer br_usr_abc123def456ghi789' \
--data-urlencode 'message=Test rapide' \
--data-urlencode 'title=Salut'Endpoints disponibles
| Méthode | URL | Secret fourni via |
|---|---|---|
| POST | /v1/<secret> | Dans l'URL |
| GET | /v1/<secret> | Dans l'URL |
| POST | /v1/send | Header Authorization: Bearer <secret> |
| GET | /v1/send | Header Authorization: Bearer <secret> |