Authentification
Trois schémas acceptés (le serveur essaie dans cet ordre) :x-engine-secret: <secret>— secret partagé interne (workers Actero uniquement).x-internal-secret: <secret>— alias historique du précédent.Authorization: Bearer <token>— JWT Supabase ou clé APIak_…/mcp_….
Headers
Body
string
required
ULID du tenant Actero qui possède l’événement. Visible dans le dashboard ou retourné à l’inscription. Toute requête sans
client_id retourne 400.string
Type métier de l’événement. Sert à matcher le bon playbook. Exemples :
shopify.order.refund_request, email.inbound, widget.chat.message, gorgias.ticket.created. Si absent, on utilise source, sinon api_direct.string
Canal d’origine. Exemples :
shopify, email, widget, gorgias, whatsapp, api_direct. Stocké tel quel dans engine_events.source.string
Email du client final. Sert au rate limit anti-spam (10 msg / 10 min) et à l’historique de conversation.
string
Le texte brut envoyé par le customer. Champ standard que tous les playbooks consomment.
boolean
default:"false"
Si
true, l’agent tourne en mode dry-run : Brain seulement, aucune persistance (pas d’event, pas de run, pas de mémoire), aucun side-effect (pas de webhook envoyé, pas de réponse postée). Utile pour valider un playbook depuis ton CI.any
Tout autre champ est passé au normalizer puis stocké dans
engine_events.payload. Pour un ticket Shopify, on attend typiquement order_number, order_id, ticket_id, subject. Pour un email, from, to, subject, html_body, etc.Response — 200 OK
string
ID de l’event persisté (
engine_events.id). Utilise-le pour cross-référencer avec les logs Actero.string
ID de l’exécution (
engine_runs_v2.id). Visible dans le dashboard → Activité.enum
completed (l’agent a répondu et exécuté le plan), needs_review (envoyé en validation humaine — voir Manual Review), failed (l’executor a échoué), ou no_playbook (aucun playbook actif pour ce event_type).string
Catégorie détectée par le Brain :
order_status, refund_request, product_question, shipping_issue, complaint, other…number
Score de confiance du Brain entre 0 et 1. En dessous d’un seuil (configurable par playbook), l’agent passe en
needs_review.string
Le texte généré par l’agent. Vide si
status: needs_review car aucun message client n’a encore été produit.integer
Nombre d’actions de l’
actionPlan que l’Executor a réellement déclenchées (envoi d’email, refund Stripe, tag Shopify, etc.).integer
Latence totale serveur (normalize + brain + executor + persist).
Response — autres cas
200 OK — pas de playbook
400 Bad Request
401 Unauthorized
404 Not Found
429 Too Many Requests
Quota mensuel atteint sur plan Free :
500 Internal Server Error
5xx est captée par Sentry. Si tu as un request_id côté ton infra, transmets-le au support pour qu’on cross-référence.
Exemples
Mode test (is_test: true)
Quand is_test vaut true, l’agent court-circuite toute persistance et tout side-effect. Tu obtiens la classification + la réponse générée mais :
- Aucune ligne dans
engine_events,engine_runs_v2,engine_messages. - Aucune mémoire conversation mise à jour.
- Aucun webhook sortant émis.
- Aucune action exécutée (pas d’email envoyé, pas de refund Stripe).
Rate limit
- 200 messages / heure par
client_id(compté surengine_messages). - 10 messages / 10 min par
customer_email(anti-spam customer final). - Quota mensuel par plan (50 / 1 000 / 5 000 / illimité). Voir Rate limits.
Liens utiles
- Manual review — workflow quand
status: needs_review - Escalades — règles métier qui déclenchent une escalade humaine
- Webhooks sortants — recevoir le résultat en push plutôt qu’en synchrone