Skip to content

Ambil Pesan Channel ​

GET /channel/message

Ambil histori pesan dari satu channel Telegram, mulai dari yang paling baru. Tiap halaman ngambil sampai 100 pesan. Buat halaman berikutnya, tinggal oper nilai before dari response sebelumnya.

Media di pesan channel (gambar, video, stiker, dokumen) dikasih dalam bentuk link media publik, jadi bisa langsung dipasang di <img> atau <video>.

Detail Endpoint ​

  • Base URL: https://api-zate.azickri.com
  • Header: id dan session-id
  • Syarat: sesi harus lagi nyambung (isConnected: true), dan akun kamu udah gabung ke channel-nya

Parameter ​

ParameterLokasiTipeWajibKeterangan
idheaderstringYaid dari Buat Session.
session-idheaderstringYasessionId dari Buat Session.
channelIdquerystringYaID channel, contohnya -1001234567890, atau username channel publik.
beforequerystringTidakNilai before dari response sebelumnya. Kosongin buat ambil pesan terbaru.

Contoh Request ​

bash
curl "https://api-zate.azickri.com/channel/message?channelId=-1001234567890" \
  -H "id: YOUR_ID" \
  -H "session-id: YOUR_SESSION_ID"
javascript
import axios from 'axios';

const response = await axios.get('https://api-zate.azickri.com/channel/message', {
  params: {
    channelId: '-1001234567890',
  },
  headers: {
    'id': 'YOUR_ID',
    'session-id': 'YOUR_SESSION_ID',
  },
});

console.log(response.data);
javascript
const params = new URLSearchParams({
  channelId: '-1001234567890',
});

const response = await fetch(`https://api-zate.azickri.com/channel/message?${params}`, {
  headers: {
    'id': 'YOUR_ID',
    'session-id': 'YOUR_SESSION_ID',
  },
});

const data = await response.json();
console.log(data);

Response ​

json
{
  "docs": [
    {
      "id": "182",
      "serverId": 182,
      "url": "https://t.me/infosatecakzate/182",
      "type": "text",
      "text": "Malam ini buka sampai jam 12! 🍢",
      "created": "2026-10-11T15:15:51.000Z"
    },
    {
      "id": "181",
      "serverId": 181,
      "url": "https://t.me/infosatecakzate/181",
      "type": "image",
      "text": "Menu baru: sate kambing bumbu kacang",
      "image": {
        "url": "https://api-zate.azickri.com/media/68b3f0a2c1d4e5f6a7b8c9d0/-1001234567890/181/photo/Xk3d9QmPz0aB1cD2eF3gH4.jpg",
        "thumbnail": "https://api-zate.azickri.com/media/68b3f0a2c1d4e5f6a7b8c9d0/-1001234567890/181/thumb/Lm2pQr7sTu8vWx9yZa0bCd.jpg",
        "mimetype": "image/jpeg"
      },
      "created": "2026-10-10T10:02:11.000Z"
    },
    {
      "id": "180",
      "serverId": 180,
      "url": "https://t.me/infosatecakzate/180",
      "type": "video",
      "text": "Behind the scene bakar sate",
      "video": {
        "url": "https://api-zate.azickri.com/media/68b3f0a2c1d4e5f6a7b8c9d0/-1001234567890/180/file/Pq4rSt5uVw6xYz7aBc8dEf.mp4",
        "thumbnail": "https://api-zate.azickri.com/media/68b3f0a2c1d4e5f6a7b8c9d0/-1001234567890/180/thumb/Gh9iJk0lMn1oPq2rSt3uVw.jpg",
        "duration": 15,
        "mimetype": "video/mp4"
      },
      "created": "2026-10-09T19:30:00.000Z"
    },
    {
      "id": "179",
      "serverId": 179,
      "url": "https://t.me/infosatecakzate/179",
      "type": "poll",
      "text": "",
      "polling": {
        "name": "Sate apa yang paling kamu suka?",
        "options": ["Ayam", "Kambing", "Dua-duanya"]
      },
      "created": "2026-10-08T08:30:00.000Z"
    }
  ],
  "before": 0
}
json
// channelId nggak dikirim
{
  "statusCode": 400,
  "message": "channelId must be a string\nchannelId should not be empty"
}

// Bukan channel, atau belum kamu ikuti
{
  "statusCode": 400,
  "message": "channel not found"
}
json
{
  "statusCode": 404,
  "message": "session not found"
}
json
{
  "statusCode": 500,
  "message": "session not connected"
}
KolomTipeKeterangan
docsarrayDaftar pesan, dari yang paling baru.
docs[].idstringID pesan.
docs[].serverIdnumberID pesan dalam bentuk angka. Makin besar, makin baru.
docs[].urlstringLink ke pesan di Telegram: t.me/<username>/<id> buat channel publik, atau t.me/c/<id>/<id> buat channel privat (cuma bisa dibuka anggotanya).
docs[].typestringTipe pesan: text, image, video, sticker, document, atau poll.
docs[].textstringIsi pesan teks, atau caption buat media.
docs[].imageobjectAda kalau type = image: url (ukuran terbesar, sampai 2560 piksel), thumbnail (sekitar 800 piksel), mimetype.
docs[].videoobjectAda kalau type = video: url, thumbnail (320 piksel), duration (detik), mimetype.
docs[].stickerobjectAda kalau type = sticker: url, mimetype (image/webp). Stiker animasi pakai gambar thumbnail-nya.
docs[].documentobjectAda kalau type = document: url, name, size (byte), mimetype.
docs[].pollingobjectAda kalau type = poll: name (pertanyaan) dan options (daftar pilihan).
docs[].createdstringWaktu pesan dikirim (ISO 8601).
beforenumberKirim nilai ini sebagai query before buat ambil halaman berikutnya. 0 artinya udah nggak ada halaman lagi.

Yang nggak ikut

  • Pesan layanan (misalnya "pesan disematkan" atau "foto channel diganti") dilewatin, jadi satu halaman bisa berisi kurang dari 100 pesan walaupun before belum 0.
  • Media yang belum didukung dan nggak punya caption tetap muncul, tapi dengan type: "text" dan text: "UNSUPPORTED TYPE".
  • thumbnail bisa kosong kalau Telegram emang nggak nyimpen thumbnail buat file itu.

Paginasi ​

Cara kerjanya simpel: panggil tanpa before buat halaman pertama, terus oper before dari response ke request berikutnya. Berhenti kalau before udah 0.

javascript
const BASE_URL = 'https://api-zate.azickri.com';
const headers = {
  'id': 'YOUR_ID',
  'session-id': 'YOUR_SESSION_ID',
};

async function getAllChannelMessages(channelId) {
  const messages = [];
  let before = '';

  do {
    const params = new URLSearchParams({ channelId });
    if (before) params.set('before', before);

    const response = await fetch(`${BASE_URL}/channel/message?${params}`, { headers });
    const data = await response.json();
    if (!response.ok) throw new Error(data.message);

    messages.push(...data.docs);
    before = String(data.before);
  } while (before !== '0');

  return messages;
}

const messages = await getAllChannelMessages('-1001234567890');
console.log(`Total ${messages.length} pesan`);

Nggak perlu ambil semuanya

Channel yang udah lama bisa punya ribuan pesan. Kalau cuma butuh yang terbaru, cukup ambil halaman pertama aja.