The #1 Desktop GUI Application for Dataverse Web API Operations
A modern, user-friendly Python GUI application that enables you to perform ALL Dataverse Web API operations (CRUD, Batch, Query) regardless of datatype in a single unified interface.
- Create new records with validation
- Read single records or query multiple with filters
- Update existing records with lookups
- Delete records safely with confirmation
- Execute up to 1,000 operations in ONE API call
- Create bulk records 100x faster than individual calls
- Support for POST (Create), PATCH (Update), DELETE
- Load from JSON or CSV files
- Real-time batch status tracking
- OData query builder with visual interface
- Complex filters:
revenue gt 1000000 and status eq 0 - Select specific columns to reduce payload
- Order results by any field
- Set record limits (1-5000)
- Primitives: String, Integer, Decimal, Boolean
- Date/Time: Date, DateTime
- Complex: Lookup (with @odata.bind), Choice, Memo, File
- Smart validation for each datatype
- Helpful examples and tooltips
- Export results as JSON or CSV
- Save query templates for reuse
- Load CSV files for bulk import
- Copy results to clipboard
- Operation history tracking
- Environment variables (.env) for secrets
- MSAL authentication with Entra ID
- No hardcoded credentials
- Secure token handling
- Thread-safe operations
- Smart defaults based on operation type
- Input validation with helpful error messages
- Operation history sidebar
- Tooltip hints for every field
- Example JSON snippets
- Copy-paste ready code blocks
# Clone or download this project
cd dataverse-api-studio
# Create virtual environment
python -m venv .venv
# Activate venv (choose your OS)
source .venv/bin/activate # Linux/macOS
# OR
.\.venv\Scripts\Activate.ps1 # Windows PowerShell
# OR
.\.venv\Scripts\activate.bat # Windows CMD
# Install dependencies
pip install --upgrade pip
pip install -r requirements.txtCreate .env file:
TENANT_ID=your-azure-tenant-id
CLIENT_ID=your-app-registration-client-id
CLIENT_SECRET=your-app-registration-client-secret
# Add your environments (DEV, PROD, SANDBOX, UAT, etc.)
ORG_URL_DEV=https://your-org-dev.crm.dynamics.com
ORG_URL_PROD=https://your-org.crm.dynamics.com
# ORG_URL_SANDBOX=https://your-org-sandbox.crm.dynamics.com
Detailed credential setup guide
python dataverse_api_gui.pyThat's it! π Your Dataverse GUI app is running.
- Select CRUD Operations tab
- Choose CREATE operation
- Table Name:
account - Data JSON:
{
"name": "Contoso Corp",
"websiteurl": "https://contoso.com",
"telephone1": "555-0100"
}- Click β Execute
- View result in Results tab
You just created your first record! β
Instead of 500 API calls, do it in ONE:
- Select β‘ Batch Operations tab
- Paste JSON:
[
{"method": "POST", "url": "/api/data/v9.2/accounts", "data": {"name": "Company 1"}},
{"method": "POST", "url": "/api/data/v9.2/accounts", "data": {"name": "Company 2"}},
... (repeat 498 more)
]- Click β‘ Execute Batch
- Done! All 500 records created in seconds
Performance Comparison:
- Individual API calls: ~500 seconds (8+ minutes) β±οΈ
- Batch operation: ~5 seconds β‘β‘β‘
- Select π Query tab
- Table Name:
account - Filter:
revenue gt 1000000 and statecode eq 0 - Select:
name,revenue,websiteurl - Order By:
revenue desc - Top: 100
- Click π Execute Query
Results: Get your top 100 richest accounts, ordered by revenue!
- Select CRUD Operations tab
- Choose UPDATE operation
- Table Name:
contact - Record ID:
00000000-0000-0000-0000-000000000001 - Data JSON:
{
"firstname": "John",
"lastname": "Doe",
"ownerid@odata.bind": "/systemusers(00000000-0000-0000-0000-000000000099)"
}- Click β Execute
The contact is now assigned to the new owner! β
| Level | Task | Time |
|---|---|---|
| π’ Beginner | Setup credentials & test connection | 5 min |
| π’ Beginner | Create your first record | 2 min |
| π‘ Intermediate | Query with filters | 5 min |
| π‘ Intermediate | Batch create 10 records | 5 min |
| π΄ Advanced | Batch create 1,000 records from CSV | 10 min |
| π΄ Advanced | Complex queries with multiple filters | 10 min |
- QUICK_REFERENCE.md - Keyboard shortcuts, common filters, error fixes
- setup_guide.md - Detailed setup instructions, Azure AD setup
- .env.example - Environment variable template
| Operation | Method | Use Case |
|---|---|---|
| Create | POST | Insert new records |
| Read | GET | Retrieve single or multiple records |
| Update | PATCH | Modify existing records |
| Delete | DELETE | Remove records |
| Batch | POST to $batch | 100-1000 operations in one call |
| Query | GET with $filter | Complex filtering with OData |
β What's Protected:
- Environment variables (.env) not in version control
- MSAL authentication with Entra ID
- No hardcoded credentials
- Secure token handling
- Thread-safe operations
β Best Practices Included:
- Rotate secrets every 3-6 months
- Use separate app registrations per environment
- Grant minimal required permissions
- Audit API calls in Dataverse logs
- Never commit .env file
- JSON: Full structured format with metadata
- CSV: Spreadsheet-ready format
- Templates: Save query configurations
- Clipboard: Quick copy for other tools
- Run query or operation
- Results appear in Results tab
- Click πΎ Export JSON or πΎ Export CSV
- Choose location and filename
- File saved! β
Scenario: Create 1,000 contacts
| Method | API Calls | Time | Status |
|---|---|---|---|
| Individual | 1,000 | ~500 sec | β Slow |
| Batch (500 per) | 2 | ~5 sec | β 100x faster! |
| CSV Batch | 2 | ~5 sec | β 100x faster! |
- Use batch operations for bulk inserts
- Select only needed columns
- Use filters to reduce transfers
- Set appropriate $top value
- Leverage operation history
| Issue | Solution |
|---|---|
| "Not Connected" | Click π Connect after filling credentials |
| "Table not found" | Use logical name (account, not Account) |
| "Invalid GUID" | Verify format: 00000000-0000-0000-0000-000000000000 |
| "Auth failed" | Check TENANT_ID, CLIENT_ID, CLIENT_SECRET in .env |
| "JSON error" | Use JSON validator |
| "Permission denied" | Grant API permissions in Azure AD |
Full troubleshooting guide β
- Python: 3.8 or higher
- OS: Windows, macOS, Linux
- Dataverse: Power Apps environment with Web API enabled
- Azure AD: App registration with API permissions
requests==2.32.3 # HTTP client
msal==1.30.0 # Microsoft Authentication
python-dotenv==1.0.1 # Environment variables
| Type | Example | Format |
|---|---|---|
| String | "Contoso" | Text |
| Integer | 12345 | Whole number |
| Decimal | 123.45 | Number |
| Boolean | true | true/false |
| Date | "2024-01-15" | YYYY-MM-DD |
| DateTime | "2024-01-15 14:30:00" | YYYY-MM-DD HH:MM:SS |
| Lookup | /accounts(guid) |
@odata.bind format |
| Choice | 1 | Integer value |
| Memo | "Long text..." | Multi-line text |
| File | base64 | File content |
{
"ownerid@odata.bind": "/systemusers(guid)",
"parentcustomerid@odata.bind": "/accounts(guid)"
}- Save frequently-used CRUD operations
- Reuse query configurations
- Build library of common operations
- Share templates with team
- 20 most recent operations tracked
- Quick reference sidebar
- Learn from successful queries
- Audit trail for debugging
- Bulk load operations from files
- Standard CSV format
- Automatic format validation
- Progress tracking
- Data Migration: Bulk transfer data between environments
- Testing: Quickly create test records
- Reporting: Query and export data for analysis
- Maintenance: Update multiple records in seconds
- Integration: Automate data synchronization
- Troubleshooting: Test API connectivity and permissions
Want to improve this tool? Ideas welcome!
- Report bugs
- Suggest features
- Share use cases
- Contribute code
MIT License - Free to use and modify for any purpose
dataverse-api-studio/
βββ dataverse_api_gui.py # Main application (2000+ lines)
βββ requirements.txt # Python dependencies
βββ .env.example # Credentials template
βββ .gitignore # Git ignore rules
βββ README.md # This file
βββ QUICK_REFERENCE.md # Quick commands & tips
βββ setup_guide.md # Detailed setup instructions
-
Install (2 min):
git clone <repo> cd dataverse-api-studio python -m venv venv source venv/bin/activate pip install -r requirements.txt
-
Configure (5 min):
cp .env.example .env # Edit .env with your credentials -
Run (1 sec):
python dataverse_api_gui.py
-
Connect (1 click):
- Fill credentials
- Click π Connect
- See β Connected
-
Create Record (10 sec):
- Go to CRUD tab
- Add JSON data
- Click β Execute
- See result!
You're ready to manage Dataverse like a pro! π
- Check QUICK_REFERENCE.md first
- See setup_guide.md for detailed help
- Review troubleshooting section above
- Check Microsoft documentation links
If this tool helps you, please give it a star β
Made with β€οΈ for Dataverse developers
Last Updated: January 2025 Version: 1.0.0
