admin.analytics.getFile
method
We're still building and not all features are available quite yet. Enjoy this peek into the future!
Not ready for the future? Return to the past at api.slack.com.
Usage info
This method returns member and conversation analytics data presented as new-line delimited JSON files, compressed with gzip.
Each response contains a file with analytics data for a single day.
As of February 2023, analytics data is available on a rolling 13-month basis.
If you recently upgraded from a Free or Pro plan, you will only have access to data starting from when you upgraded (the 13 months of historical data will not immediately apply). Once you've been on a Business+, Select/Compliance, or Grid plan for 13 months, the data will become available on a rolling 13-month basis.
Historical data is not recomputed when a workspace and its accompanying member engagement data is added to or removed from an organization. Similarly, if a member is removed from a workspace, the data returned by the API will not update historical engagement data to reflect only the workspaces the member is currently a part of. This behavior differs from the Analytics Dashboard in Org and Team settings, which does consider historical changes in its calculation of 30 day and all time metrics.
The date
argument is required when requesting daily analytics data. It represents the date in UTC corresponding to the analytics data you're requesting. Omit this argument when setting metadata_only
to true
, as metadata cannot be filtered by date.
When setting type
to public_channel
, you may also use the metadata_only
boolean argument, which changes the response entirely to give you metadata about the public channels appearing in your conversation analytics. Omit the date
parameter when using this mode.
Practical usage example
To quickly decompress a file and view the JSON directly, use a cURL command like:
curl "{%BASE_API_URL%}/api/admin.analytics.getFile" -d "date=2020-11-03&type=member" | gunzip -c > member_analytics_2020_11_03.json
...and you'll have a member_analytics_2020_11_03.json
file in the current operating directory. In some organizations the decompressed size can be quite large. Take care that you have the disk or memory space you need to store and process these files.
Here's an example for conversation analytics:
curl "{%BASE_API_URL%}/api/admin.analytics.getFile" -d "date=2021-01-04&type=public_channel" | gunzip -c > public_channel_analytics_2021_01_04.json
And another for channel metadata to accompany that conversation analytics request—note that we omit date
.
curl "{%BASE_API_URL%}/api/admin.analytics.getFile" -d "type=public_channel&metadata_only=true" | gunzip -c > public_channel_metadata_2021_01_04.json
Response
This method is almost completely unlike other Web API methods you encounter. It doesn't return application/json
with the traditional "ok": true
response on success, though you'll find "ok": false
on failure.
Instead, it returns a single file, often very large, containing JSON objects that are separated by newlines and then compressed with application/gzip
.
To open the successful response and utilize the data, you must first store and decompress the response. Some tools may parse new line-separated JSON for you with ease, while other tools will require that you first split each new line separated "row" into its own separate JSON object before being deserialized. After decompression, the file returned in the response will look something like the following, depending on the type of analytics requested.
Member analytics response
Here are 3 example lines of JSON you would find after decompressing a member analytics file. Each line provides information about a different user.
{"enterprise_id":"E5UBAR8CH","date":"2020-10-05","user_id":"W0POSID23ID","email_address":"rbrautigan@example.org","is_guest":false,"is_billable_seat":false,"is_active":false,"is_active_ios":false,"is_active_android":false,"is_active_desktop":false,"reactions_added_count":0,"messages_posted_count":0,"channel_messages_posted_count":0,"files_added_count":0,"is_active_apps":true,"is_active_workflows":true,"is_active_slack_connect":true,"total_calls_count":15,"slack_calls_count":12,"slack_huddles_count":3,"search_count":223,"date_claimed":1584810430}
{"enterprise_id":"E5UBAR8CH","date":"2020-10-05","user_id":"W1ZOSID3ZI2","email_address":"gstein@example.org","is_guest":false,"is_billable_seat":true,"is_active":true,"is_active_ios":false,"is_active_android":false,"is_active_desktop":true,"reactions_added_count":23,"messages_posted_count":123,"channel_messages_posted_count":23,"files_added_count":3,"is_active_apps":false,"is_active_workflows":true,"is_active_slack_connect":false,"total_calls_count":10,"slack_calls_count":4,"slack_huddles_count":5,"search_count":1001,"date_claimed":1584810520}
{"enterprise_id":"E5UBAR8CH","date":"2020-10-05","user_id":"W3DOSZD23IP","email_address":"obutler@example.org","is_guest":false,"is_billable_seat":true,"is_active":true,"is_active_ios":true,"is_active_android":false,"is_active_desktop":false,"reactions_added_count":521,"messages_posted_count":5,"channel_messages_posted_count":5,"files_added_count":0,"is_active_apps":true,"is_active_workflows":true,"is_active_slack_connect":false,"total_calls_count":3,"slack_calls_count":3,"slack_huddles_count":0,"search_count":32,"date_claimed":1584810510}
To be extra helpful, here's one of those lines formatted a little prettier:
{
"enterprise_id": "E5UBAR8CH",
"date": "2020-10-05",
"user_id": "W3DOSZD23IP",
"email_address": "obutler@example.org",
"is_guest": false,
"is_billable_seat": true,
"is_active": true,
"is_active_ios": true,
"is_active_android": false,
"is_active_desktop": false,
"reactions_added_count": 521,
"messages_posted_count": 5,
"channel_messages_posted_count": 5,
"files_added_count": 0,
"is_active_apps": true,
"is_active_workflows": true,
"is_active_slack_connect": false,
"total_calls_count": 10,
"slack_calls_count": 3,
"slack_huddles_count": 5,
"search_count": 32,
"date_claimed": 1584810510
}
Public channel analytics response
This example shows 3 lines of decompressed public channel analytics. Each line provides information about activity in a single public channel.
{"enterprise_id":"EJB3MZFLM","team_id":"EJB3MZFLM","originating_team":{"team_id":"T5J3Q04QZ","name":"postmodernity"},"channel_id":"CNGL0KGG1","date_created":1555111593,"date_last_active":1684820530,"total_members_count":7,"full_members_count":6,"guest_member_count":1,"messages_posted_count":223,"messages_posted_by_members_count":80,"members_who_viewed_count":225,"members_who_posted_count":3,"reactions_added_count":23,"visibility":"public","channel_type":"single_workspace_channel","is_shared_externally":false,"shared_with":[],"externally_shared_with_organizations":[],"date":"2020-11-14"}
{"enterprise_id":"EJB3MZFLM","team_id":"EJB3MZFLM","originating_team":{"team_id":"T3J3A04QB","name":"modernity"},"channel_id":"CNGG2KB92","date_created":1358111593,"date_last_active":1452719593,"total_members_count":227,"full_members_count":227,"guest_member_count":0,"messages_posted_count":1138,"messages_posted_by_members_count":1137,"members_who_viewed_count":226,"members_who_posted_count":7,"reactions_added_count":7212,"visibility":"public","channel_type":"single_workspace_channel","is_shared_externally":true,"shared_with":[],"externally_shared_with_organizations":[],"date":"2020-11-14"}
{"enterprise_id":"EJB3MZFLM","team_id":"EJB3MZFLM","originating_team":{"team_id":"EJB3MZFLM","name":"arcane-enterprise"},"channel_id":"CNGZ5K595","date_created":1355111593,"date_last_active":1452719593,"total_members_count":5,"full_members_count":4,"guest_member_count":1,"messages_posted_count":1,"messages_posted_by_members_count":1,"members_who_viewed_count":5,"members_who_posted_count":1,"reactions_added_count":1,"visibility":"public","channel_type":"multi_workspace_channel","is_shared_externally":true,"shared_with":[{"team_id":"T5J3Q04QA","name":"scifi"},{"team_id":"EJB3MZFLM","name":"arcane-enterprise"}],"externally_shared_with_organizations":[{"name":"Away Org","domain":"away.enterprise.slack.com"}],"date":"2020-11-14"}
And here's just one line of that formatted in a friendly fashion:
{
"enterprise_id": "EJB3MZFLM",
"team_id": "EJB3MZFLM",
"originating_team": {
"team_id": "EJB3MZFLM",
"name": "arcane-enterprise"
},
"channel_id": "CNGZ5K595",
"date_created": 1355111593,
"date_last_active": 1452719593,
"total_members_count": 5,
"full_members_count": 4,
"guest_member_count": 1,
"messages_posted_count": 1,
"messages_posted_by_members_count": 1,
"members_who_viewed_count": 5,
"members_who_posted_count": 1,
"reactions_added_count": 1,
"visibility": "public",
"channel_type": "multi_workspace_channel",
"is_shared_externally": false,
"shared_with": [
{
"team_id": "T5J3Q04QA",
"name": "scifi"
},
{
"team_id": "EJB3MZFLM",
"name": "arcane-enterprise"
}
],
"externally_shared_with_organizations": [
{
"name": "Away Org",
"domain": "away.enterprise.slack.com"
}
],
"date": "2020-11-14"
}
Public channel metadata response
Uncompressed, you'll find each public channel's metadata on a single line like so:
{"channel_id":"CNGL0K091","name":"tomorrow","topic":"I'd gladly pay you Tuesday for a hamburger today","description":"What do you want to do tomorrow?","date":"2020-11-14"}
{"channel_id":"CNGG2KB92","name":"announcements","topic":"What's new with what you do","description":"Company announcements, edicts, and mandates","date":"2020-11-14"}
{"channel_id":"CNGZ5K595","name":"teds","topic":"'No you meant the other ted' - @ted","description":"A channel just for teds, by teds.","date":"2020-11-14"}
And here's that last one printed pretty for you:
{
"channel_id": "CNGZ5K595",
"name": "teds",
"topic": "'No you meant the other ted' - @ted",
"description": "A channel just for teds, by teds.",
"date": "2020-11-14"
}
The response format changes depending on which type of analytics you're retrieving.
Member analytics
After July 10, 2023, is_billable_seat
will only provide an accurate count for invoiced customers. Customers who purchased their plan via the Slack website and pay for it by credit card or self-serve invoicing should not use is_billable_seat
to count their billable users.
Field | Description | Example |
---|---|---|
date | The date this row of data is representative of | 2020-09-13 |
enterprise_id | Unique ID of the involved Enterprise organization | E2AB3A10F |
user_id | The canonical, organization-wide user ID this row concerns | W1F83A9F9 |
email_address | The email address of record for the same user | person@acme.com |
enterprise_employee_number | This field is pulled from data synced via a SCIM API custom attribute | 273849373 |
is_guest | User is classified as a guest (not a full workspace member) on the date in the API request | false |
is_billable_seat | User is classified as a billable user (included in the bill) for invoiced customers on the date in the API request. Customers who purchased their plan via the Slack website and pay for it by credit card or self-serve invoicing should not use this to count their billable users | true |
is_active | User has posted a message or read at least one channel or direct message on the date in the API request | true |
is_active_ios | User has posted a message or read at least one channel or direct message on the date in the API request via the Slack iOS App | true |
is_active_android | User has posted a message or read at least one channel or direct message on the date in the API request via the Slack Android App | false |
is_active_desktop | User has posted a message or read at least one channel or direct message on the date in the API request via the Slack Desktop App | true |
reactions_added_count | Total reactions added to any message type in any conversation type by the user on the date in the API request. Removing reactions is not included. This metric is not de-duplicated by message—if a user adds 3 different reactions to a single message, we will report 3 reactions | 20 |
messages_posted_count | Total messages posted by the user on the date in the API request to all message and conversation types, whether public, private, multi-person direct message, etc. | 40 |
channel_messages_posted_count | Total messages posted by the user in private channels and public channels on the date in the API request, not including direct messages | 30 |
files_added_count | Total files uploaded by the user on the date in the API request | 5 |
is_active_apps | Returns true when this member has interacted with a Slack app or custom integration on the given day, or if such an app or integration has performed an action on the user's behalf, such as updating their custom status | true |
is_active_workflows | Returns true when this member has interacted with at least one workflow on a given day | false |
is_active_slack_connect | Returns true when the member is considered active on Slack Connect, in that they've read or posted a message to a channel or direct message shared with at least one external workspace | true |
total_calls_count | Total number of calls made or joined on a given day, including Huddles, Slack native calls, and calls made using third-party software besides Slack calls | 10 |
slack_calls_count | Total number of Slack calls made or joined on a given day, excluding any calls using third-party software besides Slack calls | 10 |
slack_huddles_count | Total number of Slack Huddles made or joined on a given day | 5 |
search_count | The number of searches this user performed in Slack on a given day | 3 |
date_claimed | The date of the very first time the member signed in to any workspace within the grid organization, presented in seconds since the epoch (UNIX time) | 1584810530 |
Conversation analytics fields
At this time, these analytics are only available for public channels. Archived and deleted channels are not included.
The account associated with the token making the request must have the Public Channel Management permission. By default, the only account with this permission is an organization's primary owner.
If you need more metadata about these public channels, you can quickly fetch it by setting metadata_only
to true
. Learn more about the information available.
Field | Description | Example |
---|---|---|
enterprise_id | Immutable, unique id for the Grid Organization. When the API is called by a customer not on Grid plan, this field has value "0" | E123ABC456 |
team_id | Immutable, unique id of the team | T123ABC567 |
originating_team | A JSON object with the team_id and name of the workspace that created this public channel | {"team_id":"T123ABC456","name":"arcane"} |
channel_id | The unique id belonging to this channel. The metadata_only mode will give you information like the channel's name | C123ABC456 |
channel_type | Indicates which kind of public channel this is: single_workspace_channel , multi_workspace_channel , or org_wide_channel . | single_workspace_channel |
visibility | Indicates whether the channel is public or private . Only public channel analytics is available at this time. | public |
shared_with | Indicates which, if any, workspaces in the same organization this channel is shared with. Presented as an array of JSON objects containing a team_id and a name . Only works with channel_type set to multi_channel_workspace . One of the included team_id values corresponds to the organization itself, such as this E123457 example. | [{"team_id":"T123456","name":"pentameter"},{"team_id":"E123457","name":"markov corp"}] |
is_shared_externally | A boolean value revealing whether the channel is shared with workspaces outside of this organization when set to true . | false |
externally_shared_with_organizations | Indicates which, if any, external organizations this channel is shared with. Presented as an array of JSON objects containing an organization name and a slack domain . Only works with is_shared_externally set to true . | [{"name":"Away Org","domain":"away.enterprise.slack.com"}] |
date_created | The date and time the channel was first created, presented in seconds since the epoch (UNIX time). | 1452719593 |
date_last_active | The date and time the channel last had a message posted in it, presented in seconds since the epoch (UNIX time). | 1584820530 |
total_members_count | A count of total full members & guests | 7 |
full_members_count | A count of people in this channel who have a Full Member account. | 6 |
guest_member_count | A count of people in this channel who have a guest account. | 1 |
messages_posted_count | A count of total messages posted, including messages from apps and integration on the given day | 223 |
messages_posted_by_members_count | A count of total messages posted from Slack Members & guests (human users only) on the given day | 193 |
members_who_posted_count | A count of the unique number of human users (guests & full members) who posted a message on the given day | 3 |
members_who_viewed_count | A count of the unique human users (guests & full members) who read a message on the given day | 225 |
reactions_added_count | A count of emoji reactions left on any message in channel on that given day by human users | 23 |
date | The day in question for the query; the date requested by user for usage metrics | 2020-11-14 |
Public channel metadata
If you're retrieving conversation analytics but want to know more than just the ID of each channel, you can issue a separate request to retrieve bulk metadata about the public channels in the analytics report.
The response is in line-delimited JSON, similar to all other responses in this method, with each line containing an object with these fields. The same admin.analytics:read
scope used typically in this method is all you need to retrieve this data.
Field | Description | Example |
---|---|---|
channel_id | The channel's unique identifier—the very same used in the analytics above | C123ABC456 |
name | The latest name of the channel | ama |
topic | The latest channel topic | Are Jesse's paragraphs too long? |
description | A longer description about the purpose of the channel | Ask our editors all about their favorite literature |
date | These details are current as of this date, which is also when you're making this API call | 2020-11-14 |