ilhamsafiudin / threads-api

Unofficial, Reverse-Engineered Node.js/TypeScript client for Meta's Threads. Supports Read and Write. Web UI Included.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Threads API

NPM MIT License Prettier Code Formatting

Unofficial, Reverse-Engineered Node.js/TypeScript client for Meta's Threads.

threads-api in Action

cover

πŸš€ Usage (Read)

import { ThreadsAPI } from 'threads-api';

// or in Deno πŸ¦–:
// import ThreadsAPI from "npm:threads-api";

const main = async () => {
  const threadsAPI = new ThreadsAPI();

  const username = '_junhoyeo';

  // πŸ‘€ Details for a specific user
  const userID = await threadsAPI.getUserIDfromUsername(username);
  if (!userID) {
    return;
  }
  const user = await threadsAPI.getUserProfile(username, userID);
  console.log(JSON.stringify(user));
  const posts = await threadsAPI.getUserProfileThreads(username, userID);
  console.log(JSON.stringify(posts));
  const replies = await threadsAPI.getUserProfileReplies(username, userID);
  console.log(JSON.stringify(replies));

  // πŸ“– Details for a specific thread
  const postID = await threadsAPI.getPostIDfromURL(
    'https://www.threads.net/t/CuX_UYABrr7/?igshid=MzRlODBiNWFlZA==',
  );
  // or use `threadsAPI.getPostIDfromThreadID('CuX_UYABrr7')`
  if (!postID) {
    return;
  }
  const post = await threadsAPI.getThreads(postID);
  console.log(JSON.stringify(post.containing_thread));
  console.log(JSON.stringify(post.reply_threads));

  const likers = await threadsAPI.getThreadLikers(postID);
  console.log(JSON.stringify(likers));
};
main();

πŸ“‘ Outputs

