Passa al contenuto principale

UC-015 — Upload e Gestione Media

CampoValore
IDUC-015
ObiettivoCaricare, elencare e rimuovere file media dalla libreria
CanaleRCS, WhatsApp
ComplessitàBase
Tempo stimato10 minuti
API coinvoltePOST /api/partner-gateway/v1/media, GET /api/partner-gateway/v1/media, DELETE /api/partner-gateway/v1/media/{id}

Scenari reali​

  • Caricare immagine per RCS: L'azienda FashionOutlet carica le immagini della nuova collezione per inviarle tramite Rich Card RCS.
  • Gestire libreria media: Il team marketing di TravelDream organizza la propria libreria di immagini promozionali, verificando quali sono ancora in uso.
  • Eliminare media obsoleti: A fine campagna, il team rimuove le immagini stagionali per mantenere la libreria ordinata.

Flusso di gestione media​

Il diagramma mostra il ciclo di vita di un file media: upload, consultazione e rimozione.

Prerequisiti​

  • API Key attiva con permessi di gestione media
  • File immagine in formato supportato (JPEG, PNG, GIF — max 5 MB)
  • Per RCS: dimensioni consigliate 1440x1440 px (immagini quadrate) o 1440x720 px (landscape)

Step 1 — Carica un file media​

Invia il file tramite multipart form-data.

curl -X POST https://api.qlara.ai/api/partner-gateway/v1/media \
-H "X-Api-Key: YOUR_API_KEY" \
-F "file=@/path/to/promo-estate-2026.jpg" \
-F "name=promo-estate-2026" \
-F "description=Banner promozione estate 2026 - Collezione mare"

Response — Media caricato​

La risposta è un array con il media creato:

[
{
"id": 5821,
"key": "5b0e72c4/3f9a1d7e6c2b48a59e0d1f7c8b6a4e21.jpg",
"thumbnailKey": "5b0e72c4/a7c4e19b2d5f40c3961e8b0d2f4a6c13.jpg",
"companyId": 1287,
"userId": 3410,
"name": "promo-estate-2026",
"description": "Banner promozione estate 2026 - Collezione mare",
"filename": "promo-estate-2026.jpg",
"size": 245760,
"type": "IMAGE",
"mimeType": "image/jpeg",
"source": 1,
"metadata": null,
"folderId": null,
"userEmail": null,
"userFirstName": null,
"userMiddleName": null,
"userLastName": null,
"url": "https://storage.example.com/5b0e72c4/3f9a1d7e6c2b48a59e0d1f7c8b6a4e21.jpg?X-Amz-Date=20260409T090000Z&X-Amz-Expires=3600&X-Amz-Signature=2bbf02e2c8274379a166bb6eb376bcbdb161455399b552eabd3c566b31777738",
"thumbnailUrl": "https://storage.example.com/5b0e72c4/a7c4e19b2d5f40c3961e8b0d2f4a6c13.jpg?X-Amz-Date=20260409T090000Z&X-Amz-Expires=3600&X-Amz-Signature=e9c171c6c46a3a250b4e2ba18f76cb7950e31017e7d87092c7cde91d4540d08b",
"cdnUrl": null,
"cdnThumbnailUrl": null,
"public": false,
"creationDate": "2026-04-09 09:00:00.000+0000",
"lastUpdateDate": "2026-04-09 09:00:00.000+0000"
}
]
Usa l'URL nei messaggi RCS

Il campo url è un link firmato al file: usalo subito come mediaUrl di una Rich Card RCS, ma non salvarlo nel tuo CMS, perché scade. Salva invece l'id: quando ti serve di nuovo il link, prendi l'url dello stesso media da GET /media, che ne firma uno nuovo a ogni chiamata.

