Skip to content

Instantly share code, notes, and snippets.

@davydmaker
Created November 20, 2025 01:18
Show Gist options
  • Select an option

  • Save davydmaker/f4c80a07345abbf2f4e1910739aeabf9 to your computer and use it in GitHub Desktop.

Select an option

Save davydmaker/f4c80a07345abbf2f4e1910739aeabf9 to your computer and use it in GitHub Desktop.
Monitor Slack users by extracting daily lists to track deactivated accounts and potential company terminations
// To obtain these values: open Slack web, monitor network requests after login,
// pick any API request, extract company workspace from URL (e.g., xpto.enterprise.slack.com),
// and find the token in the request payload (form data)
//
// To run this script: open Slack web in your browser and paste this script into the browser console
const SLACK_TOKEN =
"";
const COMPANY_WORKSPACE = "";
(async () => {
const allPeople = [];
let totalPages = null;
async function fetchPage(pageNumber) {
const params = {
token: SLACK_TOKEN,
module: "people",
page: pageNumber.toString(),
query: "",
extracts: "0",
highlight: "0",
extra_message_data: "1",
no_user_profile: "1",
count: "50",
file_title_only: "false",
query_rewrite_disabled: "false",
include_files_shares: "1",
browse: "standard",
search_context: "desktop_people_browser",
max_filter_suggestions: "10",
sort: "name",
sort_dir: "asc",
account_type: "6",
hide_deactivated_users: "0",
};
const formData = new FormData();
Object.entries(params).forEach(([key, value]) =>
formData.append(key, value)
);
const response = await fetch(
`https://${COMPANY_WORKSPACE}.enterprise.slack.com/api/search.modules.people?_x_gantry=true`,
{
method: "POST",
headers: {
accept: "*/*",
"accept-language": "pt-BR,pt;q=0.6",
},
referrerPolicy: "no-referrer",
body: formData,
mode: "cors",
credentials: "include",
}
);
if (!response.ok) {
throw new Error(`HTTP Error: ${response.status}`);
}
return await response.json();
}
try {
const firstPage = await fetchPage(1);
if (!firstPage.ok) {
throw new Error("First request failed");
}
totalPages = firstPage.pagination.page_count;
firstPage.items.forEach((person) => {
allPeople.push({
display_name:
person.profile.display_name || person.profile.real_name || "N/A",
email: person.profile.email || "N/A",
});
});
console.log(`Processing page 1/${totalPages}`);
for (let page = 2; page <= totalPages; page++) {
console.log(`Processing page ${page}/${totalPages}`);
const result = await fetchPage(page);
if (result.ok && result.items) {
result.items.forEach((person) => {
allPeople.push({
display_name:
person.profile.display_name || person.profile.real_name || "N/A",
email: person.profile.email || "N/A",
});
});
}
await new Promise((resolve) => setTimeout(resolve, 500));
}
console.log(
allPeople.map((p) => `${p.display_name} - ${p.email}`).join("\n")
);
return allPeople;
} catch (error) {
console.error("Extraction error:", error);
return [];
}
})();
// This script can be used to generate daily lists and compare them with the previous day's list
// to identify which users have been deactivated on Slack (and possibly terminated from the company)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment