specification: API Commons Rate Limits specificationVersion: '0.1' schema: https://raw.githubusercontent.com/api-evangelist/interface-research/main/schema/api-commons.yml#/$defs/RateLimits provider: Qlik Sense APIs providerId: qliksense created: '2026-05-04' modified: '2026-08-29' generated: '2026-08-29' method: searched source: https://qlik.dev/apis/rest/rate-limiting/ for the tier model, the tenant formula and the 429/Retry-After contract; the per-operation limits are read from the x-qlik-tier extension carried by all 681 operations in the 78 OpenAPI documents in openapi/. description: Published Qlik Cloud API rate limits. REPLACES a fabricated scaffold written by the 2026-05-04 bulk sweep, which invented free/professional/enterprise tiers at 10/100/1000 rpm and X-RateLimit-* headers Qlik does not emit. Qlik's real model is per tier, per user, per tenant — and every plan gets the SAME limits; they are not negotiable per customer. tags: - Analytics - Business Intelligence - Cloud - Rate Limiting - Quotas - Throttling scope_model: evaluated_per: tier, per user, per tenant window: per minute, evaluated over a rolling 5-minute window to absorb bursts (tiers 1 and 2) plan_independent: true plan_note: '"All Qlik Cloud plans receive the same rate limit configuration. It''s not possible to customize this on a per-customer or per-tenant basis." — qlik.dev/apis/rest/rate-limiting/' tenant_formula: tenantRateLimit = (user rate limit) * (number of users in the tenant) * 0.5 tenant_formula_example: A 100-user tenant on tier 1 may send 1,000 * 100 * 0.5 = 50,000 requests in the window. headers: retryAfter: Retry-After limit: null remaining: null reset: null policy: null note: Retry-After (whole seconds) is the ONLY rate-limit header Qlik returns, and only on the 429. No X-RateLimit-*/RateLimit-* quota headers are emitted on successful responses, so a client cannot observe its remaining budget — it can only react after exhaustion. The per-operation tier IS machine-readable in the spec via x-qlik-tier, which partly compensates. responseCodes: throttled: 429 quotaExceeded: 429 error_body_example: errors: - code: HTTP-429 title: API rate limit reached. detail: You need to wait 13 seconds until limit is lifted. limits: - tier: Tier 1 scope: per-tier per-user per-tenant metric: requests_per_minute limit: 1000 timeFrame: minute window: 5-minute rolling applies_to: the majority of GET requests operation_count: 275 - tier: Tier 2 scope: per-tier per-user per-tenant metric: requests_per_minute limit: 100 timeFrame: minute window: 5-minute rolling applies_to: endpoints that create, update and delete resources operation_count: 366 - tier: Special scope: per-operation metric: requests_per_minute limit: null timeFrame: minute applies_to: endpoints whose limit is published in the API specification itself operation_count: 40 note: See special_endpoints[] below — limits observed range from 10 to 1,000 rpm. special_endpoints: - spec: openapi/qliksense-apps.json method: GET path: /api/v1/apps/{appId}/insight-analyses limit_per_minute: 500 operationId: getAnalyses - spec: openapi/qliksense-apps.json method: POST path: /api/v1/apps/{appId}/insight-analyses/actions/recommend limit_per_minute: 500 operationId: getRecommendations - spec: openapi/qliksense-apps.json method: GET path: /api/v1/apps/{appId}/insight-analyses/model limit_per_minute: 500 operationId: getBusinessModel - spec: openapi/qliksense-audits.json method: GET path: /api/v1/audits limit_per_minute: 1000 operationId: audits - spec: openapi/qliksense-audits.json method: GET path: /api/v1/audits/{id} limit_per_minute: 1000 operationId: audit - spec: openapi/qliksense-audits.json method: GET path: /api/v1/audits/archive limit_per_minute: 1000 operationId: archive - spec: openapi/qliksense-audits.json method: GET path: /api/v1/audits/settings limit_per_minute: 1000 operationId: getSettings - spec: openapi/qliksense-audits.json method: GET path: /api/v1/audits/sources limit_per_minute: 1000 operationId: sources - spec: openapi/qliksense-audits.json method: GET path: /api/v1/audits/types limit_per_minute: 1000 operationId: eventTypes - spec: openapi/qliksense-automl-deployments.json method: POST path: /api/v1/automl-deployments/{deploymentId}/realtime-predictions limit_per_minute: 300 operationId: postRealtimePredictions - spec: openapi/qliksense-data-files.json method: PUT path: /api/v1/data-files/{id} limit_per_minute: 800 operationId: null - spec: openapi/qliksense-data-governance-data-products.json method: POST path: /api/data-governance/data-products/{dataProductId}/actions/compute-datasets-data-quality limit_per_minute: 10 operationId: requestDataQualityComputation - spec: openapi/qliksense-data-governance-data-qualities.json method: POST path: /api/data-governance/data-qualities/computations limit_per_minute: 10 operationId: requestDataQualityComputation - spec: openapi/qliksense-data-qualities.json method: POST path: /api/v1/data-qualities/computations limit_per_minute: 10 operationId: requestDataQualityComputation - spec: openapi/qliksense-di-projects.json method: GET path: /api/v1/di-projects/{projectId}/di-tasks/{dataTaskId}/runtime/state limit_per_minute: 120 operationId: get_data_task_runtime_state - spec: openapi/qliksense-di-projects.json method: GET path: /api/v1/di-projects/{projectId}/di-tasks/{dataTaskId}/runtime/state/datasets limit_per_minute: 120 operationId: list_data_task_datasets - spec: openapi/qliksense-groups.json method: POST path: /api/v1/groups/actions/filter limit_per_minute: 200 operationId: groups_api_actions_filter - spec: openapi/qliksense-lineage-graphs.json method: GET path: /api/v1/lineage-graphs/impact/{id}/actions/expand limit_per_minute: 20 operationId: null - spec: openapi/qliksense-lineage-graphs.json method: GET path: /api/v1/lineage-graphs/impact/{id}/actions/search limit_per_minute: 20 operationId: null - spec: openapi/qliksense-lineage-graphs.json method: GET path: /api/v1/lineage-graphs/impact/{id}/overview limit_per_minute: 20 operationId: null - spec: openapi/qliksense-lineage-graphs.json method: GET path: /api/v1/lineage-graphs/impact/{id}/source limit_per_minute: 20 operationId: null - spec: openapi/qliksense-lineage-graphs.json method: GET path: /api/v1/lineage-graphs/nodes/{id} limit_per_minute: 20 operationId: null - spec: openapi/qliksense-lineage-graphs.json method: GET path: /api/v1/lineage-graphs/nodes/{id}/actions/expand limit_per_minute: 20 operationId: null - spec: openapi/qliksense-lineage-graphs.json method: GET path: /api/v1/lineage-graphs/nodes/{id}/actions/search limit_per_minute: 20 operationId: null - spec: openapi/qliksense-reloads.json method: POST path: /api/v1/reloads limit_per_minute: 50 operationId: null - spec: openapi/qliksense-reloads.json method: POST path: /api/v1/reloads/{reloadId}/actions/cancel limit_per_minute: 50 operationId: null - spec: openapi/qliksense-reports.json method: POST path: /api/v1/reports limit_per_minute: 10 operationId: postReports - spec: openapi/qliksense-tasks.json method: GET path: /api/v1/tasks limit_per_minute: 600 operationId: ListTasks - spec: openapi/qliksense-tasks.json method: POST path: /api/v1/tasks limit_per_minute: 600 operationId: CreateTask - spec: openapi/qliksense-tasks.json method: GET path: /api/v1/tasks/{id} limit_per_minute: 600 operationId: GetTask - spec: openapi/qliksense-tasks.json method: PUT path: /api/v1/tasks/{id} limit_per_minute: 600 operationId: UpdateTask - spec: openapi/qliksense-tasks.json method: DELETE path: /api/v1/tasks/{id} limit_per_minute: 600 operationId: DeleteTask - spec: openapi/qliksense-tasks.json method: POST path: /api/v1/tasks/{id}/actions/start limit_per_minute: 600 operationId: StartTask - spec: openapi/qliksense-tasks.json method: GET path: /api/v1/tasks/{id}/runs limit_per_minute: 600 operationId: GetTaskRuns - spec: openapi/qliksense-tasks.json method: GET path: /api/v1/tasks/{id}/runs/{runId}/log limit_per_minute: 600 operationId: GetTaskRunLog - spec: openapi/qliksense-tasks.json method: GET path: /api/v1/tasks/{id}/runs/last limit_per_minute: 600 operationId: GetTaskLastRun - spec: openapi/qliksense-tasks.json method: GET path: /api/v1/tasks/resources/{id}/runs limit_per_minute: 600 operationId: GetResourceRuns - spec: openapi/qliksense-temp-contents.json method: POST path: /api/v1/temp-contents/files limit_per_minute: 800 operationId: postTus - spec: openapi/qliksense-temp-contents.json method: PATCH path: /api/v1/temp-contents/files/{id} limit_per_minute: 800 operationId: patchTus - spec: openapi/qliksense-users.json method: POST path: /api/v1/users/actions/filter limit_per_minute: 200 operationId: users_api_actions_filter blocking_behavior: A 429 blocks every endpoint in the SAME tier for the Retry-After duration. Endpoints in other tiers are unaffected. policies: - name: Retry-After description: Clients must wait the number of seconds in the Retry-After header before retrying. Qlik publishes worked retry examples for @qlik/api, Node.js and other clients. - name: Toolkit handling description: Rate-limit handling is built into qlik-cli and into the Qlik Cloud Services / Qlik Platform Operations connectors in Qlik Automate. - name: Error-response limits description: Qlik states that some endpoints carry ADDITIONAL rate limits on error responses. - name: Subject to change description: Qlik states each tier's limits are subject to change. - name: Unpublished endpoints description: Endpoints not documented on qlik.dev are private but may share a tier with published ones — so private traffic can consume a published endpoint's budget. docs: https://qlik.dev/apis/rest/rate-limiting/ maintainers: - FN: Kin Lane email: kin@apievangelist.com url: https://apievangelist.com