Assets visuels
Assets visuels
Extrait l'identité visuelle de chaque prospect depuis son propre site : logo principal, variantes de logo, favicon, couleur de marque dominante, palette harmonique dérivée du logo. Capture d'écran de la page d'accueil en option. Toutes les images sont ré-hébergées dans le stockage privé de l'appelant, ce qui évite qu'un lien casse si le prospect change de CDN.
Le module est en lecture seule contre le site du prospect — aucune soumission de formulaire, aucune connexion, aucun franchissement d'authentification.
Inputs
Une ligne par POI. Seul site_web est requis ; le reste est transmis en passe-plat.
| Champ | Type | Requis | Notes |
|---|---|---|---|
site_web |
string | oui | URL HTTP(S) du site du prospect. |
nom |
string | non | Nom affiché, exposé dans l'UI. |
Un batch accepte 1 à 10 000 lignes. Les lignes sans site_web sont écartées avant la mise en file.
Options au niveau du job :
| Option | Type | Défaut | Notes |
|---|---|---|---|
source_job_id |
string | null | Job parent dans la chaîne du pipeline. |
capture_screenshot |
bool | false | Ajoute une capture de la page d'accueil. ~5× plus lent. |
Outputs
Sortie par ligne. Les URLs locales pointent vers des assets ré-hébergés sous /api/brand-assets/<owner_user_id>/<sha256>.<ext> et ne sont servies qu'au propriétaire (ou à un admin).
| Colonne | Type | Notes |
|---|---|---|
logo_url |
string | URL source du logo principal trouvée sur le site du prospect. |
logo_local_url |
string | Copie ré-hébergée du logo principal, URL stable. |
logo_source |
string | Origine du logo (par exemple og:image, JSON-LD, apple-touch). |
logo_variants_local_urls |
list | Variantes ré-hébergées : apple-touch, mask-icon, monochrome, etc. |
favicon_url |
string | URL source du favicon de meilleure qualité détecté. |
favicon_local_url |
string | Copie ré-hébergée du favicon. |
brand_color |
string | Couleur de marque dominante au format hex. |
brand_color_source |
string | Origine de la couleur (meta theme-color, échantillonnage du logo, etc.). |
brand_palette |
list | Cinq couleurs hex harmoniques dérivées du logo. |
screenshot_local_url |
string | Capture de la page d'accueil. Renseigné si capture_screenshot=true. |
Les binaires sont stockés sous data/brand_assets/<user_id>/<sha256>.<ext>. Extensions autorisées : svg, png, jpg, jpeg, webp, gif, ico, avif. Chaque asset est haché pour la déduplication entre lignes d'un même propriétaire.
Cycle de vie
États de job standard — voir Cycle de vie des jobs. Les erreurs HTTP par ligne ne font jamais échouer le job : une ligne en échec porte fetch_error et un logo_local_url à null.
Pipeline
| Needs | Produces |
|---|---|
site_web |
logo_url, logo_local_url, logo_variants_local_urls, favicon_url, favicon_local_url, brand_color, brand_palette, screenshot_local_url |
pipelinable: true, s'insère après toute étape produisant site_web — typiquement un parent scrap. supports_veille: false : l'identité de marque est traitée comme une extraction one-shot, pas un signal récurrent.
Endpoints
Créer un job batch
POST /api/jobs/brand-assets
Body :
{
"items": [
{"nom": "Stripe", "site_web": "https://stripe.com"}
],
"source_job_id": null,
"capture_screenshot": false
}
Retourne une enveloppe JobPublic. Authentification : tout utilisateur actif.
Lookup live mono-domaine
GET /api/brand-lookup?domain=<domain>&refresh=<bool>
One-shot, aucun job batch créé. Le premier appel sur un domaine donné fait un fetch live (~2–3s) et stocke le résultat dans un cache par utilisateur. Les appels suivants dans les sept jours retournent instantanément le profil mis en cache. refresh=true force un re-fetch.
Forme de la réponse :
{
"domain": "stripe.com",
"cached": false,
"cached_at": null,
"profile": {
"status": "ok",
"logo_url": "...",
"logo_local_url": "...",
"logo_source": "og:image",
"logo_variants_local_urls": ["..."],
"favicon_url": "...",
"favicon_local_url": "...",
"brand_color": "#635BFF",
"brand_color_source": "theme-color",
"brand_palette": ["#635BFF", "..."],
"http_status": 200,
"final_url": "https://stripe.com/",
"fetch_error": null
}
}
Servir un asset ré-hébergé
GET /api/brand-assets/<owner_user_id>/<sha256>.<ext>
Isolation par propriétaire : seul le propriétaire (ou un admin) peut lire les assets du namespace. Les noms de fichiers sont validés par une regex stricte ; les tentatives de path traversal sont rejetées avec 400.
Pour les quotas et caps globaux, voir Limites. TTL du cache brand-lookup : 7 jours, par utilisateur, par domaine. Le mode screenshot multiplie le coût par ligne par ~5 ; opt-in uniquement.
Erreurs
| Code | Signification |
|---|---|
| 400 | Aucun établissement avec site web — aucune ligne ne porte un site_web exploitable. |
| 400 | Domaine invalide sur /api/brand-lookup. |
| 400 | Nom de fichier d'asset invalide sur l'endpoint de service. |
| 403 | Accès à un asset appartenant à un autre utilisateur. |
| 502 | Lookup live en échec côté amont (Lookup failed: <type>: <message>). |
Pour aller plus loin
- techstack — détecter le CMS, l'analytics et les frameworks derrière le même
site_web. - ads_intelligence — révéler l'empreinte d'acquisition payante du prospect en complément de l'identité visuelle.