> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dexnotify.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Envoyer un push

> Une notification transactionnelle à un utilisateur ou à des appareils.

```bash theme={null}
curl -X POST https://api.dexnotify.com/api/v1/notifications \
  -H "x-api-key: $DEXNOTIFY_CLE" -H "content-type: application/json" \
  -H "Idempotency-Key: transfert-8812-recu" \
  -d '{
    "applicationId": "6740…",
    "target": { "externalUserId": "client-48213" },
    "content": {
      "title": "Transfert reçu",
      "body": "Awa vous a envoyé 25 000 FCFA.",
      "deeplink": "monapp://transferts/8812",
      "data": { "transfertId": "8812" }
    }
  }'
```

Portée : `notification:send`. La réponse arrive dès la mise en file, sans attendre Apple ou Google.

## La cible

`target` porte **l’une** de ces formes :

| Champ | Vise |
| - | - |
| `externalUserId` | tous les appareils abonnés de cet utilisateur |
| `deviceIds` | des abonnements précis, par leur identifiant DexNotify |
| `tokens` | des jetons push bruts |

## Le contenu

| Champ | Description |
| - | - |
| `content.title`, `content.body` | titre (120 caractères) et texte (1 000) |
| `content.subtitle` | sous-titre (iOS) |
| `content.imageUrl` | image riche |
| `content.deeplink` | lien ouvert dans l’app au toucher ; le SDK l’ouvre seul |
| `content.webUrl` | lien web |
| `content.data` | données libres, remises à l’app |
| `templateId`, `variables`, `locale` | un [modèle push](#modeles) et ses variables, au lieu de `content` |

## Les options

| Champ | Description |
| - | - |
| `priority` | `normal` ou `high` (réveille l’appareil ; à réserver à l’urgent) |
| `ttlSeconds` | durée pendant laquelle l’envoi peut encore être remis |
| `scheduledAt` | date d’envoi, au lieu de maintenant |
| `push.collapseId` | une notification remplace la précédente de même identifiant |
| `push.ios` | `sound`, `badgeCount`, `interruptionLevel` (`passive`, `active`, `time-sensitive`), `threadId`, `relevanceScore` |
| `push.android` | `channelId`, `sound`, `color`, `smallIcon` |
| `push.web` | `icon`, `requireInteraction` |
| `name`, `labels` | pour retrouver l’envoi dans le journal |

## Tester

* `POST /api/v1/notifications/test` : vers un appareil ou un jeton, en priorité immédiate.
* `POST /api/v1/notifications/test-devices` : vers les appareils marqués « test » (10 au plus). Marquez un appareil par `PATCH /api/v1/audience/devices/{id}` ou depuis sa fiche dans le dashboard.

## Suivre

| Route | Rend |
| - | - |
| `GET /api/v1/notifications/{id}` | l’envoi et ses compteurs |
| `GET /api/v1/notifications/{id}/deliveries` | chaque appareil et son résultat |
| `GET /api/v1/messages/{id}` | le rapport : livraisons, ouvertures, clics par plateforme |
| `GET /api/v1/messages/{id}/diagnostic` | la charge utile, les erreurs du fournisseur et la chronologie |

Les [webhooks](https://docs.dexnotify.com/webhooks.md) `notification.sent`, `notification.failed`, `notification.opened` et `notification.clicked` vous poussent ces faits. Un jeton mort produit `device.invalidated` : l’appareil n’est plus visé.

## Modèles

Un modèle push garde un contenu réutilisable, ses variables détectées, et se **publie** en versions figées : `POST /api/v1/templates`, puis `/publish`. Un envoi capture la version publiée : modifier le modèle ensuite ne change pas ce qui est parti.

## Campagnes push

Une campagne vise un **segment** (et en exclut d’autres) sur une ou plusieurs applications, avec un débit, un plafond de fréquence, un test A/B et un objectif de conversion. Elle se compose dans le dashboard (**Campagnes › Notifications push**) ou par `POST /api/v1/campaigns`, puis se lance par `/launch` ou se programme par `/schedule`. Portée `campaign:launch` pour lancer.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.