• Public
  • Public/Protected
  • All

Decrypt Media

Decrypting Media

Here is a sample of how to decrypt media. This has been tested on images, videos, documents, audio and voice notes.

import { create, Client, decryptMedia } from '@open-wa/wa-automate';
const mime = require('mime-types');
const fs = require('fs');

function start(client: Client) {
  client.onMessage(async message => {
    if (message.mimetype) {
      const filename = `${message.t}.${mime.extension(message.mimetype)}`;
      const mediaData = await decryptMedia(message);
      const imageBase64 = `data:${message.mimetype};base64,${mediaData.toString(
      await client.sendImage(
        `You just sent me this ${message.type}`
      fs.writeFile(filename, mediaData, function(err) {
        if (err) {
          return console.log(err);
        console.log('The file was saved!');

create().then(client => start(client));


You may sometimes get a 404 error when trying to decrypt media from an old message, this is because media is only available on the main servers for a limited period of time. In these circumstances, you will need to force the host account to reupload media. You can do this by using forceStaleMediaUpdate then using decryptMedia on the response.

      const mediaData = await decryptMedia(client.forceStaleMediaUpdate(message.id));

Decrypting Stickers

Decrypting stickers with the method shown above will result in a blank .webp file. To decrypt the sticker, use getStickerDecryptable.

      const mediaData = await decryptMedia(client.getStickerDecryptable(message.id));
      const mediaData = await client.decryptMedia(message.id);

It is always preferable to keep projects smaller than needed so you can now use a lightweight library called wa-decrypt for projects that do not need all of @open-wa/wa-automate.

You can install that using:

> npm i --save wa-decrypt

and import it like so:

import { decryptMedia } from 'wa-decrypt';

Learn more about wa-decrypt here