Python SDK for Tyler Technologies Electronic Filing Manager (EFM) Services
Project description
Tyler EFM Client - Python SDK
A production-ready Python SDK for integrating with Tyler Technologies Electronic Filing Manager (EFM) services. This package simplifies authentication and SOAP service calls for Electronic Court Filing (ECF) systems.
🚀 Features
- Simple Authentication: One method to authenticate with Tyler EFM services
- Flexible SOAP Operations: Call any Tyler EFM SOAP operation with automatic security handling
- WS-Security Support: Automatic RSA-SHA1/SHA1 digital signatures (Tyler legacy compatibility)
- Certificate Management: Automatic PFX certificate handling and cleanup
- Response Formats: Choose between XML and JSON response formats
- Production Ready: Built from working Tyler ECF 5.0 integration code
- Type Hints: Full typing support for better development experience
📦 Installation
Install the package using pip:
pip install tyler-efm-client
Requirements
- Python 3.8+
- Valid Tyler EFM PFX certificate
- Access to Tyler EFM services (staging or production)
🔧 Quick Start
1. Configuration Setup
Copy config.example.json to config.json and update with your credentials:
{
"service": {
"endpoint": "https://georgia-stage.tylertech.cloud/EFM/EFMUserService.svc",
"court_service_url": "https://georgia-stage.tylertech.cloud/efm/v5/CourtRecordService.svc"
},
"certificate": {
"pfx_file": "YOUR_CERTIFICATE.pfx",
"pfx_password": "YOUR_PFX_PASSWORD"
},
"credentials": {
"email": "your-email@domain.com",
"password": "your-password"
}
}
Note: The config.json file is excluded from version control for security.
2. Basic Authentication
from tyler_efm_client import TylerEFMClient
# Initialize client with config file
client = TylerEFMClient('config.json')
# Authenticate using config
auth_result = client.authenticate()
if auth_result.success:
print(f"Password Hash: {auth_result.password_hash}")
print(f"User: {auth_result.first_name} {auth_result.last_name}")
else:
print(f"Error: {auth_result.error_message}")
Service Operations
# Call GetCaseList operation
soap_body = '''<wrappers:GetCaseListRequest xmlns:wrappers="https://docs.oasis-open.org/legalxml-courtfiling/ns/v5.0/wrappers">
<!-- Your SOAP body content -->
</wrappers:GetCaseListRequest>'''
response = client.call_service(
base_url="https://your-tyler-server.com/efm/v5/CourtRecordService.svc",
password_hash=auth_result.password_hash,
operation="GetCaseList",
soap_body=soap_body,
user_email="your-email@example.com",
return_json=True # Get JSON response instead of XML
)
if response.success:
print("Service call successful!")
if response.json_data:
# Work with JSON data
print(response.json_data)
else:
# Work with raw XML
print(response.raw_xml)
📚 API Reference
TylerEFMClient
The main client class for Tyler EFM operations.
authenticate(base_url, pfx_file, pfx_password, user_email, user_password)
Authenticate with Tyler EFM User Service.
Parameters:
base_url(str): Base URL for the EFM User Servicepfx_file(str): Path to the PFX certificate filepfx_password(str): Password for the PFX certificateuser_email(str): User's email addressuser_password(str): User's password
Returns: AuthenticationResult object with:
success(bool): Whether authentication succeededpassword_hash(str): Password hash for subsequent service callsuser_id(str): User's unique identifierfirst_name(str): User's first namelast_name(str): User's last nameemail(str): User's emailexpiration_date(str): Token expiration dateerror_code(str): Error code if authentication failederror_message(str): Error message if authentication failed
call_service(base_url, password_hash, operation, soap_body, **kwargs)
Call any Tyler EFM SOAP service operation.
Parameters:
base_url(str): Base URL for the EFM servicepassword_hash(str): Password hash from authenticationoperation(str): Name of the SOAP operationsoap_body(str): SOAP body content as XML stringuser_email(str, optional): User's email (required for Court Record Service)pfx_file(str, optional): Path to PFX certificate if not from authenticationpfx_password(str, optional): PFX password if not from authenticationreturn_json(bool, optional): Return JSON instead of XML (default: False)soap_action(str, optional): Custom SOAP action header
Returns: ServiceResponse object with:
success(bool): Whether the service call succeededstatus_code(int): HTTP status coderaw_xml(str): Raw XML responsejson_data(dict, optional): JSON representation of response if requestederror_message(str, optional): Error message if call failed
🏗️ Architecture
This SDK implements Tyler's exact ECF 5.0 requirements:
Authentication (User Service)
- WS-Security: Digital signatures using RSA-SHA1/SHA1 (Tyler legacy requirement)
- Certificate Auth: Mutual TLS using PFX certificates
- SOAP Structure: Exact Tyler-compatible XML namespace handling
Court Record Service Operations
- UserNameHeader: Special header structure required by Court Record Service
- No Namespace Prefix: Critical requirement - UserNameHeader must not have namespace prefix
- Header Order: UserNameHeader must be first header element
- Password Hash: Uses hashed password from authentication, not plain password
🔒 Security Features
- Automatic Certificate Handling: PFX files are processed and cleaned up automatically
- WS-Security Signatures: RSA-SHA1 digital signatures for message integrity
- Legacy Algorithm Support: SHA1 and RSA-SHA1 for Tyler compatibility
- Secure Cleanup: Temporary certificate files are automatically removed
- HTTPS Only: All communications use HTTPS with certificate verification
📖 Examples
The examples/ directory contains complete working examples:
authentication_example.py- Basic authenticationgetcaselist_example.py- GetCaseList operationcomplete_workflow_example.py- Full workflow with multiple operations
🐛 Error Handling
The SDK provides specific exception types:
from tyler_efm_client import TylerEFMError, TylerAuthenticationError
try:
auth_result = client.authenticate(...)
except TylerAuthenticationError as e:
print(f"Authentication failed: {e}")
except TylerEFMError as e:
print(f"EFM service error: {e}")
🧪 Testing
The SDK is built from working Tyler ECF integration code and tested against:
- Tyler Georgia staging environment
- Production Tyler ECF 5.0 systems
- Multiple certificate types and configurations
📋 Requirements
System Requirements
- Python 3.8 or higher
- OpenSSL for certificate processing
- Network access to Tyler EFM services
Tyler Requirements
- Valid Tyler EFM account and credentials
- PFX certificate file from Tyler Technologies
- Appropriate service URLs (staging or production)
🚀 Releases & Versioning
This package uses optimized automated building through GitHub Actions with cross-platform testing and fast build processes.
Quick Release Guide
Alpha/Development Releases:
- Go to GitHub Actions → "Publish Python Package" → "Run workflow"
- Enter version like:
1.0.0a2,1.0.0b1 - Publishes to TestPyPI first, then PyPI
Production Releases:
# Create a version tag and GitHub release
git tag v1.0.0
git push origin v1.0.0
# Then create GitHub Release using the tag
Testing Releases:
# Install from TestPyPI for validation
pip install -i https://test.pypi.org/simple/ tyler-efm-client
📖 See VERSIONING.md for complete build and versioning guide
Build Features
- Fast Builds: Uses pre-compiled wheels to prevent timeout issues
- Cross-Platform: Tests on Windows and Linux
- Integration Testing: Real Tyler EFM credential testing via GitHub secrets
- Security Scanning: Automated vulnerability checks
🤝 Support
This SDK is based on the working implementation documented in the Tyler ECF integration project. For issues:
- Check the examples for proper usage patterns
- Verify your certificate and credentials
- Ensure you're using the correct Tyler service URLs
- Review the Tyler ECF 5.0 documentation
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🏢 About Tyler Technologies
Tyler Technologies is a leading provider of integrated software and technology services to the public sector. Learn more at tylertech.com.
Built with ❤️ for the Tyler ECF community
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tyler_efm_client-1.0.0a2.tar.gz.
File metadata
- Download URL: tyler_efm_client-1.0.0a2.tar.gz
- Upload date:
- Size: 18.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2f456f4dcaddb2af2bf05644908832896b2f159215a980ef9790c6afabe1b29
|
|
| MD5 |
1da73ad911c1330d6eb98fb9a1555fd1
|
|
| BLAKE2b-256 |
73fcf83b4f28c7551337ca2e07fce593ae2aefcbd4df849257ea8b46db511fd8
|
File details
Details for the file tyler_efm_client-1.0.0a2-py3-none-any.whl.
File metadata
- Download URL: tyler_efm_client-1.0.0a2-py3-none-any.whl
- Upload date:
- Size: 14.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
17083822a12d3cc82fee69a96749558ad307fdc1b31e3b97b8b24fd524af3402
|
|
| MD5 |
fa5682284287becf02f8634aedf0aa96
|
|
| BLAKE2b-256 |
902af393d6ea9feb1be32528f376bb7d410cbb9de4f5877395de553e59dd75cf
|