Skip to main content
Technical Preview

Overview

A client-mode connector for the Qlik Cloud REST APIs. Use it to let plant events drive Qlik: reload an app when a shift, batch or ETL job closes, upload a CSV rollup (shift totals, OEE per line) as a data file the app loads, schedule or pause reload tasks, and run a Qlik Automate automation. It also puts Qlik state on MQTT: reload status and logs, data model metadata, items, spaces and audit events. The connector QlikCloudRestApi in QlikCloudRestApi.lot has 44 events (7 POST, 34 GET, 2 PUT, 1 PATCH). Nine are writes: ReloadCreate, ReloadCancel, ReloadTaskCreate, ReloadTaskUpdate, DataFileUpload, DataFileReplace, AutomationRunCreate, WebhookCreate and WebhookUpdate. There are no DELETE events. Set BASE_ADDRESS to your tenant URL with no trailing slash, for example https://acme.eu.qlikcloud.com (a tenant alias hostname also works). Every endpoint already starts with /api/v1, except /oauth/token. Topics use analytics/qlik-cloud/<object>/<verb>; replies land on <topic>/response. See the base guide: REST API Connectors.
Auth: every event except OAuthToken sends Authorization: Bearer <access_token>. The token is either an API key (a tenant admin enables API keys and gives the user the Developer role, then the user creates a key under Profile settings > API keys) or an OAuth machine-to-machine token: publish {"body":{"client_id":"...","client_secret":"...","grant_type":"client_credentials"}} to analytics/qlik-cloud/auth/token and use the returned access_token until expires_in runs out. The key or token acts as its user, so give it only the spaces and roles the broker needs. Keep QLIK_API_KEY (or QLIK_CLIENT_ID and QLIK_CLIENT_SECRET) in broker secrets, read them with GET SECRET in the action that builds the payload, never retain topics that carry them, and restrict analytics/qlik-cloud/auth/# with ACLs.

Events

Payload fields are JSON on the source topic: ids (app_id, reload_id, task_id, item_id, space_id, data_file_id, automation_id, run_id, webhook_id, audit_id), query (a URL query string without ?, or ""; ReloadsList needs appId=...), body (JSON for POST, PUT and PATCH events; a JSON Patch array for WebhookUpdate), multipart for data file uploads, and access_token.

Basic Syntax

An excerpt of the template (the full file has all 44 events and comments):

Examples

Reload an app when a shift closes

The response on analytics/qlik-cloud/reloads/create/response carries the reload id and status QUEUED. Publish {"access_token":"...","reload_id":"<id>"} to analytics/qlik-cloud/reloads/get to follow it to SUCCEEDED or FAILED.

Upload a CSV rollup as a data file

DataFileUpload sends multipart unchanged with Content-Type: multipart/form-data; boundary=CorefluxQlikBoundary. Build the body with CRLF line endings: a Json part with the file name, then a File part with the CSV.
A 201 response returns the file id. If the name already exists Qlik answers 409; publish to analytics/qlik-cloud/data_files/replace with data_file_id instead, then reload the app.

Get Qlik events back on MQTT

WebhookCreate registers a webhook that posts Qlik events, such as com.qlik.v1.reload.finished, to a URL you choose. Point it at a separate REST API connector with ENABLE_SERVER on the broker. Pause it later with WebhookUpdate and [{"op":"replace","path":"/enabled","value":false}].

Not packaged

  • DELETE operations (apps, data files, reload tasks, webhooks, spaces, users), on purpose. Pause reload tasks with state Disabled and webhooks with enabled false.
  • App import, export and publish; space, user, API key and tenant administration.
  • The Qlik associative engine (QIX), which uses WebSockets, not REST.
  • The webhook receiver itself (use a separate ENABLE_SERVER connector).

Testing status

Offline checks pass: static checks on the template, a check of every event against the Qlik Cloud OpenAPI specs, schema validation of every example body, and a local mock with round-trips (token, reload, data file upload, webhook update) plus negative controls. A live test needs a Qlik Cloud tenant and an API key; see TEST.md in the package.
Last modified on October 21, 2026