API referansı
Medya
Gönderim için dosyayı Meta'ya yükleyin; müşterilerinizin gönderdiği medyayı listeleyin ve indirin.
#Media nesnesi
media_idintegerVeri Merkezi depo kimliği. Webhook'takidata.media.media_idile aynıdır.client_idinteger · boş olabilirMedyanın ait olduğu numara kaydı.kindstringMedya türü.Değerler:image,video,document,audio,stickersourcestringKaynak.Değerler:inbound,outbound,echomimestringDosyanın MIME türü.sizeintegerBayt cinsinden boyut.sha256string · boş olabilirDosyanın SHA-256 özeti (yalnız?meta=1yanıtında).original_namestring · boş olabilirÖzgün dosya adı.created_atstringKayıt zamanı.download_urlstringİndirme adresi.
Media nesnesi
{
"media_id": 13115,
"client_id": 27,
"kind": "image",
"source": "inbound",
"mime": "image/jpeg",
"size": 108919,
"sha256": "5d174a5bd79a7c91cc0ce4be0be40fdf61f6ae03c2b1e8d9f0a7b6c5d4e3f2a1",
"original_name": null,
"created_at": "2026-10-09 20:14:58",
"download_url": "https://api.verimerkezi.app/wa/media/13115"
}#Medya yükle
POST
/mediaDosyayı herkese açık bir adreste yayınlamadan doğrudan Meta'ya yükler ve bir Meta medya kimliği döndürür. Kimlik 30 gün geçerlidir;
POST /messages içinde {type}.id olarak kullanılır. İstek multipart/form-data olmalıdır. Kapsam: messages:sendSınırlar: görsel (JPEG/PNG) 5 MB, çıkartma (WebP) 500 KB, video (MP4/3GPP) 16 MB, ses (AAC/AMR/MP3/MP4/OGG) 16 MB, belge (PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT) 100 MB.
Bu kimlik, gelen medyayı indirdiğiniz
GET /media/{media_id} depo kimliğinden farklıdır.Dosya Meta'ya türüne uygun bir adla yüklenir (ör.
medya.ogg); kendi dosya adınız Meta'ya gitmez.Test anahtarıyla Meta'ya istek gitmez;
test.media. önekli bir kimlik ve simulated: true döner.Bu uç medya hız sayacında (dakikada 60) sayılır.
İstek gövdesi
filefilezorunluYüklenecek tek dosya (multipart alanı).phone_number_idstringzorunluDosyanın kullanılacağı numara (aynı WABA'da geçerlidir).
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | insufficient_scope | Anahtarda messages:send kapsamı yok. |
| 404 | number_not_found | Numara size ait değil ya da aktif değil. |
| 409 | number_detached | Numara hesabınızdan ayrılmış; panelden yeniden bağlayın. |
| 413 | media_too_large | Dosya türün sınırını aşıyor (max_bytes ve type alanları döner). |
| 415 | unsupported_media_type | İstek multipart/form-data değil. |
| 415 | media_invalid_format | Desteklenmeyen dosya türü; içerik gerçekten doğrulanır. |
| 422 | invalid_request | phone_number_id ya da file eksik. |
| 422 | invalid_media | Dosya boş. |
| 422 | upload_failed | Dosya alınamadı. |
| 422 | meta_upload_failed | Meta dosyayı kabul etmedi. |
curl -X POST "https://api.verimerkezi.app/wa/media" \
-H "Authorization: Bearer $VM_API_KEY"const res = await fetch("https://api.verimerkezi.app/wa/media", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
},
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.verimerkezi.app/wa/media",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/media");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
],
]);
$data = json_decode(curl_exec($ch), true);Yanıt 201
{
"ok": true,
"media_id": "1075907555339682",
"type": "document",
"mime_type": "application/pdf",
"file_size": 183421,
"phone_number_id": "1234567890",
"expires_at": "2026-11-09T09:00:00Z",
"mode": "live"
}#Medya kayıtlarını listele
GET
/mediaHesabınıza ait gelen ve giden medya kayıtlarını yeniden eskiye döndürür. Kapsam:
inbox:read ya da messages:readinbox:read ya da messages:read kapsamlarından biri yeterlidir.Medya dosyaları süresiz saklanır.
Sorgu parametreleri
limitintegeristeğe bağlıSayfa boyutu (1–100).Varsayılan:50cursorintegeristeğe bağlıBumedia_iddeğerinden küçük kayıtlar döner (önceki yanıttakinext_cursor).sourcestringisteğe bağlıYön süzgeci.Değerler:inbound,outbound,echokindstringisteğe bağlıTür süzgeci.Değerler:image,video,document,audio,sticker
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 403 | insufficient_scope | Anahtarda inbox:read ya da messages:read kapsamı yok. |
curl -X GET "https://api.verimerkezi.app/wa/media?limit=50&source=inbound" \
-H "Authorization: Bearer $VM_API_KEY"const res = await fetch("https://api.verimerkezi.app/wa/media?limit=50&source=inbound", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
},
});
const data = await res.json();import os, requests
res = requests.get(
"https://api.verimerkezi.app/wa/media?limit=50&source=inbound",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/media?limit=50&source=inbound");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
],
]);
$data = json_decode(curl_exec($ch), true);Yanıt 200
{
"ok": true,
"media": [
{
"media_id": 13115,
"client_id": 27,
"kind": "image",
"source": "inbound",
"mime": "image/jpeg",
"size": 108919,
"original_name": null,
"created_at": "2026-10-09 20:14:58",
"download_url": "https://api.verimerkezi.app/wa/media/13115"
}
],
"paging": {
"limit": 50,
"has_more": true,
"next_cursor": 13115
}
}#Medya dosyasını indir
GET
/media/{media_id}Dosyanın kendisini ikili akış olarak döndürür. Webhook'ta gelen
data.media.media_id değerini kullanın. ?meta=1 ile dosya yerine üstveri döner. Kapsam: inbox:read ya da messages:readÖrnek yanıt
?meta=1 içindir. Parametresiz çağrıda gövde dosyanın kendisidir; Content-Type, Content-Length, Content-Disposition, ETag, Accept-Ranges, X-Content-Type-Options: nosniff ve Cache-Control: private başlıkları döner.Bu uç medya hız sayacında (dakikada 60) sayılır.
Yol parametreleri
media_idintegerzorunluMedya depo kimliği (yalnız rakam).
Sorgu parametreleri
metaintegeristeğe bağlı1dosya yerine JSON üstveri döndürür.Değerler:0,1
Başlıklar
Rangeisteğe bağlıParça indirme, ör.bytes=0-1048575. Yanıt206 Partial Contentolur.If-None-Matchisteğe bağlıÖnceki yanıttakiETag. Dosya değişmediyse304 Not Modifieddöner.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 400 | invalid_media_id | media_id yalnız rakamlardan oluşmalı. |
| 403 | insufficient_scope | Anahtarda inbox:read ya da messages:read kapsamı yok. |
| 404 | media_not_found | Kayıt yok ya da sizin hesabınıza ait değil (varlığı sızdırılmaz). |
| 404 | media_file_missing | Kayıt var, dosya depoda bulunamadı. |
| 416 | range_not_satisfiable | İstenen bayt aralığı geçersiz. |
curl -X GET "https://api.verimerkezi.app/wa/media/13115?meta=1" \
-H "Authorization: Bearer $VM_API_KEY"const res = await fetch("https://api.verimerkezi.app/wa/media/13115?meta=1", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
},
});
const data = await res.json();import os, requests
res = requests.get(
"https://api.verimerkezi.app/wa/media/13115?meta=1",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/media/13115?meta=1");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
],
]);
$data = json_decode(curl_exec($ch), true);Yanıt 200
{
"ok": true,
"media": {
"media_id": 13115,
"client_id": 27,
"kind": "image",
"source": "inbound",
"mime": "image/jpeg",
"size": 108919,
"sha256": "5d174a5bd79a7c91cc0ce4be0be40fdf61f6ae03c2b1e8d9f0a7b6c5d4e3f2a1",
"original_name": null,
"created_at": "2026-10-09 20:14:58",
"download_url": "https://api.verimerkezi.app/wa/media/13115"
}
}#Medya başlıklarını getir
HEAD
/media/{media_id}Dosyayı aktarmadan
Content-Length, Content-Type ve ETag başlıklarını döndürür. Kapsam: inbox:read ya da messages:readYanıtın gövdesi yoktur.
Yol parametreleri
media_idintegerzorunluMedya depo kimliği.
Hatalar
| Durum | Kod | Ne zaman |
|---|---|---|
| 400 | invalid_media_id | media_id yalnız rakamlardan oluşmalı. |
| 403 | insufficient_scope | Anahtarda inbox:read ya da messages:read kapsamı yok. |
| 404 | media_not_found | Kayıt yok ya da size ait değil. |
curl -X HEAD "https://api.verimerkezi.app/wa/media/13115" \
-H "Authorization: Bearer $VM_API_KEY"const res = await fetch("https://api.verimerkezi.app/wa/media/13115", {
method: "HEAD",
headers: {
Authorization: `Bearer ${process.env.VM_API_KEY}`,
},
});
const data = await res.json();import os, requests
res = requests.head(
"https://api.verimerkezi.app/wa/media/13115",
headers={"Authorization": f"Bearer {os.environ['VM_API_KEY']}"},
)
data = res.json()<?php
$ch = curl_init("https://api.verimerkezi.app/wa/media/13115");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "HEAD",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("VM_API_KEY"),
],
]);
$data = json_decode(curl_exec($ch), true);Yanıt 200
{}