Search our knowledge base, curated by global Support, for answers ranging from account questions to troubleshooting error messages.
QMSEDX is a community-provided customization. Qlik does not provide support or direct assistance for this solution. For assistance, contact our Professional Services or engage in our QlikView Integrations forum.
EDX is a trigger mechanism for starting a QlikView reload or task from an external source, such as a scheduler or application. To start a task using EDX the QlikView Management API must be used and this is delivered in the form of a Web Service.
QMSEDX is a third-party app designed to perform said mechanism. For more information, see Using EDX in QlikView 11.
QMSEDX is an open source tool that is developed by CwolfX on sourceforge where you can find more information and maybe support: https://sourceforge.net/p/qmsedx/wiki/Home/ Also keep in minde that as it is an opensource it could have other developers making there version available online, juste make sure to contact the one that made the version you are using
For custom developments. Documentation about QMS API is available at Qlik Help.
This video will demonstrate how to use Qlik-CLI for SaaS to migrate Apps from your on-premises Qlik Sense environment to your Qlik Sense SaaS edition. Qlik-CLI makes it possible for scripting and automating App migration.
Using the change-owner REST API call for app objects or the qlik-cli app object change-owner command results in:
403 - Forbidden (empty response)
This is a current limitation. As specified on the API call information page, the user running the call must be the owner of the object. Even tenant admins won't be able to run the call, if they are not the object's current owners.
As the qlik-cli command uses the same API call, the behaviour is identical.
The user running the call/command is not the object owner.
This is a sample to create ODAG links with the ODAG API using PowerShell.
Qlik Sense Enterprise on Windows
$body = '{"name": "ODAGLink",
"selectionApp": "67a7d998-fdcb-414f-9049-7b6350234b9d",
"templateApp": "13617037-cfa5-4205-93a7-87aac10c1676",
"rowEstExpr": "Count(Dim1)",
"properties": {
"rowEstRange": [
{
"context": "*",
"highBound": 100000
}]
}
}'
$hdrs = @{}
$hdrs.Add("X-Qlik-xrfkey","12345678qwertyui")
$hdrs.Add("Authorization","Bearer eyJhbGciOi...GYyMdkVoQLxRFYP7r7mLbGaamCwUIApcHtUc7b3LEg")
$url = "https://qlikserver1.domain.local/jwt/api/odag/v1/links?xrfkey=12345678qwertyui"
Invoke-RestMethod -Uri $url -Method Post -Headers $hdrs -Body $body -ContentType 'application/json'
#Paste the ticket here
$ticket='5PEtidGu2GjhLn2k'
$body = '{"name": "ODAGLink",
"selectionApp": "67a7d998-fdcb-414f-9049-7b6350234b9d",
"templateApp": "13617037-cfa5-4205-93a7-87aac10c1676",
"rowEstExpr": "Count(Dim1)",
"properties": {
"rowEstRange": [
{
"context": "*",
"highBound": 100000
}]
}
}'
$hdrs = @{}
$hdrs.Add("X-Qlik-xrfkey","12345678qwertyui")
$url = "https://qlikserver1.domain.local/api/odag/v1/links?qlikticket="+$ticket
Invoke-RestMethod -Uri $url -Method Post -Headers $hdrs -Body $body -ContentType 'application/json'
$body = '{"name": "ODAGLink",
"selectionApp": "67a7d998-fdcb-414f-9049-7b6350234b9d",
"templateApp": "13617037-cfa5-4205-93a7-87aac10c1676",
"rowEstExpr": "Count(Dim1)",
"properties": {
"rowEstRange": [
{
"context": "*",
"highBound": 100000
}]
}
}'
$hdrs = @{}
$hdrs.Add("X-Qlik-User","UserDirectory=DOMAIN;UserId=Administrator")
$cert = Get-ChildItem -Path "Cert:\CurrentUser\My" | Where {$_.Subject -like '*QlikClient*'}
$url = "https://qlikserver1.domain.local:9098/v1/links"
Invoke-RestMethod -Uri $url -Method Post -Headers $hdrs -Body $body -ContentType 'application/json' -Certificate $cert
This article explains how to connect to the QMS API using HTTPS with the QVClient certificate.
Prerequisites:
In Visual Studio, once you have followed the procedure in QlikView: Connect to QMS API with Visual Studio then you can just right-click on the QMS API reference in the solution explorer and choose "Configure service reference".
Modify "http" to "https" in the connection address.
In Visual Studio solution explorer, find App.config and double-click to edit it.
This customization is provided as is. Qlik Support cannot provide continued support of the solution. For assistance, reach out to our Professional Services or engage in our active Integrations forum.
Add this section to the app.config inside the <system.serviceModel> ... </system.serviceModel> tags:
<behaviors>
<endpointBehaviors>
<behavior name="ServiceKeyEndpointBehavior">
<clientCredentials>
<clientCertificate findValue="CN=QVProxy" x509FindType="FindBySubjectDistinguishedName" storeLocation="LocalMachine" storeName="My" />
<serviceCertificate>
<authentication certificateValidationMode="ChainTrust" revocationMode="NoCheck"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
Note:If you get the following error "The client certificate is not provided. Specify a client certificate in ClientCredentials." add behaviorConfiguration="ServiceKeyEndpointBehavior" to all of the "endpoint" sections in the app.config
Deleting spaces through the Qlik Cloud management console requires the space to be empty. This is to ensure that content (apps, data) is not orphaned.
However, APIs do not follow the same checks as the management console and can therefore be used to accidentally delete a space which still has content in it. The content is then orphaned.
To delete the spaces gracefully, it is necessary to delete each resource in the space first.
Refer to the below links for deleting apps and other resources:
DELETE app: https://qlik.dev/apis/rest/apps/#%23%2Fentries%2Fv1%2Fapps%2F-appId-delete
DELETE item: https://qlik.dev/apis/rest/items/#%23%2Fentries%2Fv1%2Fitems%2F-itemId-delete
This is currently working as designed. Qlik is investigating the possibility of adjusting the current workflow, but as it stands, the prompt for space deletion is implemented as a functionally of the management console and is not a part of the API. APIs, in general, are intended to be used in a standalone capacity and will therefore often bypass checks.
QB-21853
Qlik Sense Repository Service API (QRS API) contains all data and configuration information for a Qlik Sense site. The data is normally added and updated using the Qlik Management Console (QMC) or a Qlik Sense client, but it is also possible to communicate directly with the QRS using its API. This enables the automation of a range of tasks, for example:
Using Xrfkey header
A common vulnerability in web clients is cross-site request forgery, which lets an attacker impersonate a user when accessing a system. Thus we use the Xrfkey to prevent that, without Xrfkey being set in the URL the server will send back a message saying: XSRF prevention check failed. Possible XSRF discovered.
Environments:
Note: Please note that this example is related to token-based licenses and in case this is needed to be configured with Professional Analyser type of licenses you might need to use the following API calls:
Furthermore, combining this with QlikCli and in case you need to monitor and more specifically remove users, the following link from community might be useful: Deallocation of Qlik Sense License
This procedure has been tested in a range of Qlik Sense Enterprise on Windows versions.
$hdrs = @{} $hdrs.Add("X-Qlik-xrfkey","12345678qwertyui") $url = "https://qlikserver1.domain.local/qrs/about?xrfkey=12345678qwertyui" Invoke-RestMethod -Uri $url -Method Get -Headers $hdrs -UseDefaultCredentials
$hdrs = @{} $hdrs.Add("X-Qlik-xrfkey","12345678qwertyui") $hdrs.Add("X-Qlik-User","UserDirectory=DOMAIN;UserId=Administrator") $cert = Get-ChildItem -Path "Cert:\CurrentUser\My" | Where {$_.Subject -like '*QlikClient*'} $url = "https://qlikserver1.domain.local:4242/qrs/about?xrfkey=12345678qwertyui" Invoke-RestMethod -Uri $url -Method Get -Headers $hdrs -Certificate $cert
Execute the command.
A possible response for the 2 above scripts may look like this (Note that the JSON string is automatically converted to a PSCustomObject by PowerShell) :
buildVersion : 23.11.2.0 buildDate : 9/20/2013 10:09:00 AM databaseProvider : Devart.Data.PostgreSql nodeType : 1 sharedPersistence : True requiresBootstrap : False singleNodeOnly : False schemaPath : About
If there are several certificates from different Qlik Sense server, these can not be fetched by subject as there will have several certificates with subject QlikClient and that script will fail as it will return as array of certificates instead of a single certificate. In that case, fetch the certificate by thumbprint. This required more Powershell knowledge, but an example can be found here: How to find certificates by thumbprint or name with powershell
Qlik Enterprise Manager allows Personal Access Token authentication with OIDC. We provide detailed instructions on how to integrate with Okta. See Setting up Personal Access Token authentication for the API for more information.
Qlik Enterprise Manager OIDC integration does not currently support Azure Active Directory.
See Support AzureAD for OIDC access to API for the status of a suggestion to support Azure Active Directory. You can track its status there (open, closed, delivered) and vote on it.
QB-21476
RECOB-7510
This Techspert Talks session addresses:
Q: I understand that I can invoke a production model through an API from Python. Are there any limitations to doing this?
A: We provide the APIs to invoke a model for real time predictions. These can be called from any platform/language like all Qlik’s APIs. In the case of python, the customer would call this using a library such as “requests”. This functionality is only available for customers on a paid for tier. More details can be found here.
Q: Is there a maximum amount of data sets which can be used for ML experiments?
A: For each ML experiment, it uses one dataset. There is no set limit on the number of datasets made available in Qlik Catalog, but there are limitations on the size of datasets.
Regarding dataset size, there are 2 limits in play:
1. The dataset size limit as set in the tier model.
a. Included: 100K cells
b. StartUp: 1M cells
c. ScaleUp: 10M cells
d. Premier: 100M cells
The data must be profiled by the catalog and this currently has a limit of 1GB file size. By using QVD or Parquet data files you can process more data.
Resources:
How To Get Started with Qlik AutoML
Qlik AutoML Demonstration Overview
Introduction to Qlik AutoML (Learning.Qlik.com)
Machine learning with Qlik AutoML (Help.Qlik.com)
Qlik AutoML on Qlik Cloud - sample data
Qlik Continuous Classroom AutoML courses
This article provides an example on how to use the Qlik Enterprise Manager Python API to start a task from timestamp. The example runs a task by cdcposition using Python API.
This customization is provided as is. Qlik Support cannot provide continued support for the solution. For assistance, reach out to Professional Services.
"""
@author: Vinay Vitta
"""
import json, glob, os, sys, base64, requests, re, time, urllib3
from datetime import datetime
from datetime import timedelta
from calendar import monthrange
from enum import Enum
from copy import copy
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # Don't want to print out warnings
RepServer='79' #change Replicate Server name
RepTask='mysql2file' #change for task name
api_base_url = "https://snsql2014a/attunityenterprisemanager/api/v1/" #change for QEM server
auth_string = "Basic c25zcWwyMDE0YVxhZG1pbmlzdHJhdG9yOmhheWV6aXJh" # Change for base64 hash user password ,, make sure to keep the Basic
login_headers = {}
login_headers["Authorization"] = auth_string
print(login_headers)
session = requests.Session()
response = session.get(url=api_base_url + 'login', headers=login_headers, verify=False)
# print(response.json())
if response.status_code == 200:
session_id = response.headers['EnterpriseManager.APISessionID']
api_session_header = {}
api_session_header["EnterpriseManager.APISessionID"] = session_id
session.headers.update(api_session_header)
urlResumeTime='servers/' + RepServer + '/tasks/' + RepTask + '?action=run&option=RESUME_PROCESSING_FROM_TIMESTAMP'
print(api_base_url + urlResumeTime)
data = {"cdcposition": "2023-07-14T01:01:01"} # change for the CDCposition
resumeTimeResponse = session.post(url=api_base_url + urlResumeTime, headers=login_headers, json=data, verify=False)
print(resumeTimeResponse.headers)
Example from the log file of the task executing from timestamp:
00008888: 2023-07-17T16:57:34 [TASK_MANAGER ]I: Task 'mysql2file' running CDC only in fresh start mode, starting from log position: 'timestamp:2023-07-14T01:01:01' (UTC). (replicationtask.c:1770)
00008888: 2023-07-17T16:57:34 [TASK_MANAGER ]I: Feature flags for process are: (ar_feature_flags.c:232)
Can Qlik Sense reload tasks be triggered using the APIs?
Qlik Sense has an extensive set of APIs available to interact with.
For method definitions, see for example:
APIs for Qlik Sense Enterprise on Windows > API reference for Windows > Qlik Sense Repository Service API > QRS API endpoints (subset) > App: Reload
APIs for Qlik Sense Enterprise on Windows > API reference for Windows > Qlik Sense Repository Service API > QRS API endpoints (subset) > Reload task: Create
Application examples can be found on our Qlik Community and on Qlik Developer via the links below.
Please note that examples are provided as is and may need updates depending on the version deployed. Support is given by the original developer of the example. For assistance, reach out to our Professional Services or engage in our active Integrations forums.
Qlik Sense Enterprise on Windows , all versions
Security vulnerability scan report may refer to "System Information Leak" in the response from the About Service API end-point /api/about/v1/thirdParty.
This API returns a list of third-party software that is installed in the product. Details include information about copyright, version, licensing, and legal notices.
The disclaimer text of some third-party components may include IP address references. These references come from the third-party provider's disclaimer or open-source license details. The IP address references do not refer to details from the installed environment.
For example, an internal IP address (10.x.x.x) is referred to in the disclaimer text for the Torch Cephes Math Library. This reference is part of the library's open-source license https://github.com/deepmind/torch-cephes/blob/master/LICENSE.txt.
Third-party software details contain disclaimer text as required for the third-party software provider.
IP references in third-party software disclaimers can be considered false-positive test results.
Qlik can not alter the third-party vendor disclaimers.
Third Party: Get | Qlik Sense for developers Help
False Positive
From this URL (https://www.url-encode-decode.com/base64-encode-decode/) encode your credentials
Format:
To encode enter your Qlik Enterprise Manager credentials in below format.
domain\username:password
Example of encoded code:
domain\username:password
ZG9tYWluXHVzZXJuYW1lOnBhc3N3b3Jk
To get session ID:
Change the encode value (you generated from above step) and server on the URL below
Open command prompt and enter the command below after you modify it:
curl -i -k --header "Authorization: Basic ZG9tYWluXHVzZXJuYW1lOnBhc3N3b3Jk" https://servername/attunityenterprisemanager/api/v1/login
This article is provided as a sample on how to use the Engine API (Enigma.js) to bulk update the theme used on apps in Qlik Sense Client Managed.
Workflow of the sample:
This customization is provided as is. Qlik Support cannot provide continued support of the solution. For assistance, reach out to our Professional Services or engage in our active Integrations forum.
Copy the following script in a file called "change-theme.js" (Change the value of EngineHost to your server name)
const WebSocket = require('ws');
const enigma = require('enigma.js');
const schema = require('enigma.js/schemas/12.170.2.json');
const fs = require('fs');
const path = require('path');
const engineHost = 'qlikserver1.domain.local';
const enginePort = 4747;
const appId = 'engineData';
const userDirectory = 'INTERNAL';
const userId = 'sa_api';
const certificatesPath = './';
const readCert = (filename) => fs.readFileSync(path.resolve(__dirname, certificatesPath, filename));
function openSession(){
return enigma.create({
schema,
url: `wss://${engineHost}:${enginePort}/app/${appId}`,
createSocket: (url) => new WebSocket(url, {
ca: [readCert('root.pem')],
key: readCert('client_key.pem'),
cert: readCert('client.pem'),
headers: {
'X-Qlik-User': `UserDirectory=${encodeURIComponent(userDirectory)}; UserId=${encodeURIComponent(userId)}`,
},
}),
})
}
(async () => {
try {
const session = openSession();
const qix = await session.open();
const apps = await qix.getDocList();
console.log(apps.qDocId);
await session.close();
for (var p in apps) {
console.log(apps[p].qDocId);
const session = openSession();
const params0 = {"qInfo":{"qId":"AppPropsList","qType":"AppPropsList"},"qAppObjectListDef":{"qType":"appprops","qData":{"sheetTitleBgColor":"/sheetTitleBgColor","sheetTitleGradientColor":"/sheetTitleGradientColor","sheetTitleColor":"/sheetTitleColor","sheetLogoThumbnail":"/sheetLogoThumbnail","sheetLogoPosition":"/sheetLogoPosition","rtl":"/rtl","theme":"/theme","disableCellNavMenu":"/disableCellNavMenu","chartAnimations":"/chartAnimations"}}};
var themename =`\"${process.argv[2]}\"`;
const params1 = {
"qPatches": [
{
"qOp": "replace",
"qPath": "/theme",
"qValue": themename
}
],
"qSoftPatch": false
};
const qix = await session.open();
var app = await qix.openDoc(apps[p].qDocId);
const objsession = await app.createSessionObject(params0);
const objLayout = await objsession.getLayout();
const AppPropObject = await app.getObject(objLayout.qAppObjectList.qItems[0].qInfo.qId)
console.log(objLayout.qAppObjectList.qItems[0].qInfo.qId);
await AppPropObject.applyPatches(params1);
const resultsession = await AppPropObject.getProperties();
console.log(resultsession);
await app.doSave();
await session.close();
}
console.log('Session closed.');
} catch (err) {
console.log('Whoops! An error occurred.', err);
process.exit(1);
}
})();
Copy the file in a folder and type the following commands ("horizon" is the name of the theme to change to in this example)
npm install ws enigma.js fs path
node change-theme.js horizon
This article describes how to extract a list of Qlik NPrinting Reports and On Demand Reports above the default value of 50.
Both report types must be in an enabled state. The API cannot extract a list of any Qlik NPrinting reports and On Demand Reports if they are not both 'enabled'. See figure 1 below for the correct state:
figure 1
https://[servername]:4993/api/v1/reports?offset=0&limit=500&sort=+created
The sort parameter is critical with the offset parameter prior to the Qlik NPrinting June 2018 release, see item described in Nprinting API Returns Duplicate Users When Specifying Limit=1 and Offset=N, and no sort order is specified)
ID (QB-20569, OP-7407 and OP-9469)
Are customers allowed to brand a tenant with their own logo, when not for a OEM-purpose?
The branding capabilities available via the brands API are currently for OEM use cases only, supporting our customers where they are embedding Qlik into their customer-facing solutions or services.
Qlik is currently evaluating whether we will support the use of this capability by our enterprise and commercial customers. Please add your feedback and vote to this ideation topic if you wish to use this capability and you are not one of Qlik's OEM partners, please add your feedback on our ideation portal: https://ideation.qlik.com/app/#/case/295571 (please, login to the Qlik Community before opening this link).
While we currently don't enforce this limit at the implementation stage, the use of the API for enterprise and commercial customers is, at this stage, not allowed and not supported.
Is it possible to change the Qlik Sense logo on the login and or logout page?
Can Qlik Replicate be integrated into a third-party monitoring tool, such as APM Agent?
Qlik Replicate can be monitored using the Qlik Enterprise Manager API, but cannot be directly integrated into (for example) APM Agent for monitoring purposes.
For information on the Qlik Enterprise Manager APIs, see Qlik Enterprise Manager API guide .