File Uploads

Send and receive files across chat platforms.

Send files

Attach files to messages using the files property:

lib/bot.ts
const reportBuffer = Buffer.from("PDF content");

await thread.post({
  markdown: "Here's the report you requested:",
  files: [
    {
      data: reportBuffer,
      filename: "report.pdf",
      mimeType: "application/pdf",
    },
  ],
});

Typed attachments

Use attachments when you already have normalized Attachment objects and the adapter supports typed outgoing media. Telegram supports one outgoing attachment per message and uses the native media method for the attachment type:

lib/bot.ts
await thread.post({
  markdown: "Here's the image:",
  attachments: [
    {
      data: imageBuffer,
      name: "diagram.png",
      mimeType: "image/png",
      type: "image",
    },
  ],
});

Outgoing attachments are available on { raw }, { markdown }, and { ast } messages. Card messages use files for uploads. Use files for generic uploads. On Telegram, files always upload as documents, while attachments preserve image, audio, video, or file media type. Use data or fetchData for private/authenticated files; URL-only attachments must be public URLs Telegram can fetch directly.

Multiple files

lib/bot.ts
await thread.post({
  markdown: "Attached are the images:",
  files: [
    { data: image1, filename: "screenshot1.png" },
    { data: image2, filename: "screenshot2.png" },
  ],
});

Files without text

lib/bot.ts
await thread.post({
  markdown: "",
  files: [{ data: buffer, filename: "document.xlsx" }],
});

Receive files

Access attachments from incoming messages:

lib/bot.ts
bot.onSubscribedMessage(async (thread, message) => {
  for (const attachment of message.attachments ?? []) {
    console.log(`File: ${attachment.name}, Type: ${attachment.mimeType}`);

    if (attachment.fetchData) {
      const data = await attachment.fetchData();
      console.log(`Downloaded ${data.length} bytes`);
    }
  }
});

Attachment properties

PropertyTypeDescription
typestringAttachment type (e.g., "image", "file")
urlstring (optional)Public URL
namestring (optional)Filename
mimeTypestring (optional)MIME type
sizenumber (optional)File size in bytes
widthnumber (optional)Image width
heightnumber (optional)Image height
fetchData() => Promise<Buffer> (optional)Download the file data
fetchMetadataRecord<string, string> (optional)Platform-specific IDs for reconstructing fetchData after serialization