How to Get API tokens from all Managed Accounts using REST API

Still need help?

The Atlassian Community is here for you.

Ask the community


 

Platform Notice: Cloud - This article applies to Atlassian products on the cloud platform.

   


Disclaimer

Atlassian does not support this code below, which is provided "AS IS". The goal of this article is to provide a piece of code that illustrates one way to achieve the desired goal.

Feedback provided at the bottom of the page is appreciated, but won't be handled as support.

This can be achieved through the UI by using API token controls.

Summary

The Python script on this page was created to extract a report with all Managed Accounts having API tokens using the Get API tokens endpoint. This example can be used as is but might be a nice place to start and be built upon.


Environment

Jira Cloud

This script requires Python 3 to be installed.


Usage

  1. Export your managed accounts:

    1. Access http://admin.atlassian.com

    2. Go to "Directory" → “Managed accounts

    3. Select “Export Accounts

    4. Download the CSV file from your mail

  2. Manipulate the CSV file:

    1. Open the CSV file

    2. Delete all columns except the “Atlassian ID

    3. Rename the CSV file as “managed_accounts.csv

  3. Set up and execute the script:

    1. The only thing you need to update is the organization authorization token “<yourOrgToken>“ under the “headers” variable. You can find how to create an organization token here

    2. Make sure the script and the managed_accounts.csv are under the same folder

    3. Now you can execute the script with “python3 script.py”, it may take some time if you have a significant number of accounts

    4. Once it's finished, it will create an “output.csv” with only the managed accounts that have API tokens

Script
# Script to search managed accounts that have API tokens
import requests
import csv

# Variables
headers = {
  "Accept": "application/json",
  "Authorization": "Bearer <yourOrgToken>"
}
accounts_checked = 0

def get_account_tokens(account_id):
    global accounts_checked
    url = f"https://api.atlassian.com/users/{account_id}/manage/api-tokens"
    print(f"Getting tokens for account ID: {account_id}")
    response = requests.get(url, headers=headers)

    # Response example (if the account has API tokens):
    # [
    # {
    #     "id": "00000000",
    #     "label": "xxxx",
    #     "createdAt": "2023-10-27T16:17:45.125421997Z",
    #     "disabledStatus": false
    # }
    # ]

    if response.status_code != 200:
        print(f"Failed to get tokens for account ID: {account_id}. Status code: {response.status_code}, Error message: {response.text}")
        return []
    
    accounts_checked += 1
    tokens = []

    for entry in response.json():
        if all(key in entry for key in ['id', 'label', 'createdAt', 'disabledStatus']):
            tokens.append({
                'id': entry['id'],
                'label': entry['label'],
                'createdAt': entry['createdAt'],
                'disabledStatus': entry['disabledStatus']
            })
    return tokens

def check_accounts():
    print("Started")
    with open('managed_accounts.csv', 'r') as csvfile, open('output.csv', 'w', newline='') as outfile:
        datareader = csv.reader(csvfile)
        # Skip the header
        next(datareader, None)
        datawriter = csv.writer(outfile)
        datawriter.writerow(["Account ID", "ID", "Label", "Created At", "Disabled Status"])

        for row in datareader:
            account_id = row[0]
            tokens = get_account_tokens(account_id)

            for token in tokens:
                datawriter.writerow([account_id, token['id'], token['label'], token['createdAt'], token['disabledStatus']])

        print(f"Accounts checked: {accounts_checked}")
    print("output.csv file was created! Check the results.")

check_accounts()
 



Last modified on Nov 8, 2023

Was this helpful?

Yes
No
Provide feedback about this article
Powered by Confluence and Scroll Viewport.