---
name: s21-payable-attachments-url-expiry
scenario: S21
description: Télécharger les justificatifs d'une facture — URLs S3 pré-signées avec expiry 1h, ne jamais cacher entre les tours de conversation
tags: [payables, attachments, url, expiry, s3, checksum]
when_to_use: Quand on veut accéder aux fichiers (PDF, images) attachés à une facture ou note de frais
risk: P2 — Les URLs de téléchargement sont des pré-signées S3 avec X-Amz-Expires=3600 (1h). Le cache du tool est 3300s (55min), laissant 5 minutes de marge. Ne jamais stocker ou réutiliser ces URLs entre conversations.
---

# Instructions — Accès aux justificatifs

## ⚠️ URLs à durée de vie limitée : 1 heure

Les URLs retournées par `get_payable_attachments` sont des **liens pré-signés AWS S3**.

```
X-Amz-Expires=3600 → expire dans 1 heure après génération
```

**Ne jamais :**
- Stocker ces URLs dans une base de données
- Les cacher dans un contexte conversationnel long
- Les transmettre à un système tiers qui les utiliserait plus tard

**Toujours :** partager l'URL immédiatement et dire à l'utilisateur qu'elle expire dans 1h.

## ⚠️ Cache tool = 3300s (55min)

Le tool lui-même est mis en cache pendant 55 minutes.
Si l'URL a été récupérée au début du cache, elle n'aura plus que **5 minutes** à la fin de la fenêtre de cache.
→ Pour un usage interactif, ne pas hésiter à rappeler le tool si le temps entre deux usages dépasse 30 minutes.

## Étape 1 — Obtenir le payableId

Appeler `get_payables` avec le filtre adéquat pour trouver la payable cible.
```json
{
  "companyId": "...",
  "filters": { "field": "documentaryEvidenceStatus", "operator": "=", "value": ["provided"] },
  "pageSize": 20
}
```
→ Extraire le champ `id` de la payable qui t'intéresse.

## Étape 2 — Récupérer les attachments

```json
{ "companyId": "...", "payableId": "<id-de-la-payable>" }
```

## Étape 3 — Interpréter les champs

Pour chaque attachment :
- `url` : lien de téléchargement direct (valide 1h) — à partager immédiatement
- `mimetype` : type MIME (`image/jpeg`, `application/pdf`, `image/png`, etc.) — indiquer à l'utilisateur
- `checksum` : hash MD5 du fichier pour vérification d'intégrité
- `attachedAt` : date d'attachement (format `YYYY-MM-DD`, pas datetime)

## Étape 4 — Présenter le résultat

```
Justificatif trouvé pour la facture [description] :
- Type : image/jpeg
- Attaché le : 2023-01-11
- Lien de téléchargement : [URL]
⚠️ Ce lien expire dans 1 heure. Après expiration, rappeler la commande pour obtenir un nouveau lien.
```

## Exemple live (données réelles)

```json
{
  "mimetype": "image/jpeg",
  "checksum": "107fc4b2a439cbeb84c91c9764b9744d",
  "attachedAt": "2023-01-11",
  "url": "https://spx-production.s3.eu-west-1.amazonaws.com/invoices/nTtrU1GKV_5633342?X-Amz-Expires=3600..."
}
```
→ Bucket S3 : `spx-production.s3.eu-west-1.amazonaws.com` (région EU)
→ Expiry : 3600s confirmé en live

## Exemple de prompt

- "Montre moi le justificatif de la facture Airbnb" → get_payables search + get_payable_attachments
- "Télécharge le PDF de la facture Oracle du mois dernier" → filter supplier + get_payable_attachments
- "Vérifier que la pièce jointe n'est pas corrompue" → comparer checksum local vs checksum API