πŸ“‘ Output β€” threadsAPI.getUserIDfromUsername
5438123050
πŸ“‘ Output β€” threadsAPI.getUserProfile
{
  "is_private": false,
  "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/358202847_614947594069692_3487562382200036996_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=tpgN_Gl7Ss8AX_KPF0P&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfAdlFpCfjPKz_GZvgLRQEm5POc65Aj1nl_TmSUZjTidFg&oe=64ABED68&_nc_sid=10d13b",
  "username": "_junhoyeo",
  "hd_profile_pic_versions": [
    {
      "height": 320,
      "url": "https://scontent.cdninstagram.com/v/t51.2885-19/358202847_614947594069692_3487562382200036996_n.jpg?stp=dst-jpg_s320x320&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=tpgN_Gl7Ss8AX_KPF0P&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfDQn4L2KTPaqJWwWWisoBQUG_KjT2ZCNaI9i37utmmFTQ&oe=64ABED68&_nc_sid=10d13b",
      "width": 320
    },
    {
      "height": 640,
      "url": "https://scontent.cdninstagram.com/v/t51.2885-19/358202847_614947594069692_3487562382200036996_n.jpg?stp=dst-jpg_s640x640&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=tpgN_Gl7Ss8AX_KPF0P&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfCP-zT9v9Sn4qunRW13slzgCTfIdoCSRoR9_Z6CyvAshw&oe=64ABED68&_nc_sid=10d13b",
      "width": 640
    }
  ],
  "is_verified": false,
  "biography": "πŸ°πŸ΄β€β˜ οΈ generalist hacker, designer, dreamer",
  "biography_with_entities": null,
  "follower_count": 124,
  "profile_context_facepile_users": null,
  "bio_links": [{ "url": "https://junho.io/about" }],
  "pk": "5438123050",
  "full_name": "Junho Yeo 🫧",
  "id": null
}
πŸ“‘ Output β€” threadsAPI.getUserProfileThreads
[
  {
    "thread_items": [
      {
        "post": {
          "user": {
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/358202847_614947594069692_3487562382200036996_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=tpgN_Gl7Ss8AX-xbV4J&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfBiGFAmE-Sowhutr5D_oPhVQ2xo-bE4BkMkn6sTKOKCgA&oe=64ABED68&_nc_sid=10d13b",
            "username": "_junhoyeo",
            "id": null,
            "is_verified": false,
            "pk": "5438123050"
          },
          "image_versions2": {
            "candidates": [
              {
                "height": 480,
                "url": "http://static.cdninstagram.com/rsrc.php/null.jpg",
                "width": 480,
                "__typename": "XDTImageCandidate"
              },
              {
                "height": 320,
                "url": "http://static.cdninstagram.com/rsrc.php/null.jpg",
                "width": 320,
                "__typename": "XDTImageCandidate"
              },
              {
                "height": 240,
                "url": "http://static.cdninstagram.com/rsrc.php/null.jpg",
                "width": 240,
                "__typename": "XDTImageCandidate"
              },
              {
                "height": 150,
                "url": "http://static.cdninstagram.com/rsrc.php/null.jpg",
                "width": 150,
                "__typename": "XDTImageCandidate"
              },
              {
                "height": 612,
                "url": "http://static.cdninstagram.com/rsrc.php/null.jpg",
                "width": 612,
                "__typename": "XDTImageCandidate"
              }
            ]
          },
          "original_width": 612,
          "original_height": 612,
          "video_versions": [],
          "carousel_media": null,
          "carousel_media_count": null,
          "pk": "3140761422133509618",
          "has_audio": null,
          "text_post_app_info": {
            "link_preview_attachment": null,
            "share_info": {
              "quoted_post": null,
              "reposted_post": {
                "pk": "3140641520020994048",
                "user": {
                  "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/357840283_601898142066410_8236921479226938783_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=102&_nc_ohc=QMqnnEoXdxsAX_sWsoP&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfAgubnBVBX57Wxc7n6Og-0GGksxFgn2O5Gv2aABIbwXoQ&oe=64AC793A&_nc_sid=10d13b",
                  "username": "michaelshillingburg",
                  "id": null,
                  "is_verified": false,
                  "pk": "12117536"
                },
                "image_versions2": { "candidates": [] },
                "original_width": 612,
                "original_height": 612,
                "video_versions": [],
                "carousel_media": null,
                "carousel_media_count": null,
                "has_audio": null,
                "text_post_app_info": {
                  "link_preview_attachment": null,
                  "share_info": { "quoted_post": null },
                  "reply_to_author": null,
                  "is_post_unavailable": false
                },
                "caption": {
                  "text": "I'm sorry why are all the interaction buttons so close together do I look like I have needles for fingers"
                },
                "like_count": 9,
                "taken_at": 1688613666,
                "code": "CuVzNKXsbgA",
                "id": "3140641520020994048_12117536"
              }
            },
            "reply_to_author": null,
            "is_post_unavailable": false
          },
          "caption": null,
          "taken_at": 1688627959,
          "like_count": 0,
          "code": "CuWOd96hL3y",
          "media_overlay_info": null,
          "id": "3140761422133509618_5438123050"
        },
        "line_type": "line",
        "view_replies_cta_string": "1 reply",
        "reply_facepile_users": [
          {
            "__typename": "XDTUserDict",
            "id": null,
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/357897142_1484591815626242_8599120059151338067_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=102&_nc_ohc=RA3w5L-0xqAAX-LHueV&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfAN3_4MWAvUCV43q86z5E-BkyMY5jwKwm1xV59gUo6CcA&oe=64AC7635&_nc_sid=10d13b"
          }
        ],
        "should_show_replies_cta": true,
        "__typename": "XDTThreadItem"
      }
    ],
    "id": "3140761422133509618"
  },
  {
    "thread_items": [
      {
        "post": {
          "user": {
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/358202847_614947594069692_3487562382200036996_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=tpgN_Gl7Ss8AX-xbV4J&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfBiGFAmE-Sowhutr5D_oPhVQ2xo-bE4BkMkn6sTKOKCgA&oe=64ABED68&_nc_sid=10d13b",
            "username": "_junhoyeo",
            "id": null,
            "is_verified": false,
            "pk": "5438123050"
          },
          "image_versions2": {
            "candidates": [
              {
                "height": 480,
                "url": "http://static.cdninstagram.com/rsrc.php/null.jpg",
                "width": 480,
                "__typename": "XDTImageCandidate"
              },
              {
                "height": 320,
                "url": "http://static.cdninstagram.com/rsrc.php/null.jpg",
                "width": 320,
                "__typename": "XDTImageCandidate"
              },
              {
                "height": 240,
                "url": "http://static.cdninstagram.com/rsrc.php/null.jpg",
                "width": 240,
                "__typename": "XDTImageCandidate"
              },
              {
                "height": 150,
                "url": "http://static.cdninstagram.com/rsrc.php/null.jpg",
                "width": 150,
                "__typename": "XDTImageCandidate"
              },
              {
                "height": 612,
                "url": "http://static.cdninstagram.com/rsrc.php/null.jpg",
                "width": 612,
                "__typename": "XDTImageCandidate"
              }
            ]
          },
          "original_width": 612,
          "original_height": 612,
          "video_versions": [],
          "carousel_media": null,
          "carousel_media_count": null,
          "pk": "3140573486419221952",
          "has_audio": null,
          "text_post_app_info": {
            "link_preview_attachment": null,
            "share_info": {
              "quoted_post": null,
              "reposted_post": {
                "pk": "3140570843146170251",
                "user": {
                  "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/358110565_1464606827702362_5765656138118155279_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=110&_nc_ohc=7nM_57lclegAX_39zlm&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfCmQl2U8oEDfU_qAi4gk7oN7FZn2Sn0sJldyrglQqQRdA&oe=64AB8477&_nc_sid=10d13b",
                  "username": "ruido.98",
                  "id": null,
                  "is_verified": false,
                  "pk": "11391473334"
                },
                "image_versions2": {
                  "candidates": [
                    {
                      "height": 616,
                      "url": "https://scontent.cdninstagram.com/v/t51.2885-15/357877120_126579060472932_1459391482917729292_n.jpg?stp=dst-jpg_e15&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=vrfJ3RfiLKQAX9ythpj&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfDGQd4r1MCSwMTUbb8n_TodpeDvel6Py-mOOurxizLDdA&oe=64A806D7&_nc_sid=10d13b",
                      "width": 640,
                      "__typename": "XDTImageCandidate"
                    },
                    {
                      "height": 462,
                      "url": "https://scontent.cdninstagram.com/v/t51.2885-15/357877120_126579060472932_1459391482917729292_n.jpg?stp=dst-jpg_e15_s480x480&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=vrfJ3RfiLKQAX9ythpj&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfBDyrvb6a4yKFFIq4PeWEFxUdnGSgnV98K-LUqsCv79KA&oe=64A806D7&_nc_sid=10d13b",
                      "width": 480,
                      "__typename": "XDTImageCandidate"
                    },
                    {
                      "height": 308,
                      "url": "https://scontent.cdninstagram.com/v/t51.2885-15/357877120_126579060472932_1459391482917729292_n.jpg?stp=dst-jpg_e15_s320x320&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=vrfJ3RfiLKQAX9ythpj&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfCSHpxdQDQqOcvh9BIBsB6BOo-P7PpkW6rBevVbb5G2VA&oe=64A806D7&_nc_sid=10d13b",
                      "width": 320,
                      "__typename": "XDTImageCandidate"
                    },
                    {
                      "height": 231,
                      "url": "https://scontent.cdninstagram.com/v/t51.2885-15/357877120_126579060472932_1459391482917729292_n.jpg?stp=dst-jpg_e15_s240x240&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=vrfJ3RfiLKQAX9ythpj&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfCfE7CpaYqBFSN7SDq6J76Q5viPdZqwvsO_MCrCMEFCyg&oe=64A806D7&_nc_sid=10d13b",
                      "width": 240,
                      "__typename": "XDTImageCandidate"
                    },
                    {
                      "height": 144,
                      "url": "https://scontent.cdninstagram.com/v/t51.2885-15/357877120_126579060472932_1459391482917729292_n.jpg?stp=dst-jpg_e15_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=vrfJ3RfiLKQAX9ythpj&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfB3VaYLhjnd2d8--9jABYcwioHsoskYFkac6NqQJZUpeQ&oe=64A806D7&_nc_sid=10d13b",
                      "width": 150,
                      "__typename": "XDTImageCandidate"
                    },
                    {
                      "height": 480,
                      "url": "https://scontent.cdninstagram.com/v/t51.2885-15/357877120_126579060472932_1459391482917729292_n.jpg?stp=c12.0.616.616a_dst-jpg_e15_s480x480&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=vrfJ3RfiLKQAX9ythpj&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfDpd3zNq2lzTbJNwhW4xalFOmEg7mE15U3_a956SKzw1w&oe=64A806D7&_nc_sid=10d13b",
                      "width": 480,
                      "__typename": "XDTImageCandidate"
                    },
                    {
                      "height": 320,
                      "url": "https://scontent.cdninstagram.com/v/t51.2885-15/357877120_126579060472932_1459391482917729292_n.jpg?stp=c12.0.616.616a_dst-jpg_e15_s320x320&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=vrfJ3RfiLKQAX9ythpj&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfDWJkgF5RGW2rQMmUCMEntsJS0gtTLKvrvyMgzsATOoJw&oe=64A806D7&_nc_sid=10d13b",
                      "width": 320,
                      "__typename": "XDTImageCandidate"
                    },
                    {
                      "height": 240,
                      "url": "https://scontent.cdninstagram.com/v/t51.2885-15/357877120_126579060472932_1459391482917729292_n.jpg?stp=c12.0.616.616a_dst-jpg_e15_s240x240&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=vrfJ3RfiLKQAX9ythpj&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfA61eQQX0JMNV5_Kojyhh5QyohvHABv2Gx7xQfOx8kcMg&oe=64A806D7&_nc_sid=10d13b",
                      "width": 240,
                      "__typename": "XDTImageCandidate"
                    },
                    {
                      "height": 150,
                      "url": "https://scontent.cdninstagram.com/v/t51.2885-15/357877120_126579060472932_1459391482917729292_n.jpg?stp=c12.0.616.616a_dst-jpg_e15_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=vrfJ3RfiLKQAX9ythpj&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfD4UxiymM4Iw5E6Sc6bsXSH2S-lap_BRxJ0KDV3M4Z8Rw&oe=64A806D7&_nc_sid=10d13b",
                      "width": 150,
                      "__typename": "XDTImageCandidate"
                    }
                  ]
                },
                "original_width": 640,
                "original_height": 616,
                "video_versions": [
                  {
                    "type": 101,
                    "url": "https://scontent.cdninstagram.com/v/t50.2886-16/358387842_266467495971409_8715164333553902633_n.mp4?_nc_ht=scontent.cdninstagram.com&_nc_cat=101&_nc_ohc=_kxmxhph1pEAX8pe5ki&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfCiOSh3s_6LMrErbPA-vRZeSB3rkmHfQXF8zWe10xhLIA&oe=64A7FACB&_nc_sid=10d13b",
                    "__typename": "XDTVideoVersion"
                  },
                  {
                    "type": 103,
                    "url": "https://scontent.cdninstagram.com/v/t50.2886-16/358387842_266467495971409_8715164333553902633_n.mp4?_nc_ht=scontent.cdninstagram.com&_nc_cat=101&_nc_ohc=_kxmxhph1pEAX8pe5ki&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfCiOSh3s_6LMrErbPA-vRZeSB3rkmHfQXF8zWe10xhLIA&oe=64A7FACB&_nc_sid=10d13b",
                    "__typename": "XDTVideoVersion"
                  },
                  {
                    "type": 102,
                    "url": "https://scontent.cdninstagram.com/v/t50.2886-16/358387842_266467495971409_8715164333553902633_n.mp4?_nc_ht=scontent.cdninstagram.com&_nc_cat=101&_nc_ohc=_kxmxhph1pEAX8pe5ki&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfCiOSh3s_6LMrErbPA-vRZeSB3rkmHfQXF8zWe10xhLIA&oe=64A7FACB&_nc_sid=10d13b",
                    "__typename": "XDTVideoVersion"
                  }
                ],
                "carousel_media": null,
                "carousel_media_count": null,
                "has_audio": true,
                "text_post_app_info": {
                  "link_preview_attachment": null,
                  "share_info": { "quoted_post": null },
                  "reply_to_author": null,
                  "is_post_unavailable": false
                },
                "caption": { "text": "loading animation is so good" },
                "like_count": 181,
                "taken_at": 1688605248,
                "code": "CuVjIrZrS-L",
                "id": "3140570843146170251_11391473334"
              }
            },
            "reply_to_author": null,
            "is_post_unavailable": false
          },
          "caption": null,
          "taken_at": 1688605555,
          "like_count": 0,
          "code": "CuVjvJJBx3A",
          "media_overlay_info": null,
          "id": "3140573486419221952_5438123050"
        },
        "line_type": "line",
        "view_replies_cta_string": "9 replies",
        "reply_facepile_users": [
          {
            "__typename": "XDTUserDict",
            "id": null,
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/357825063_1268453057088075_5855869692915646330_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=103&_nc_ohc=DV6_6YlrvuIAX8exWdZ&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfBtpV4qYinVjVTPiFnDCzHEbyvn5kolK0qD1XxHASquQg&oe=64AB53D9&_nc_sid=10d13b"
          },
          {
            "__typename": "XDTUserDict",
            "id": null,
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/358000024_6335610049887857_4656093213491359876_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=105&_nc_ohc=8D_To92SNLYAX_cpE-8&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfDgDLhSMmYkBuac1D4nKnfr6oe2IN9w6GhnxXJTC9B5RQ&oe=64ABCFAF&_nc_sid=10d13b"
          },
          {
            "__typename": "XDTUserDict",
            "id": null,
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/358062917_1006284143836105_5216368917785207505_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=101&_nc_ohc=MnqgCbU5FJUAX9WVTLG&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfC971EDNjs7q0da-MjJMMURvu7ubjwqaT7XlduwNpB24Q&oe=64AB7A8B&_nc_sid=10d13b"
          }
        ],
        "should_show_replies_cta": true,
        "__typename": "XDTThreadItem"
      }
    ],
    "id": "3140573486419221952"
  },
  {
    "thread_items": [
      {
        "post": {
          "user": {
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/358202847_614947594069692_3487562382200036996_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=tpgN_Gl7Ss8AX-xbV4J&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfBiGFAmE-Sowhutr5D_oPhVQ2xo-bE4BkMkn6sTKOKCgA&oe=64ABED68&_nc_sid=10d13b",
            "username": "_junhoyeo",
            "id": null,
            "is_verified": false,
            "pk": "5438123050"
          },
          "image_versions2": { "candidates": [] },
          "original_width": 612,
          "original_height": 612,
          "video_versions": [],
          "carousel_media": null,
          "carousel_media_count": null,
          "pk": "3140573360413755314",
          "has_audio": null,
          "text_post_app_info": {
            "link_preview_attachment": null,
            "share_info": { "quoted_post": null, "reposted_post": null },
            "reply_to_author": null,
            "is_post_unavailable": false
          },
          "caption": { "text": "λŒ“κΈ€λ‹¬λ‹€κ°€ 자꾸 μ‘°μ•„μš” λˆ„λ₯΄κ²Œ 댐;" },
          "taken_at": 1688605540,
          "like_count": 9,
          "code": "CuVjtTyhEey",
          "media_overlay_info": null,
          "id": "3140573360413755314_5438123050"
        },
        "line_type": "line",
        "view_replies_cta_string": "4 replies",
        "reply_facepile_users": [
          {
            "__typename": "XDTUserDict",
            "id": null,
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/358193361_265325182774836_7030905286266807347_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=AyT5dvEtMYEAX8QnPlh&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfA77sX5R0O4uKcLNSH9hD8wf4hKdxImIChuP7_BYAbJew&oe=64AC4397&_nc_sid=10d13b"
          },
          {
            "__typename": "XDTUserDict",
            "id": null,
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/357813133_2463706223791861_7631880548305895633_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=101&_nc_ohc=-Dhoeq61aIMAX8AqhMN&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfA62eWC36zyyzo-5bKdDBVnl8V35YxBrqotMap8sSJwxw&oe=64AB8EE4&_nc_sid=10d13b"
          },
          {
            "__typename": "XDTUserDict",
            "id": null,
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/358161614_176128428624396_5409241973976278275_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=8PTU16j-_9cAX-dG0Fd&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfDtCpSG5xvZas_QNd5dzSsfU1HPRz1Ojlu0IAujAdqrZw&oe=64AB696A&_nc_sid=10d13b"
          }
        ],
        "should_show_replies_cta": true,
        "__typename": "XDTThreadItem"
      }
    ],
    "id": "3140573360413755314"
  },
  {
    "thread_items": [
      {
        "post": {
          "user": {
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/358202847_614947594069692_3487562382200036996_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=tpgN_Gl7Ss8AX-xbV4J&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfBiGFAmE-Sowhutr5D_oPhVQ2xo-bE4BkMkn6sTKOKCgA&oe=64ABED68&_nc_sid=10d13b",
            "username": "_junhoyeo",
            "id": null,
            "is_verified": false,
            "pk": "5438123050"
          },
          "image_versions2": { "candidates": [] },
          "original_width": 612,
          "original_height": 612,
          "video_versions": [],
          "carousel_media": null,
          "carousel_media_count": null,
          "pk": "3140570097706735401",
          "has_audio": null,
          "text_post_app_info": {
            "link_preview_attachment": null,
            "share_info": { "quoted_post": null, "reposted_post": null },
            "reply_to_author": null,
            "is_post_unavailable": false
          },
          "caption": { "text": "Really like those cute profile bubbles πŸ’―" },
          "taken_at": 1688605151,
          "like_count": 4,
          "code": "CuVi91KBhcp",
          "media_overlay_info": null,
          "id": "3140570097706735401_5438123050"
        },
        "line_type": "none",
        "view_replies_cta_string": null,
        "reply_facepile_users": [],
        "should_show_replies_cta": false,
        "__typename": "XDTThreadItem"
      }
    ],
    "id": "3140570097706735401"
  },
  {
    "thread_items": [
      {
        "post": {
          "user": {
            "profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/358202847_614947594069692_3487562382200036996_n.jpg?stp=dst-jpg_s150x150&_nc_ht=scontent.cdninstagram.com&_nc_cat=100&_nc_ohc=tpgN_Gl7Ss8AX-xbV4J&edm=APs17CUBAAAA&ccb=7-5&oh=00_AfBiGFAmE-Sowhutr5D_oPhVQ2xo-bE4BkMkn6sTKOKCgA&oe=64ABED68&_nc_sid=10d13b",
            "username": "_junhoyeo",
            "id": null,
            "is_verified": false,
            "pk": "5438123050"
          },
          "image_versions2": { "candidates": [] },
          "original_width": 612,
          "original_height": 612,
          "video_versions": [],
          "carousel_media": null,
          "carousel_media_count": null,
          "pk": "3140565796708146241",
          "has_audio": null,
          "text_post_app_info": {
            "link_preview_attachment": null,
            "share_info": { "quoted_post": null, "reposted_post": null },
            "reply_to_author": null,
            "is_post_unavailable": false
          },
          "caption": { "text": "gm threads πŸ‘»" },
          "taken_at": 1688604639,
          "like_count": 7,
          "code": "CuVh_Pih9xB",
          "media_overlay_info": null,
          "id": "3140565796708146241_5438123050"
        },
        "line_type": "none",
        "view_replies_cta_string": null,
        "reply_facepile_users": [],
        "should_show_replies_cta": false,
        "__typename": "XDTThreadItem"
      }
    ],
    "id": "3140565796708146241"
  }
]
πŸ“‘ Output β€” threadsAPI.getUserProfileReplies

