Aller au contenu principal
Velqa
beta

Page Agent — intégrer l'agent IA à votre site

Page Agent ajoute un agent navigateur borné à votre application. Une authentification Velqa et une autorisation explicite de l'utilisateur sont obligatoires avant toute session.

Tarifs et paliers

L'abonnement couvre le nombre de domaines actifs. L'inférence réellement consommée est débitée en plus, depuis le solde de crédit de votre compte.

PalierPrixDomaines actifs
Starter29 USD / mois1
Growth79 USD / mois (forfait)jusqu'à 3

Growth est un forfait : le prix ne se multiplie pas par le nombre de domaines. Starter est facturé par domaine actif.

Un site que vous désactivez vous-même (interrupteur on/off du tableau de bord) ne compte ni dans le plafond de domaines, ni dans la facturation. Le réactiver le recompte.

Sans abonnement actif, une session est refusée. Souscrivez depuis Tableau de bord → Page Agent, ou depuis Tableau de bord → Facturation, qui expose aussi le palier en cours et un lien de gestion.

Créer un domaine au-delà du plafond de votre palier renvoie 409 page_agent_domain_cap_reached : passez à Growth ou désactivez un domaine existant.

Voir l'agent à l'œuvre

Une boutique fictive, `/fr/demo`, sert de terrain de démonstration : l'agent y cherche dans un catalogue, remplit un panier et s'arrête pour confirmation avant de supprimer une ligne ou de payer. Rien n'y est vendu et rien n'y est débité. La connexion est requise, comme elle le sera sur votre site.

Essai sur votre domaine

Un compte dont l'adresse e-mail est vérifiée et qui n'a jamais souscrit peut demander un essai de 14 jours depuis Tableau de bord → Page Agent. Il donne les mêmes droits qu'un palier Starter : un domaine actif, la vérification, les clés, et des sessions réelles sur votre propre site.

Aucune carte n'est demandée, mais l'essai n'est pas gratuit en inférence : comme pour un abonnement, chaque session est retenue puis débitée sur le solde de crédit de votre compte. Le crédit offert à l'inscription suffit à une évaluation.

Le compte à rebours démarre au moment où vous demandez l'essai, pas à l'inscription : lancez-le quand vous êtes prêt à poser le snippet. Un domaine déjà vérifié est activé immédiatement.

À l'échéance, le domaine repasse en veille et les sessions sont refusées. Rien n'est perdu : la vérification et la configuration restent en place, souscrire un palier réactive le domaine sans nouvelle vérification DNS. L'essai n'est accordé qu'une fois par compte.

Route d'assertion (Node/Hono)

Votre backend doit authentifier l'utilisateur, l'autoriser pour le site concerné, vérifier Origin et les en-têtes Fetch Metadata (Sec-Fetch-Site, Sec-Fetch-Mode), puis protéger la route contre le CSRF. Il signe une assertion courte avec siteId, sub, iat, exp, jti, aud et kid. La clé secrète sk_pa_ ne doit jamais arriver au navigateur : utilisez uniquement la clé publiable et l'URL d'assertion credentialed.

app.get("/page-agent/assertion", requireUser, requireCsrfAndOrigin, async (c) => {
  const site = await authorizeSite(c.get("user").id, c.req.header("Origin"));
  if (!site) return c.json({ error: "forbidden" }, 403);
  return c.json({ assertion: await signAssertion({ siteId: site.id, sub: c.get("user").id, aud: "velqa-page-agent", kid: process.env.PAGE_AGENT_SIGNING_KID }) });
});

Cycle de vie d'une session

Une session dure 15 minutes. Renouvelez-la avec POST /v1/page-agent/session/renew (jeton courant + nouvelle assertion) avant expiration ; le renouvellement fait tourner le jeton. Une session expirée renvoie 401 page_agent_session_expired : réémettez-en une plutôt que de réessayer.

Chaque tour consomme un pas du budget de la session (maxSteps) et une part de ses budgets de coût.

Idempotence des tours

