Create, upload and manage private apps owned by the selected customer. All operations require OWNER access.
The customerId selector is available to callers permitted to manage that customer; these operations cannot
transfer an app to another customer. Available app types depend on the server version.
POST /api/customApp/myApps. Supply a nonempty name; type defaults to WIDGET
and widgetCategory to CUSTOM_APPS. The new app is disabled and private, with automatic repository updates disabled.POST /api/customApp/myApps/{id}/upload
with the multipart field file.PUT /api/customApp/myApps/{id} and {"enabled":true}.| Type | ZIP requirements |
|---|---|
WIDGET |
config.json with nonempty name and version, each at most 255 characters; these determine package identity/version |
HTML_BUNDLE |
index.html at the ZIP root; the server generates the manifest and identity |
Uploading replaces the package. Identity conflicts in the customer's effective catalog return 409. Missing or invalid required package content returns 400. Downloading an app before its first package upload fails.
Use an existing customer app for this workflow. ZIP validation and installation happen at completion.
POST /api/customApp/myApps/{id}/upload/init with JSON name, size, contentType and totalChunks.
The response gives an uploadId, relative part URLs, maxChunkSize and expiresAt.PUT raw ZIP bytes to each returned URL with Content-Type: application/octet-stream and an exact
Content-Length. Part numbers start at 1; each successful response returns partNumber and etag.GET /api/customApp/myApps/{id}/upload/{uploadId}/recover to find uploaded and missing parts.
Send missing parts while the status is UPLOADING.POST /api/customApp/myApps/{id}/upload/{uploadId}/complete without a body to validate and install the ZIP.
The response is the updated app; a successful part PUT alone does not establish a valid complete bundle.DELETE /api/customApp/myApps/{id}/upload/{uploadId} to cancel an upload.Use the same account, app and selected customer throughout. If using customerId, also add it to each
returned part URL. A missing or expired upload requires a new initialization.
List the customer's own apps with GET /api/customApp/myApps; this is not the combined platform/customer catalog.
Updates accept name, description, enabled and widgetCategory. Ownership, app type and repository-update
settings cannot be changed through these operations. Use returned appRootPath, entryPoint and iconPath
values when available instead of constructing storage URLs.
Minimum role: OWNER.
| customerId | integer <int64> Select a customer/tenant within the caller's access. When this parameter is optional, omitting it uses the caller's scope: global for ADMIN, owned member customers for a network owner, and the own customer for other callers. Use an explicit customerId for customer-specific operations. Requiredness is declared per endpoint. |
| page | integer >= 0 Default: 0 Page index (0-based) |
| size | integer >= 1 Default: 20 Requested page size; server limits and endpoint overrides apply. |
| sort | string Example: sort=name,asc Sort expression. Format:
|
| search | string WBQL filter expression. Operators: |
| select | string Field projection. |
{- "first": true,
- "last": true,
- "number": 0,
- "numberOfElements": 0,
- "totalElements": 0,
- "totalPages": 0,
- "size": 0,
- "content": [
- {
- "id": 0,
- "name": "string",
- "appId": "string",
- "description": "string",
- "storageId": "string",
- "enabled": true,
- "availableToAllCustomers": true,
- "version": "string",
- "repositoryVersion": "string",
- "ownershipType": "PLATFORM",
- "customerId": 0,
- "sizeBytes": 0,
- "lastUpdated": 0,
- "type": "WIDGET",
- "widgetCategory": "CUSTOM_APPS",
- "config": null,
- "appRootPath": "string",
- "entryPoint": "string",
- "iconPath": "string",
- "resourceList": [
- "string"
]
}
]
}Minimum role: OWNER.
| customerId | integer <int64> Select a customer/tenant within the caller's access. When this parameter is optional, omitting it uses the caller's scope: global for ADMIN, owned member customers for a network owner, and the own customer for other callers. Use an explicit customerId for customer-specific operations. Requiredness is declared per endpoint. |
| name required | string non-empty |
| description | string |
| type | string Default: "WIDGET" Enum: "WIDGET" "HTML_BUNDLE" |
| widgetCategory | string Default: "CUSTOM_APPS" Enum: "CUSTOM_APPS" "BASIC" "MEDIA" "CHARTS" "INTERACTIONS" |
{- "name": "string",
- "description": "string",
- "type": "WIDGET",
- "widgetCategory": "CUSTOM_APPS"
}{- "id": 0,
- "name": "string",
- "appId": "string",
- "description": "string",
- "storageId": "string",
- "enabled": true,
- "availableToAllCustomers": true,
- "version": "string",
- "repositoryVersion": "string",
- "ownershipType": "PLATFORM",
- "customerId": 0,
- "sizeBytes": 0,
- "lastUpdated": 0,
- "type": "WIDGET",
- "widgetCategory": "CUSTOM_APPS",
- "config": null,
- "appRootPath": "string",
- "entryPoint": "string",
- "iconPath": "string",
- "resourceList": [
- "string"
]
}Minimum role: OWNER.
| id required | integer <int64> |
| customerId | integer <int64> Select a customer/tenant within the caller's access. When this parameter is optional, omitting it uses the caller's scope: global for ADMIN, owned member customers for a network owner, and the own customer for other callers. Use an explicit customerId for customer-specific operations. Requiredness is declared per endpoint. |
| name | string |
| enabled | boolean |
| description | string |
| widgetCategory | string Enum: "CUSTOM_APPS" "BASIC" "MEDIA" "CHARTS" "INTERACTIONS" |
{- "name": "string",
- "enabled": true,
- "description": "string",
- "widgetCategory": "CUSTOM_APPS"
}Minimum role: OWNER.
| id required | integer <int64> |
| customerId | integer <int64> Select a customer/tenant within the caller's access. When this parameter is optional, omitting it uses the caller's scope: global for ADMIN, owned member customers for a network owner, and the own customer for other callers. Use an explicit customerId for customer-specific operations. Requiredness is declared per endpoint. |
Multipart field file, Content-Type application/zip or application/x-zip-compressed. WIDGET packages require config.json; HTML_BUNDLE packages require root index.html.
Minimum role: OWNER.
| id required | integer <int64> |
| customerId | integer <int64> Select a customer/tenant within the caller's access. When this parameter is optional, omitting it uses the caller's scope: global for ADMIN, owned member customers for a network owner, and the own customer for other callers. Use an explicit customerId for customer-specific operations. Requiredness is declared per endpoint. |
| file required | string <binary> |
Start a resumable ZIP upload for an existing customer app.
Minimum role: OWNER.
| id required | integer <int64> |
| customerId | integer <int64> Select a customer/tenant within the caller's access. When this parameter is optional, omitting it uses the caller's scope: global for ADMIN, owned member customers for a network owner, and the own customer for other callers. Use an explicit customerId for customer-specific operations. Requiredness is declared per endpoint. |
| name required | string [ 1 .. 255 ] characters Nonblank upload name |
| size required | integer <int64> [ 1 .. 1073741824 ] Declared ZIP size in bytes |
| contentType required | string application/zip or application/x-zip-compressed, case-insensitive |
| totalChunks required | integer <int32> [ 1 .. 10000 ] Declared number of parts |
{- "name": "string",
- "size": 1,
- "contentType": "string",
- "totalChunks": 1
}{- "uploadId": "string",
- "name": "string",
- "size": 1,
- "maxChunkSize": 1,
- "totalChunks": 1,
- "uploadUrls": {
- "property1": "string",
- "property2": "string"
}, - "expiresAt": 0
}Send raw ZIP bytes with an exact Content-Length for the chosen part number. Completion separately validates the full upload.
Minimum role: OWNER.
| id required | integer <int64> |
| uploadId required | string |
| partNumber required | integer <int32> [ 1 .. 10000 ] 1-based part number within the declared totalChunks |
| customerId | integer <int64> Select a customer/tenant within the caller's access. When this parameter is optional, omitting it uses the caller's scope: global for ADMIN, owned member customers for a network owner, and the own customer for other callers. Use an explicit customerId for customer-specific operations. Requiredness is declared per endpoint. |
| Content-Length required | integer <int64> [ 1 .. 104857600 ] |
{- "partNumber": 0,
- "etag": "string"
}Read the upload status and the part numbers already received or still missing.
Minimum role: OWNER.
| id required | integer <int64> |
| uploadId required | string |
| customerId | integer <int64> Select a customer/tenant within the caller's access. When this parameter is optional, omitting it uses the caller's scope: global for ADMIN, owned member customers for a network owner, and the own customer for other callers. Use an explicit customerId for customer-specific operations. Requiredness is declared per endpoint. |
{- "uploadId": "string",
- "name": "string",
- "size": 1,
- "totalChunks": 1,
- "uploadedChunks": [
- 1
], - "missingChunks": [
- 1
], - "status": "UPLOADING",
- "expiresAt": 0
}Complete and validate all uploaded parts, then install the ZIP and return the app. Missing parts, a size mismatch or missing required package content return 400.
Minimum role: OWNER.
| id required | integer <int64> |
| uploadId required | string |
| customerId | integer <int64> Select a customer/tenant within the caller's access. When this parameter is optional, omitting it uses the caller's scope: global for ADMIN, owned member customers for a network owner, and the own customer for other callers. Use an explicit customerId for customer-specific operations. Requiredness is declared per endpoint. |
{- "id": 0,
- "name": "string",
- "appId": "string",
- "description": "string",
- "storageId": "string",
- "enabled": true,
- "availableToAllCustomers": true,
- "version": "string",
- "repositoryVersion": "string",
- "ownershipType": "PLATFORM",
- "customerId": 0,
- "sizeBytes": 0,
- "lastUpdated": 0,
- "type": "WIDGET",
- "widgetCategory": "CUSTOM_APPS",
- "config": null,
- "appRootPath": "string",
- "entryPoint": "string",
- "iconPath": "string",
- "resourceList": [
- "string"
]
}Cancel an upload that has not completed. A completed or interrupted upload can return 409.
Minimum role: OWNER.
| id required | integer <int64> |
| uploadId required | string |
| customerId | integer <int64> Select a customer/tenant within the caller's access. When this parameter is optional, omitting it uses the caller's scope: global for ADMIN, owned member customers for a network owner, and the own customer for other callers. Use an explicit customerId for customer-specific operations. Requiredness is declared per endpoint. |
Minimum role: OWNER.
| id required | integer <int64> |
| customerId | integer <int64> Select a customer/tenant within the caller's access. When this parameter is optional, omitting it uses the caller's scope: global for ADMIN, owned member customers for a network owner, and the own customer for other callers. Use an explicit customerId for customer-specific operations. Requiredness is declared per endpoint. |