Same as the output of threadsAPI.getUserProfileThreads but thread_items.length is 2, with the latter as the reply. πŸ˜‰

πŸš€ Usage (Write)

New API (from v1.2.0)

✨ Text Threads

import { ThreadsAPI } from 'threads-api';

const main = async () => {
  const threadsAPI = new ThreadsAPI({
    username: '_junhoyeo', // Your username
    password: 'PASSWORD', // Your password
  });

  await threadsAPI.publish({
    text: 'πŸ€– Hello World',
  });
};

main();

Writing Text Threads

πŸ’‘ TIP: Use the url field in ThreadsAPIPublishOptions to render Link Attachments(link previews).

✨ Threads with Image

await threadsAPI.publish({
  text: 'πŸ€– Threads with Image',
  image: 'https://github.com/junhoyeo/threads-api/raw/main/.github/cover.jpg',
});

✨ Threads with Link Attachment

await threadsAPI.publish({
  text: 'πŸ€– Threads with Link Attachment',
  url: 'https://github.com/junhoyeo/threads-api',
});

✨ Reply to Other Threads

const parentURL = 'https://www.threads.net/t/CugF-EjhQ3r';
const parentPostID = await threadsAPI.getPostIDfromURL(parentURL); // or use `getPostIDfromThreadID`

