---
title: "Upload media"
method: POST
path: "/whatsapp/media"
tags: ["Media"]
---

# Upload media

`POST /whatsapp/media`

Upload media files for WhatsApp messaging from public URLs.

Supports two delivery methods:
- `meta_media`: Standard upload to Meta's media endpoint (30-day lifetime)
- `meta_resumable_asset`: Resumable upload flow for profile pictures and large files

**Security**: SSRF-protected - blocks private IPs, localhost, and metadata endpoints

**Size limits**:
- Images: 5 MB
- Audio/Video: 16 MB
- Documents: 100 MB

Requests exceeding these limits fail immediately.

## Request body

- MediaIngestRequest
  - `media_ingest` MediaIngest, required
    - `phone_number_id` string, required — Meta phone number ID
    - `source` string, uri, required — HTTP/HTTPS URL to media file
    - `delivery` 'meta_media' | 'meta_resumable_asset' — Upload method: - meta_media: Standard upload (30-day lifetime) - meta_resumable_asset: Resumable upload (profile pictures, etc.)
    - `filename` string — Optional filename hint
    - `mime_type` string — Optional MIME type hint

## Response `200`

Media uploaded successfully

- MediaIngestResponse
  - `data` MediaIngestData, required
    - `ingest_id` string, uuid, required — Unique ingest request ID
    - `target` MediaIngestTarget, required
      - `kind` 'meta_media' | 'meta_resumable_asset', required — Upload method used
      - `media_id` string — Meta media ID (present when kind=meta_media)
      - `handle` string — Resumable upload handle (present when kind=meta_resumable_asset)
    - `resource` MediaIngestResource, required
      - `filename` string, required — Detected or provided filename
      - `mime_type` string, required — Detected or provided MIME type
      - `size_bytes` integer, required — File size in bytes
      - `sha256` string, required — SHA256 checksum
      - `source_url` string, uri, required — Original source URL

## Other responses

- `400` — Bad request
- `403` — Forbidden
- `404` — Phone number not found
- `413` — Payload too large
- `422` — Request validation failed
- `429` — Rate limit exceeded
- `502` — Meta API error

---

[API](https://skmtc.net/kapso/apis/kapso-platform-api.md) · [All operations](https://skmtc.net/kapso/apis/kapso-platform-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/kapso/kapso-platform-api/revisions/18ff5548a33f/schema)