Dietro le quinte — Elaborazione del file
  1. Validazione: Il gateway verifica tipo MIME, dimensioni del file e risoluzione dell'immagine.
  2. Ottimizzazione: L'immagine viene compressa mantenendo la qualita visiva (JPEG quality 85%) e convertita in formati ottimali per ogni canale.
  3. Storage: Il file viene salvato nello storage dei media con la chiave key. I file caricati tramite API sono privati: url e thumbnailUrl sono link firmati che scadono, e cdnUrl resta null.
  4. Thumbnail: Viene generata automaticamente una versione ridotta (300x300 px) per le anteprime nella dashboard.
  5. Scansione: Il file viene analizzato per verificare l'assenza di contenuti malevoli (malware scan).

Step 2 — Elenca i media caricati​

Recupera la lista dei file presenti nella tua libreria media. La lista è paginata (page, limit, 10 elementi di default) e ordinata per id crescente, a meno che tu non passi sortBy e sortOrder.

curl -X GET https://api.qlara.ai/api/partner-gateway/v1/media \
-H "X-Api-Key: YOUR_API_KEY"

Response — Lista media​

{
"data": [
{
"id": 5478,
"key": "5b0e72c4/c2e8f05a7d3b41f69a8e0c5d7b2f9e14.png",
"thumbnailKey": "5b0e72c4/e91b4d7c0a3f42e8b6d5c1a9f0e7d3b2.png",
"companyId": 1287,
"userId": 3410,
"name": "logo-brand-2026",
"description": null,
"filename": "logo-brand-2026.png",
"size": 52480,
"type": "IMAGE",
"mimeType": "image/png",
"source": 1,
"metadata": null,
"folderId": 214,
"userEmail": "chiara.verdi@example.it",
"userFirstName": "Chiara",
"userMiddleName": null,
"userLastName": "Verdi",
"url": "https://storage.example.com/5b0e72c4/c2e8f05a7d3b41f69a8e0c5d7b2f9e14.png?X-Amz-Date=20260409T093000Z&X-Amz-Expires=3600&X-Amz-Signature=6a23f4aaac740c71ca1c46aff614fe18db294e3fbbf2358db3a5a2c71d9ed24c",
"thumbnailUrl": "https://storage.example.com/5b0e72c4/e91b4d7c0a3f42e8b6d5c1a9f0e7d3b2.png?X-Amz-Date=20260409T093000Z&X-Amz-Expires=3600&X-Amz-Signature=ab09a190584dbfe3036f6817bab4c3ee15b5b5c3d878e63ddea5ab3098700ed6",
"cdnUrl": null,
"cdnThumbnailUrl": null,
"public": false,
"creationDate": "2026-03-15 08:30:00.000+0000",
"lastUpdateDate": "2026-03-15 08:30:00.000+0000"
},
{
"id": 5821,
"key": "5b0e72c4/3f9a1d7e6c2b48a59e0d1f7c8b6a4e21.jpg",
"thumbnailKey": "5b0e72c4/a7c4e19b2d5f40c3961e8b0d2f4a6c13.jpg",
"companyId": 1287,
"userId": 3410,
"name": "promo-estate-2026",
"description": "Banner promozione estate 2026 - Collezione mare",
"filename": "promo-estate-2026.jpg",
"size": 245760,
"type": "IMAGE",
"mimeType": "image/jpeg",
"source": 1,
"metadata": null,
"folderId": null,
"userEmail": "chiara.verdi@example.it",
"userFirstName": "Chiara",
"userMiddleName": null,
"userLastName": "Verdi",
"url": "https://storage.example.com/5b0e72c4/3f9a1d7e6c2b48a59e0d1f7c8b6a4e21.jpg?X-Amz-Date=20260409T093000Z&X-Amz-Expires=3600&X-Amz-Signature=a475228f13f075b0f51ce1615bc4eb5c3b8a46eb56551701cc70d82af0e15898",
"thumbnailUrl": "https://storage.example.com/5b0e72c4/a7c4e19b2d5f40c3961e8b0d2f4a6c13.jpg?X-Amz-Date=20260409T093000Z&X-Amz-Expires=3600&X-Amz-Signature=a3ac2131d57c6d2fcc79029fe246d9604f13e35c13711a19bcf689bc5f856c5e",
"cdnUrl": null,
"cdnThumbnailUrl": null,
"public": false,
"creationDate": "2026-04-09 09:00:00.000+0000",
"lastUpdateDate": "2026-04-09 09:00:00.000+0000"
}
],
"page": 0,
"limit": 10,
"totalCount": 2,
"totalPages": 1
}

