Changelog
View SourceAll notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
[0.4.0] - 2026-09-05
Fixed
Client- A429 Too Many Requestswas reported as an:upload_error, leavingError.rate_limit_error/2unreachable. It now returns:rate_limit_errorand carries theRetry-Afterheader indetails. This matters for the Reporting API, which Qlik caps at 10 requests per minute.Reports- The module was built against endpoints that do not exist. Verified against the live Reporting API and rewritten around its three real operations:create/2now returns the202 Acceptedpayload (requestId,outputsUrl)get_status/2unchanged, now documented with Qlik's real status valueslist_outputs/2replaces the inventeddownload/2; pages with:page(the API has nonextcursor here) and accepts:filterand:sort- Removed
list/1,get/2anddelete/2— the API has no listing, no fetch-by-id and no delete for report requests.list/1returning 404 is what the README described as a missing entitlement; it was this bug.
Added
Reports.await/2- Polls a request to a terminal status, with:intervaland:timeout, both validated rather than left to crash inProcess.sleep/1Reports.generate/2- Queue, wait and return the outputs in one callReports.download_output/2- Fetches the produced file from its temporary content locationReportTemplates- New module for the Report Templates API:list/1,get/2,create/2,update/3,patch/3,delete/2,download/2Helpers.join_param/1- Comma-joins repeatable query parametersError-:timeoutand:report_failedtypes, withtimeout_error/2andreport_failed/2
Changed
- Breaking:
Reports.list/1,Reports.get/2,Reports.delete/2andReports.download/2are gone.download/2becomesdownload_output/2and takes an output (or its location), not a request id. Helpers.build_query/2becomesbuild_query/3: the third argument overrides thelimit/nextbase for endpoints that page differently. Query parameters now come out in the order they are declared rather than reversed, which changes the query string of every listing endpoint (the parameters and their values are unchanged). List values are comma-joined, so repeatable parameters such assortaccept a list.Client.patch/4accepted a list at runtime but declaredmap(); the spec now admits the JSON Patch documents Qlik's patch endpoints require.Helpersdocumentation examples were never executable — they showed placeholder structs and a module-local alias. They are real doctests now and run in CI.guides/rest-apis.mddocumented the removedReports.list/0andReports.download/1; rewritten for the asynchronous flow and the new Report Templates module.
0.3.5 - 2025-01-18
Fixed
explore_qlik.exs- Updated to use correct NaturalLanguage API functions:- Replaced
get_fields/2withlist_analysis_types/2 - Replaced
get_recommendations/2withrecommend/3 - Fixed
APIKeys.get_configto pass requiredtenant_idparameter
- Replaced
0.3.4 - 2025-01-18
Fixed
NaturalLanguage- Corrected API endpoints to match Qlik's actual API:ask/3now uses/actions/recommend(was/actions/ask)- Added
recommend/3for field-based recommendations - Added
list_analysis_types/2for available analysis types - Removed non-existent
get_fields/2andget_recommendations/2
0.3.3 - 2025-01-18
Fixed
Collections.add_item- Fixed to use{"id": item_id}format (API requires single item)Collections.add_items- Now iterates callingadd_itemfor each item
Added
Items.find_by_resource/3- Helper to lookup item by resource ID and typeItems.list- Added:resource_idfilter option
0.3.2 - 2025-01-18
Fixed
Spaces.update- Fixed to use JSON Patch format required by Qlik APIClient- Added JSON encoding for list request bodies
0.3.1 - 2025-01-17
Fixed
Apps.get_script- Fixed endpoint path from/scriptto/scriptsAPIKeys.get_config- Changed to require tenant_id parameterAPIKeys.update_config- Changed to require tenant_id parameter
0.3.0 - 2025-01-17
Added
QIX Engine Support (WebSocket)
- New
QlikElixir.QIX.Sessionmodule for WebSocket connection management - New
QlikElixir.QIX.Appmodule for high-level data extraction APIlist_sheets/2- List all sheets in an applist_objects/3- List visualization objects on a sheetget_object/3- Get object handleget_layout/3- Get object layoutget_hypercube_data/3- Extract data from visualizations with paginationstream_hypercube_data/3- Stream large datasetsselect_values/4- Make selections in fieldsclear_selections/2- Clear all selectionsevaluate/3- Evaluate Qlik expressions
- New
QlikElixir.QIX.Protocolmodule for JSON-RPC protocol handling
REST API Modules
QlikElixir.REST.Apps- Full Apps API with publish, export, import, scripts, mediaQlikElixir.REST.Spaces- Spaces and role assignmentsQlikElixir.REST.Reloads- Trigger and monitor app reloadsQlikElixir.REST.Users- User management including invitationsQlikElixir.REST.Groups- Group managementQlikElixir.REST.APIKeys- API key managementQlikElixir.REST.Automations- Automation workflows and runsQlikElixir.REST.Webhooks- Event notifications and deliveriesQlikElixir.REST.DataConnections- External data sourcesQlikElixir.REST.Items- Unified resource listingQlikElixir.REST.Collections- Content organization and favoritesQlikElixir.REST.Reports- Report generation and downloadQlikElixir.REST.Tenants- Tenant configurationQlikElixir.REST.Roles- Role definitionsQlikElixir.REST.Audits- Audit event loggingQlikElixir.REST.NaturalLanguage- Conversational analytics (Insight Advisor)
Data Files API Enhancements
change_owner/3- Change file ownerchange_space/3- Move file to another spacebatch_delete/2- Delete multiple filesbatch_change_space/3- Move multiple filesget_quotas/1- Get storage quotaslist_connections/1- List available connections
Infrastructure
QlikElixir.Paginationmodule for cursor-based paginationQlikElixir.REST.Helpersfor shared REST API utilities- Comprehensive documentation with guides
- 360+ tests with full coverage
Changed
- Reorganized codebase under
QlikElixir.REST.*andQlikElixir.QIX.*namespaces - Updated package description
- Improved error handling across all modules
0.2.2 - 2025-01-12
Fixed
- Fixed overwrite functionality to properly respect connection_id filter
- The
handle_overwritefunction now passes connection_id tofind_file_by_name - File search is now filtered by connection_id when provided, preventing cross-space file conflicts
- The
- Added support for
includeAllSpacesoption inlist_filesfunction- Allows listing files across all spaces when set to true
0.2.1 - 2025-01-11
Fixed
- Fixed multipart form structure to match Qlik Cloud API requirements
- Multipart form now uses 'File' and 'Json' fields (capitalized) as required by Qlik API
- The 'Json' field contains metadata including the 'name' parameter as a JSON object
- This fixes upload failures with "Request must contain 'name' parameter" error
- Updated tests to properly verify the multipart form structure
0.2.0 - 2025-01-10
Fixed
- Fixed multipart form upload format to be compatible with Req library
- File options are now properly wrapped in a list:
{content, [filename: filename, content_type: "text/csv"]} - This ensures proper multipart form encoding when uploading CSV files to Qlik Cloud
- File options are now properly wrapped in a list:
0.1.0 - 2024-01-01
Added
- Initial release of QlikElixir
- Core upload functionality for CSV files to Qlik Cloud
- Support for file path and binary content uploads
- Automatic overwrite handling with delete-and-retry logic
- File size validation (500MB limit)
- Comprehensive error handling with custom error types
- List files with pagination support
- Delete files by ID
- Check file existence by name
- Find file by name
- Support for environment variables configuration
- Support for runtime configuration override
- Support for multiple tenant configurations
- Configurable HTTP client options (timeout, retry)
- Full test coverage with Bypass for HTTP mocking
- Comprehensive documentation and examples