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 |
|---|---|---|
brand_status |
string | ok, no_url, aggregator, unreachable ou no_assets. |
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_urls |
list | URL sources des variantes. |
logo_variants_local_urls |
list | Variantes ré-hébergées : apple-touch, mask-icon, monochrome, etc. |
logo_variants_sources |
list | Origine de chaque variante. |
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. |
http_status, final_url, fetch_error |
mixte | Détails techniques de la récupération de la page. |
Les colonnes d'entrée sont conservées. Les listes sont séparées par \|.
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.