await threadsAPI.publish({
  text: 'πŸ€– Beep',
  link: 'https://github.com/junhoyeo/threads-api',
  parentPostID: parentPostID,
});

Writing Text Threads

✨ Like/Unlike a Thread (from v1.3.0)

const threadURL = 'https://www.threads.net/t/CugK35fh6u2';
const postIDToLike = await threadsAPI.getPostIDfromURL(threadURL); // or use `getPostIDfromThreadID`

// πŸ’‘ Uses current credentials
await threadsAPI.like(postIDToLike);
await threadsAPI.unlike(postIDToLike);

✨ Follow/Unfollow a User (from v1.3.0)

const userIDToFollow = await threadsAPI.getUserIDfromUsername('junhoyeo');

// πŸ’‘ Uses current credentials
await threadsAPI.follow(userIDToFollow);
await threadsAPI.unfollow(userIDToFollow);

✨ Delete a Post (from v1.3.1)

const postID = await threadsAPI.publish({
  text: 'πŸ€– This message will self-destruct in 5 seconds.',
});

await new Promise((resolve) => setTimeout(resolve, 5_000));
await threadsAPI.delete(postID);

Old API (Deprecated, Still works for backwards compatibility)

import { ThreadsAPI } from 'threads-api';

const main = async () => {
  const threadsAPI = new ThreadsAPI({
    username: 'jamel.hammoud', // Your username
    password: 'PASSWORD', // Your password
  });

  await threadsAPI.publish('πŸ€– Hello World');
};

