Envoyer des images et des fichiers

Une alerte peut porter jusqu'à 8 fichiers : la capture du test qui casse, l'enregistrement du bug, le log qui l'explique. Zenhook réhéberge chacun d'eux, donc l'alerte reste lisible une fois vos artefacts de CI expirés.

Deux entrées

Choisissez selon que votre fichier a déjà une adresse publique :

  • Par URL : le fichier est déjà sur le web et nous pouvons aller le chercher. Corps JSON, une ligne par pièce jointe.
  • Par téléversement : le fichier n'existe que sur votre machine ou votre runner. Envoyez les octets en multipart/form-data.

Mêmes limites, même traitement, même résultat. Seul le transport change.

Joindre par URL

Mettez l'adresse dans attachments. Nous la récupérons une fois, nous la réhébergeons, et l'alerte cesse de dépendre de la survie de votre lien.

curl -X POST https://zenhook.dev/api/webhook/VOTRE_TOKEN \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Build échoué",
    "level": "error",
    "attachments": [
      { "url": "https://ci.example.com/runs/123/screenshot.png" }
    ]
  }'

L'URL doit être en http ouhttps. Le champtype n'est qu'une indication : le vrai type vient des premiers octets du fichier, donc une pièce jointe mal étiquetée arrive quand même correctement.

Téléverser le fichier

Pas d'URL publique ? Envoyez les octets. Le client le plus simple, c'est un titre et un fichier :

curl -X POST https://zenhook.dev/api/webhook/VOTRE_TOKEN \
  -F 'title=Build échoué' \
  -F 'level=error' \
  -F '[email protected]'

Pour plus qu'un titre, mettez le JSON dans une partpayload et ajoutez une part par fichier. Tous les champs de l'API webhook y fonctionnent :

curl -X POST https://zenhook.dev/api/webhook/VOTRE_TOKEN \
  -F 'payload={"title":"Diff visuel","level":"warning","fields":[{"label":"Suite","value":"checkout"}]};type=application/json' \
  -F '[email protected]' \
  -F '[email protected]'

Les noms de parts sont les vôtres. Zenhook lit chaque part fichier qu'il trouve, dans l'ordre, jusqu'à 8.

Le base64, dans son propre champ

Certains émetteurs ne savent pas faire de multipart : Zapier, n8n, Make, tout webhook de SaaS qui n'émet que du JSON. Pour ceux-là, mettez les octets dans data :

curl -X POST https://zenhook.dev/api/webhook/VOTRE_TOKEN \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Diff visuel",
    "attachments": [
      { "data": "iVBORw0KGgoAAAANSUhEUg...", "name": "diff.png" }
    ]
  }'

Du base64 brut, sans préfixe data:. Chaque pièce jointe porte exactement une source : unurl ou undata, jamais les deux.

Une URI data: dans le champurl reste refusée. Ce champ est plafonné à 2000 caractères, donc rien de réel n'y passerait de toute façon.

Préférez le multipart quand vous le pouvez. Le base64 gonfle la charge d'un tiers, et les plafonds s'appliquent aux octets décodés : encoder ne vous achète rien.

Formats et limites

  • Images : PNG, JPEG, GIF, WebP, AVIF, HEIC. Jusqu'à 10 Mo.
  • Vidéo : MP4, WebM. Jusqu'à 50 Mo.
  • Audio : MP3, WAV, M4A, Ogg. Jusqu'à 25 Mo.
  • Par alerte : 8 fichiers, 50 Mo décodés au total.

Le SVG est refusé. C'est autant un conteneur de script qu'une image, et nous n'allons pas en servir un depuis notre domaine.

Ce qui arrive à votre fichier

Zenhook identifie le fichier par ses premiers octets plutôt que par son nom ou son content type, puis le réhéberge sur notre propre stockage. L'original reste intact quand il est déjà petit et affichable par un navigateur.

  • Une image au-delà de 2048 px ou de 10 Mo est redimensionnée à 2048 px et réencodée en WebP. Une capture de 4000 px sous 10 Mo est quand même redimensionnée : le poids seul n'est pas le critère.
  • Les photos d'iPhone fonctionnent.Le HEIC est décodé et converti en WebP, donc une capture envoyée directement depuis un téléphone s'affiche partout.
  • L'audio et la vidéo sont stockés tels quels, dans leurs limites.

Où elles apparaissent

Les pièces jointes s'affichent dans l'alerte sur le web et dans les apps iOS et Android. Les notifications push portent le titre et le message ; ouvrez l'alerte pour voir les fichiers.

FAQ

Ma pièce jointe indique un échec. Pourquoi ?

La cause la plus fréquente est une URL que nous ne pouvons pas atteindre : un artefact de CI privé, un lien signé déjà expiré, ou un hôte qui demande des identifiants. Si le fichier n'est pas récupérable publiquement, envoyez les octets plutôt que l'adresse.

Puis-je joindre un fichier à un Ask ?

Oui. Les Asks acceptent les mêmes champs de pièces jointes que les alertes, donc la personne qui répond voit ce sur quoi elle décide.

Les pièces jointes comptent-elles dans mon forfait ?

L'alerte compte pour un événement, quoi qu'elle transporte. Les fichiers eux-mêmes ne sont pas comptabilisés.