Step 3 — Elimina un media obsoleto​

Rimuovi un file dalla libreria quando non è più necessario, usando il suo id.

curl -X DELETE https://api.qlara.ai/api/partner-gateway/v1/media/5478 \
-H "X-Api-Key: YOUR_API_KEY"

Response — Media eliminato​

L'API risponde 204 No Content, con body vuoto.

Dietro le quinte — Eliminazione
  1. Eliminazione definitiva: Il file viene rimosso dalla libreria e dallo storage dei media. L'operazione non è reversibile.
  2. Messaggi già inviati: Non subiscono conseguenze, perché il contenuto del media è stato consegnato al momento dell'invio.
  3. Riferimenti futuri: Ogni messaggio o campagna che fa ancora riferimento al media eliminato non riuscirà a recuperare il file. Prima di eliminarlo, verifica che non sia usato da una campagna programmata o da un template non ancora inviato.
  4. Eliminazioni rifiutate: 404 se l'id non è nella tua libreria, 409 se il media è pubblico o ancora usato da un post social, 400 se il file è ancora in fase di caricamento.

Risultato atteso​

StepAzioneRisultato
1POST /mediaFile caricato, id, key e url restituiti
2GET /mediaLista paginata dei media con metadati
3DELETE /media/{id}Media rimosso, 204 No Content

Esempio completo end-to-end​

Scenario FashionOutlet: carica immagine e usala in una Rich Card RCS.

# 1. Carica l'immagine promozionale
MEDIA_URL=$(curl -s -X POST https://api.qlara.ai/api/partner-gateway/v1/media \
-H "X-Api-Key: YOUR_API_KEY" \
-F "file=@./summer-collection.jpg" \
-F "name=summer-collection-2026" | jq -r '.[0].url')

echo "Media URL: $MEDIA_URL"

# 2. Verifica che sia nella libreria (dal più recente)
curl -s -X GET "https://api.qlara.ai/api/partner-gateway/v1/media?sortBy=id&sortOrder=desc" \
-H "X-Api-Key: YOUR_API_KEY" | jq '.data[] | select(.name == "summer-collection-2026")'

# 3. Usa subito l'URL nella Rich Card RCS (vedi UC-002): il link è firmato e scade
echo "Pronto per l'invio RCS con mediaUrl: $MEDIA_URL"

Varianti​

Upload di un video​

Per i canali che supportano video (RCS), carica file MP4 (max 10 MB):

curl -X POST https://api.qlara.ai/api/partner-gateway/v1/media \
-H "X-Api-Key: YOUR_API_KEY" \
-F "file=@/path/to/promo-video.mp4" \
-F "name=promo-video-estate" \
-F "description=Video promozionale 15 secondi"

Errori comuni​

413 Payload Too Large — File troppo grande​

{
"status": "fail",
"data": {
"file": "File size exceeds maximum allowed (5 MB for images, 10 MB for videos)"
}
}

Soluzione: Comprimi l'immagine o riducine la risoluzione. Per le Rich Card RCS, 1440px di larghezza e sufficiente.

415 Unsupported Media Type — Formato non supportato​

{
"status": "fail",
"data": {
"file": "Unsupported media type. Allowed: image/jpeg, image/png, image/gif, video/mp4"
}
}

Soluzione: Converti il file in uno dei formati supportati prima dell'upload.

Prossimi passi​

Riferimenti​