Skip to main content

Upload media

const imageBlob = new Blob([/* binary data */], { type: 'image/png' });

const uploadResult = await client.media.upload({
  phoneNumberId: '123',
  type: 'image',
  file: imageBlob,
  fileName: 'photo.png'
});

console.log(uploadResult.id); // Media ID

Use uploaded media

await client.messages.sendImage({
  phoneNumberId: '123',
  to: '56961567267',
  image: { id: uploadResult.id, caption: 'Uploaded image' }
});

Get media metadata

const metadata = await client.media.get({
  mediaId: 'MEDIA_ID',
  phoneNumberId: '123' // Required when using Kapso proxy
});

Delete media

await client.media.delete({
  mediaId: 'MEDIA_ID',
  phoneNumberId: '123' // Required when using Kapso proxy
});

Display media

URL‑first with Kapso (recommended):
import { buildKapsoMessageFields } from '@kapso/whatsapp-cloud-api';

const fields = buildKapsoMessageFields('media_url');
const page = await client.messages.listByConversation({
  phoneNumberId: '123',
  conversationId: 'conv-123',
  fields
});

const msg = page.data.find(m => m.type === 'image');
const src = msg?.kapso?.mediaUrl ?? msg?.image?.link; // render this URL
Raw bytes fallback (works for Meta and Kapso):
// Returns Blob in browsers when as: 'blob'
const blob = await client.media.download({ mediaId: 'MEDIA_ID', phoneNumberId: '123', as: 'blob' });
const src = URL.createObjectURL(blob);
Notes:
  • The SDK downloads from WhatsApp CDNs without auth headers and adds auth only for Kapso hosts. No special configuration is needed.
  • Kapso mirrors outbound media shortly after send; inbound media is available immediately.
I