Skip to content

Instantly share code, notes, and snippets.

@srelbo
Last active May 18, 2024 15:49
Show Gist options
  • Save srelbo/9fcee7b0731abf07ee615a00e1948329 to your computer and use it in GitHub Desktop.
Save srelbo/9fcee7b0731abf07ee615a00e1948329 to your computer and use it in GitHub Desktop.
Query clerk to get all users into a CSV file for https://loops.so import
import os
import requests
import csv
import time
def fetch_all_users(api_key):
url = "https://api.clerk.dev/v1/users"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
offset = 0
limit = 500
all_users = []
while True:
params = {
"limit": limit,
"offset": offset
}
while True:
response = None
try:
response = requests.get(url, headers=headers, params=params)
# If the response was successful, no Exception will be raised
response.raise_for_status()
except requests.exceptions.HTTPError as err:
if response.status_code == 429:
print("Rate limit exceeded. Waiting for 60 seconds before retrying...")
time.sleep(60)
continue
else:
raise SystemExit(err)
break
data = response.json()
loops_data = []
for entry in data:
user_data = {
'first_name': entry['first_name'],
'last_name': entry['last_name'],
'email': entry['email_addresses'][0]['email_address'],
'user_group': "Clerk users"
}
loops_data.append(user_data)
all_users.extend(loops_data)
if len(data) < limit:
break
offset += limit
time.sleep(1) # To prevent rate limiting
return all_users
def write_to_csv(users):
keys = users[0].keys()
with open('users.csv', 'w', newline='') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(users)
if __name__ == "__main__":
_api_key = os.getenv("CLERK_API_KEY")
_users = fetch_all_users(_api_key)
write_to_csv(_users)
@tarasyarema
Copy link

Thanks! Saved me some minutes jaja

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment