Passer au contenu principal

Endpoint

POST /api/v1/messages/schedule

Important — comment obtenir instanceId

instanceId est l’identifiant technique requis pour planifier un message. Pour l’obtenir :
  1. appeler GET /api/v1/instances
  2. choisir l’instance souhaitée
  3. récupérer data[n].id
  4. utiliser cette valeur dans instanceId
Ne pas envoyer :
  • name
  • waNumber

Body

ChampTypeRequisDescription
instanceIdUUIDouiIdentifiant technique de l’instance MsgFlash, obtenu via GET /api/v1/instances
tostringouiNuméro E.164
scheduledAtISO 8601ouiDate/heure d’envoi
typeenumoui si pas de templateIdtext, image, video, audio, document, voice_note, location, contact, buttons
templateIdUUIDoui si pas de typeTemplate à rendre
variablesobjectnonValeurs custom.*
Les autres champs suivent les mêmes règles que /messages/send, y compris les champs spécifiques aux boutons (title, description, footer, buttons).

Exemple de requête

curl -X POST https://srv.msgflash.com/api/v1/messages/schedule \
  -H "x-api-key: msgf_live_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "instanceId": "INSTANCE_UUID",
    "to": "+33612345678",
    "type": "text",
    "text": "Bonjour dans 30 minutes",
    "scheduledAt": "2026-04-02T08:00:00.000Z"
  }'

Exemple avec boutons

curl -X POST https://srv.msgflash.com/api/v1/messages/schedule \
  -H "x-api-key: msgf_live_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "instanceId": "INSTANCE_UUID",
    "to": "+33612345678",
    "type": "buttons",
    "title": "Rappel programmé",
    "description": "Votre rendez-vous est dans 30 minutes",
    "scheduledAt": "2026-04-02T08:00:00.000Z",
    "buttons": [
      {
        "type": "reply",
        "displayText": "Confirmer",
        "id": "confirm_appointment"
      }
    ]
  }'

Réponse succès 201

{
  "data": {
    "id": "msg_uuid",
    "userId": "user_uuid",
    "instanceId": "inst_uuid",
    "contactId": null,
    "campaignId": null,
    "direction": "outbound",
    "type": "text",
    "from": null,
    "to": "+33612345678",
    "body": "Bonjour dans 30 minutes",
    "mediaUrl": null,
    "status": "queued",
    "error": null,
    "providerMessageId": null,
    "warnings": [
      "This instance is still in the warmup phase."
    ],
    "safety": {
      "decision": "warn",
      "riskLevel": "medium",
      "state": "warming",
      "score": 56
    },
    "createdAt": "2026-04-02T07:30:00.000Z",
    "updatedAt": "2026-04-02T07:30:00.000Z"
  }
}
Les warnings safety sont informatifs. En V1, ils ne bloquent pas les messages planifiés.

Erreurs courantes

HTTPCodeQuand
400VALIDATION_ERRORBody invalide
400TEMPLATE_INVALIDTemplate invalide
404NOT_FOUNDInstance, contact ou template introuvable
429MONTHLY_OUTBOUND_QUOTA_EXCEEDEDQuota déjà épuisé