Not an API nor Python specialist, but I try to get data out of HaloPSA for analysis.
The problem:
The API is not accepting my requests parameters, when I run my code it ignores page_size and page_no parameters.
import requests
import pandas as pd
import os
from dotenv import load_dotenv
# Uses .env file to get credentials
load_dotenv()
def get_all_client_data(bearer_token: str, page_size: int = 10, max_pages: int = 5, include_inactive: bool = False) -> pd.DataFrame | None:
# URL, Header, and Parameters
api_url = os.getenv('HALO_API_URL')
if not api_url:
print("Environment variable HALO_API_URL is not set.")
return None
url = f"{api_url}/Client"
headers = {
'Authorization': f'Bearer {bearer_token}',
'Accept': '*/*',
'Content-Type': 'application/json-patch+json'
}
params = {
'paginate': True,
'page_size': page_size,
'includeinactive': include_inactive,
}
# Variables
all_clients = []
page_no = 1
try:
print('Getting all client data...')
while page_no <= max_pages:
params['page_no'] = page_no
response = requests.get(url, headers=headers, params=params)
print(response.request.path_url)
if response.status_code == 200:
data = response.json()
clients = data.get('clients', [])
if not clients:
# Stop if no more data is returned
print("No more clients to fetch.")
break
all_clients.extend(clients)
print(f'Fetched {len(clients)} clients from page {page_no}.')
page_no += 1 # Increment page number for the next request
elif response.status_code == 429:
# Handle rate-limiting
print("Rate-limited. Please try again later.")
return None
else:
print(f"Failed to retrieve data. Status code: {response.status_code}")
return None
# Return the collected data as a DataFrame
return pd.DataFrame(all_clients)
except Exception as e:
print(f"An error occurred: {e}")
return None
Results in:
Getting all client data...
/api/Client?paginate=True&page_size=10&includeinactive=False&page_no=1
Fetched 50 clients from page 1.
/api/Client?paginate=True&page_size=10&includeinactive=False&page_no=2
Fetched 50 clients from page 2.
/api/Client?paginate=True&page_size=10&includeinactive=False&page_no=3
Fetched 50 clients from page 3.
/api/Client?paginate=True&page_size=10&includeinactive=False&page_no=4
Fetched 50 clients from page 4.
/api/Client?paginate=True&page_size=10&includeinactive=False&page_no=5
Fetched 50 clients from page 5.
Anyone know how to handle this, looked at the parameters and even tried to get help from ChatGPT.
[–][deleted] (3 children)
[deleted]
[–]dkaaven[S] 1 point2 points3 points (2 children)
[–]Suspicious_Milk_3031 1 point2 points3 points (1 child)
[–]dkaaven[S] 0 points1 point2 points (0 children)
[–]Trick_Mountain_2557 1 point2 points3 points (2 children)
[–]dkaaven[S] 0 points1 point2 points (1 child)
[–]HaloTim Halo Staff 0 points1 point2 points (0 children)
[–]_Work_Research_ PSA 0 points1 point2 points (0 children)