Overview
This Python tool allows you to interact with your Exalate node or instance (Jira, Zendesk, Salesforce, Azure DevOps, ServiceNow, etc.) to:
- Query Exalate endpoints (e.g. connections)
- Automatically trigger daily syncs for newly created issues
- Process bulk issue syncs via CSV
It is designed to complement Exalate’s native triggers, especially when:
- You need to sync issues on a specific schedule
- Native triggers hit API limits (e.g. 1000+ issues)
The tool is modular, safe, and easy to extend to other use cases.
Please have a look at the code here
GitHub README.md
Use Cases
Daily scheduled syncs
Automatically sync all issues created within a specific timeframe using cron jobs. Useful when native triggers do not reliably capture all tickets.
Bulk sync via CSV
Trigger syncs in batches from a CSV file containing issue IDs.
Quick lookups
Inspect connections and other Exalate metadata via the API without manual navigation.
How It Works
- NodeClient connects to your instance (Jira, Zendesk, Azure DevOps, etc.)
- ExalateClient handles API requests to your Exalate node
Authentication
- For supported nodes like Azure DevOps, the script can fetch JWT dynamically using a PAT
- For other nodes, you provide
EXALATE_JWTin.env
The script automatically checks if your JWT is expired and prints its validity.
Modes
- GET / POST / PUT: interact with Exalate API endpoints depending on your use case
- CRON: daily automated sync of issues created today (ADO only at this time.)
- BATCH_CSV: bulk sync from CSV
- List Connections (override mode): passing
Trueas a parameter will return all available connections regardless of the selected request method
Quick Start
1. Download the project
Download the ZIP from GitHub:
Exalate API Batch Tool
- Click Code → Download ZIP
- Extract the ZIP file
- Navigate to the
SwaggerHelperfolder
Alternatively, you can browse the repository directly if you want to inspect the code.
2. Set up Python environment
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
3. Configure .env
NODE_URL=“https://.exalate.cloud”
EXALATE_JWT=“your-jwt-token-here”
Optional for CRON mode (Azure DevOps)
ADO_ORG=“your-org”
ADO_PAT=“your-pat”
ADO_PROJECT=“your-project”
4. Run the script
python3 init.py
Optional:
python3 init.py True
- Passing
Truewill override the selected mode and return a list of all available connections on the node - Useful to quickly retrieve your
CONNECTION_IDbefore running sync operations
5. Schedule daily run (cron)
0 18 * * * cd /path/to/SwaggerHelper && /path/to/SwaggerHelper/venv/bin/python3 init.py >> /path/to/logs/cron.log 2>&1
Examples
Test JWT with curl
curl -H "X-exalate-jwt: <your-jwt-token>" https://<your-node>.exalate.cloud/rest/issuehub/4.0/connections
CSV format
ID
101
102
103
Example output
Connecting to node…
Authenticated
Found 3 items
Starting sync…
Processing 101… success
Processing 102… success
Processing 103… failed (not found)
Batch complete
Success: 2
Failed: 1
Report saved to exalate_report_.csv
JWT Notes
To make API requests you need a JWT token in the X-exalate-jwt header.
How to get it:
- Open your node in the browser
- Open Developer Tools
- Go to the Network tab
- Find a request and copy the
X-exalate-jwtheader
Add it to your .env:
EXALATE_JWT=“your-jwt-token”
Important:
- If your node does not support dynamic JWT fetching, you must update the token manually when it expires
- The script will tell you if the token is expired and show its validity
FAQ / Gotchas
JWT expiration
- The script checks if your JWT is expired
- Update it in
.envwhen needed - Azure DevOps can fetch it dynamically
CSV formatting
- Must contain a column named
ID - Empty rows are ignored
- Use UTF-8 encoding
Large batches
- Native triggers may cap around 1000 issues
- This tool processes issues in batches
Node compatibility
- Works with Jira, Zendesk, Salesforce, Azure DevOps, ServiceNow
- Some require static JWT
Reporting
- Terminal shows live progress
- CSV report contains full results
Project Structure
exalate-api-automation/
├── .env
├── init.py
├── requirements.txt
├── tickets.csv
├── exalate_report_<timestamp>.csv
└── client/
├──__init__.py
├── api_client.py
├── ado_client.py
└── fetch_jwt.py