main();

You can also provide custom deviceID (Default is android-${(Math.random() * 1e24).toString(36)}).

const deviceID = `android-${(Math.random() * 1e24).toString(36)}`;

const threadsAPI = new ThreadsAPI({
  username: 'jamel.hammoud',
  password: 'PASSWORD',
  deviceID,
});

Installation

yarn add threads-api
# or with npm
npm install threads-api
# or with pnpm
pnpm install threads-api
// or in Deno πŸ¦–
import ThreadsAPI from 'npm:threads-api';

const threadsAPI = new ThreadsAPI.ThreadsAPI({});

Roadmap

  • βœ… Read public data
    • βœ… Fetch UserID(314216) via username(zuck)
    • βœ… Read User Profile Info
    • βœ… Read list of User Threads
    • βœ… Read list of User Repiles
    • βœ… Fetch PostID(3140957200974444958) via PostID(CuW6-7KyXme) or PostURL(https://www.threads.net/t/CuW6-7KyXme)
    • βœ… Read Threads via PostID
    • βœ… Read Likers in Thread via PostID
    • 🚧 Read User Followers
    • 🚧 Read User Followings
  • 🚧 Read private data
  • βœ… Write data (i.e. write automated Threads)
    • βœ… Create new Thread with text
      • βœ… Make link previews to get shown
    • βœ… Create new Thread with a single image
    • 🚧 Create new Thread with a multiple images
    • βœ… Reply to existing Thread
  • βœ… Friendships
    • βœ… Follow User
    • βœ… Unfollow User
  • βœ… Interactions
    • βœ… Like Thread
    • βœ… Unike Thread
  • πŸ΄β€β˜ οΈ Restructure project as an monorepo
    • πŸ΄β€β˜  Add Demo App with Next.js
    • πŸ΄β€β˜ οΈ Cool CLI App to run Threads in the Terminal

Projects made with threads-api

Add yours by just opening an pull request!

πŸ΄β€β˜ οΈ react-threads: Embed Static Threads in your React/Next.js application.

NPM MIT License Prettier Code Formatting

Embed Static Threads in your React/Next.js application. UI components for Meta's Threads. Powered by junhoyeo/threads-api.

cover

Demo

Warning
Vercel Deployment is currently sometimes unstable. πŸ΄β€β˜ οΈ

cover

πŸ΄β€β˜ οΈ threads-api CLI (WIP)

To use the threads-api command line interface, run the following command:

$ npx threads-api --help
Usage: threads-api [command] [options]

Options:
  -v, --version                                                                   output the current version
  -h, --help                                                                      display help for command

Commands:
  help                                                                            display help for command
  getUserIDfromUsername|userid|uid|id <username>                                  det user ID from username
  getUserProfile|userprofile|uprof|up <username> <userId> [stringify]             get user profile
  getUserProfileThreads|uthreads|ut <username> <userId> [stringify]               get user profile threads
  getUserProfileReplies|userreplies|ureplies|ur <username> <userId> [stringify]   get user profile replies
  getPostIDfromURL|postid|pid|p <postURL>                                         get post ID from URL
  getThreads|threads|t <postId> [stringify]                                       get threads
  getThreadLikers|threadlikers|likers|l <postId> [stringify]                      get thread likers

πŸ‘€ threads-card: Share your Threads profile easily

πŸ‘€ Strings: Web-Frontend for Threads

Screenshot (84)

πŸ‘€ threads-projects: Unleashing the power of Meta's Threads.net platform with insightful bots and efficient workflows

License

MIT Β© Junho Yeo

If you find this project intriguing, please consider starring it(⭐) or following me on GitHub (I wouldn't say Threads). I code 24/7 and ship mind-breaking things on a regular basis, so your support definitely won't be in vain.

About

Unofficial, Reverse-Engineered Node.js/TypeScript client for Meta's Threads. Supports Read and Write. Web UI Included.

License:MIT License


Languages

Language:TypeScript 95.9%Language:JavaScript 4.0%Language:CSS 0.1%