POST /v1/actions/trigger-sequence

Démarre une séquence publiée pour un contact. Renvoie l'id de session de la séquence, ou `already_running` si le contact y est déjà inscrit.

Inscrit un contact dans une séquence publiée. Les séquences sont des campagnes multi-étapes étalées dans le temps — typiquement une série de bienvenue ou de drip avec des délais entre les étapes.

Si le contact a déjà une session running pour cette séquence, l'endpoint renvoie 200 avec status: "already_running" et n'en démarre pas une seconde. L'appel est ainsi sûr à réessayer.

POST /api/v1/actions/trigger-sequence

Corps de la requête

Champ Type Requis Notes
sequence_id UUID oui Doit être une séquence publiée (published_at non null)
contact_id UUID l'un des deux Recherche d'un contact existant
phone string l'un des deux Recherche ou création du contact (upsert automatique avec opted_in_at: now)
context object non Sac libre clé/valeur passé à chaque nœud de la séquence
curl -X POST https://www.qyvo.io/api/v1/actions/trigger-sequence \
  -H "Authorization: Bearer YOUR_TOKEN_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "sequence_id": "01J3S...",
    "phone": "+14155550123",
    "context": { "order_id": "ORD-1042", "first_name": "Romain" }
  }'
const session = await fetch('https://www.qyvo.io/api/v1/actions/trigger-sequence', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.QYVO_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    sequence_id: '01J3S...',
    phone: '+14155550123',
    context: { order_id: 'ORD-1042', first_name: 'Romain' },
  }),
}).then((r) => r.json());
$session = Http::withToken(env('QYVO_TOKEN'))
    ->post('https://www.qyvo.io/api/v1/actions/trigger-sequence', [
        'sequence_id' => '01J3S...',
        'phone' => '+14155550123',
        'context' => ['order_id' => 'ORD-1042', 'first_name' => 'Romain'],
    ])
    ->json();
import os, httpx
session = httpx.post(
    'https://www.qyvo.io/api/v1/actions/trigger-sequence',
    headers={'Authorization': f"Bearer {os.environ['QYVO_TOKEN']}"},
    json={
        'sequence_id': '01J3S...',
        'phone': '+14155550123',
        'context': {'order_id': 'ORD-1042', 'first_name': 'Romain'},
    },
).json()

Réponse — 201 Created

{
  "id": "01J5B...",
  "status": "started",
  "sequence_id": "01J3S...",
  "sequence_name": "Welcome 7-day",
  "contact_id": "01J1Y..."
}

Si le contact est déjà dans la séquence :

{
  "id": "01J5B...",
  "status": "already_running",
  "message": "Contact is already in this sequence"
}

Erreurs

Statut Cause
404 Sequence not found or not published — publiez-la d'abord dans le tableau de bord
404 Contact not found (uniquement lors d'une recherche par contact_id)
422 Sequence has no entry node — le graphe de la séquence est vide ; éditez-le dans le tableau de bord
422 Ni contact_id ni phone fourni

Utilisation du context

Tout ce que vous passez dans context est disponible pour les nœuds de message template dans la séquence sous la forme {{context.first_name}}, {{context.order_id}}, etc. Utile pour personnaliser la campagne avec des données de commande ou de produit.