Limites et erreurs
Les limites des sessions hébergées, les erreurs que renvoie l'API et celles qui valent la peine d'être réessayées.
Limites
- 75 navigateurs en cours d’exécution ou de démarrage simultanément par compte.
- Les sessions durent au maximum 4 heures.
- Une session sans aucune commande CDP pendant 5 minutes est fermée (modifiable avec
idleTimeoutSec). - Chaque session démarre avec un profil de navigateur vierge, supprimé à la fin de la session, sauf si vous utilisez un profil nommé, qui conserve les cookies et le stockage des sites d’une session à l’autre.
- Par sécurité, le navigateur ne peut ni ouvrir de fichiers locaux (
file://), ni uploader des fichiers depuis le serveur, ni accéder à des réseaux privés ou internes, ni envoyer d’e-mails sur le port 25. - L’upload d’un fichier fonctionne depuis votre code — voir Uploader des fichiers. Les téléchargements restent sur notre serveur et sont supprimés avec la session ; pour conserver un fichier, récupérez-le depuis la page et renvoyez son contenu.
- Les extensions Chrome ne peuvent pas être chargées dans les navigateurs hébergés.
- Le navigateur ne transmet ni les messages de console ni les erreurs de page :
page.on("console")etpage.on("pageerror")restent donc muets. Collectez ce dont vous avez besoin dans la page et relisez-le avecevaluate. Deux appels du driver dépendent de ces événements : voir setContent et exposeFunction.
Erreurs
| Statut | code | Signification |
|---|---|---|
| 400 | — | The body is not JSON, or an option is invalid; the message says which. |
| 400 | UNKNOWN_VERSION | No release matches version; the message lists the ones you can pick. |
| 400 | TOO_LARGE | The whole run configuration as stored (task, schema, sealed secrets and the browser options) is capped at 60 KB; shorten them. |
| 400 | INVALID | A webhook or cookie import body is invalid; the message says which field (and which cookie). |
| 400 | TOO_MANY | A cookie import would leave the profile with more than 5000 cookies. Use mode "replace", or import fewer. |
| 400 | CHALLENGE_KEY_MISSING | challengeService has no key to use: pass challengeService.apiKey, store your key in the dashboard (Settings), or use key "managed". |
| 401 | — | Missing, malformed or revoked API key. |
| 401 | INVALID_LINK | A share, hand-off or replay link that is invalid, of the wrong kind, or expired. |
| 403 | NOT_CONTROL | Only a link that lets you take control can mark a hand-off done; this one is watch-only. |
| 402 | INSUFFICIENT_BALANCE | Balance below the minimum. Top up in the dashboard. |
| 402 | CHALLENGE_LIMIT | This month's challenge-service limit on our key is reached. Raise it in the dashboard (Settings), or use your own key. |
| 404 | NOT_FOUND | No session, run, profile, webhook or recording with that id on your account. |
| 409 | NOT_RUNNING | Live view, a reconnect or a hand-off asked for before the browser started or after it ended. |
| 409 | NOT_KEEPALIVE | This session cannot be reconnected. Start it with keepAlive: true. |
| 409 | PROFILE_IN_USE | Another session is already saving to that profile. Stop it, or open the profile with persist: false. |
| 409 | NOT_READY | The recording is still being uploaded. Try again shortly after the session ends. |
| 409 | HANDOFF_UNSUPPORTED | The server running this browser does not support hand-off yet. |
| 409 | NO_HANDOFF | Marked done, but no hand-off was asked for. |
| 409 | HANDOFF_EXPIRED | The hand-off timed out before it was marked done. |
| 409 | WEBHOOK_LIMIT | At most 5 webhooks per account. Delete one first. |
| 410 | ENDED | A live link whose session has ended. |
| 410 | GONE | A replay link whose recording is no longer available (failed, or past its retention). |
| 413 | TOO_LARGE | A cookie import would make the profile larger than 3.5 MB. |
| 429 | CONCURRENCY_LIMIT | Too many browsers running or starting at once. Close one first. |
| 429 | — | More than 60 create calls in a minute from one address. Slow down. |
| 429 | — | More than 60 cookie imports in 10 minutes on one account (or 30 new webhooks in 10 minutes, 10 webhook tests or 60 hand-off requests a minute). Wait and retry. |
| 503 | NO_CAPACITY | No free browser slot right now, or no server that can run what you asked for (runs, schema, secrets, recording, the challenge service). Retry after a few seconds. |
| 503 | NO_WORKER | The server running that session is not reachable at the moment. |
| 503 | NOT_CONFIGURED | Hosted browsers (or that part of them) are not configured on this server. |
| 503 | NOT_AVAILABLE | Notes, profiles, runs, recordings, events, hand-off, webhooks or the challenge service are not enabled on this server yet. |
Les erreurs sont renvoyées en JSON : { "error": "...", "code": "..." }. Si la connexion WebSocket elle-même est refusée, créez une nouvelle session : les URL de connexion sont à usage unique et expirent au bout de deux minutes. Un upgrade WebSocket refusé répond avec un statut HTTP et un champ JSON error : 409 si l’URL a déjà été utilisée, si la session a été annulée, n’a pas été démarrée avec keepAlive ou est déjà connectée ; 401 si l’URL a expiré.
Ce qu’il faut réessayer
- Réessayez avec backoff :
503 NO_CAPACITYet503 NO_WORKER(attendez 1, 2, 4… secondes avec un peu de jitter, et abandonnez après quelques tentatives), ainsi qu’une429sans code (la limite de débit par adresse). - Réessayez quelques fois avec backoff : les autres réponses
5xx, et une connexion refusée avant le démarrage de votre script (avec une nouvelle session : l’ancienne URL de connexion est consommée). - Ne bouclez jamais :
400(corrigez la requête),401,402(ajoutez du crédit),429 CONCURRENCY_LIMIT(fermez d’abord un navigateur) et409 PROFILE_IN_USE. Une personne doit intervenir ; réessayer ne fait que gaspiller des requêtes.