POST /v1/page-agent/chat/completions exige un en-tête `Idempotency-Key` (256 caractères maximum). Réutilisez la même clé pour rejouer un tour dont vous n'avez jamais reçu l'issue — typiquement après un 502/503/504 : le tour reprend sa réservation d'origine au lieu d'en ouvrir une seconde.

La clé est appariée à une empreinte du corps de la requête, calculée sur une forme canonique : réordonner les clés d'un schéma d'outil ne casse pas un retry. En revanche, réutiliser la même clé avec un contenu réellement différent renvoie 409 page_agent_idempotency_conflict — prenez une nouvelle clé pour un nouveau tour. Les réponses mises en cache expirent après 15 minutes.

Un seul tour à la fois par session : un appel concurrent renvoie 409 page_agent_request_in_flight.

Codes d'erreur

Toutes les réponses d'erreur ont la forme { "error": "<code>" }. Le code, pas le statut seul, porte la conduite à tenir.

StatutCodeConduite à tenir
400page_agent_request_invalidCorrigez la charge utile (voir Limites).
401page_agent_session_expiredRéémettez une session ; ne réessayez pas tel quel.
402page_agent_owner_creditSolde de crédit insuffisant côté propriétaire du site : rechargez.
402page_agent_site_budgetPlafond mensuel du site atteint.
403page_agent_assertion_invalidAssertion, Origin ou domaine non valides.
403page_agent_site_disabledLe propriétaire a désactivé le site ; il peut le réactiver.
403page_agent_site_suspendedSuspension administrative : contactez le support.
409page_agent_request_in_flightUn tour est déjà en cours sur cette session ; attendez.
409page_agent_idempotency_conflictMême Idempotency-Key, contenu différent : changez de clé.
409page_agent_idempotency_replay_unavailableLe tour rejoué est déjà réglé ; prenez une nouvelle clé.
429page_agent_rate_limitedRalentissez, puis réessayez.
503page_agent_not_availableIndisponibilité passagère (dépendance interne) : réessayez.

page_agent_owner_credit et page_agent_not_available sont les deux cas à ne pas confondre : le premier demande une action de facturation, le second un simple retry.

Limites de requête

Une requête de tour est refusée en 400 page_agent_request_invalid au-delà de :

  • 1 Mio de corps de requête ;
  • 128 messages, 64 outils ;
  • 262 144 caractères par message ;
  • 65 536 octets pour le schéma parameters d'un outil.

Les rôles acceptés sont user, assistant et tool. Un outil nommé execute_javascript est refusé.

DOM, sécurité et confirmations

Le DOM est une donnée non fiable : une injection indirecte de prompt peut être placée dans une page. L'agent ne doit jamais considérer son contenu comme une instruction de confiance. Les mots de passe, champs de carte et marqueurs data-velqa-mask sont masqués par défaut. Le masquage des données métier est opt-in et n'est qu'un masque visuel d'interaction, pas une garantie de confidentialité.

Les actions destructives (delete, pay, send, archive, disable, revoke, checkout et soumission de paiement) sont suspendues avant dispatch et nécessitent un marqueur de confirmation. Les navigations sont limitées aux origines exactes autorisées ; javascript: et l'exécution JavaScript sont refusés.

Données, fournisseurs et rétention

Le contenu DOM sélectionné et les prompts transitent vers les sous-traitants d'inférence autorisés et listés au registre en vigueur. Les métadonnées de session sont conservées au maximum 90 jours, les agrégats de facturation/usage 24 mois, et le cache technique chiffré d'idempotence au maximum 15 minutes. Consultez le DPA et la politique de confidentialité.

Installation

Le SDK est chargé depuis une release immuable et vérifiée par SRI. Configurez data-velqa-key, data-velqa-lang et data-velqa-assertion-url ; ne copiez jamais une clé sk_pa_ dans le HTML. data-velqa-api-base vaut https://api.velqa.dev par défaut et n'a besoin d'être précisé que pour pointer une autre API. data-velqa-lang accepte fr-FR et en-US : il fixe la langue du panneau et celle dans laquelle l'agent répond à vos visiteurs. Le snippet proposé dans le tableau de bord contient déjà les quatre attributs. Le runbook opératoire interne détaille les alertes et procédures d'incident.