Python Automation Tool for Exalate API: Bulk Sync, Lookups, Scheduling & More

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_JWT in .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 True as 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 CodeDownload ZIP
  • Extract the ZIP file
  • Navigate to the SwaggerHelper folder

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 True will override the selected mode and return a list of all available connections on the node
  • Useful to quickly retrieve your CONNECTION_ID before 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:

  1. Open your node in the browser
  2. Open Developer Tools
  3. Go to the Network tab
  4. Find a request and copy the X-exalate-jwt header

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 .env when 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

GitHub

Exalate API Helper

1 Like

Happy to hear feedback or additional use cases others might have.
I’m currently working on extending authentication (OAuth support for more connectors).

Roadmap / Ideas for improvement

  • Add dynamic JWT fetching for more connectors (Jira, Zendesk, ServiceNow, Salesforce, etc)
  • Introduce OAuth support where possible instead of relying on static tokens
  • Improve error handling and retry logic for failed syncs
  • Add filtering options for CRON mode (e.g. by project, label, status)
  • Support additional input formats beyond CSV (JSON, API-driven input)
  • Package the tool for easier installation (CLI or Docker)

If anyone has specific needs or edge cases, feel free to share. Happy to iterate on this.