# List all app objects

List the app objects, measures, dimensions, variables and bookmarks in an app by creating a transient object using the [CreateSessionObject method](https://help.qlik.com/en-US/sense-developer/November2025/Subsystems/EngineJSONAPI/Content/service-doc-createsessionobject.htm) and getting the layout of the transient object using the [GetLayout method](https://help.qlik.com/en-US/sense-developer/November2025/Subsystems/EngineJSONAPI/Content/service-genericobject-getlayout.htm).

The transient object should contain the following definitions:

* qAppObjectListDef in order to list the app objects like sheets and stories
* qDimensionListDef if you wish to list the dimensions in the app
* qMeasureListDef if you wish to list the measures in the app
* qBookmarkListDef if you wish to list the bookmarks in the app
* qVariableListDef if you wish to list the variables in the app

Information noteAn app object is a generic object created at the app level (the handle used for the creation of the app object is the handle of the app).

## Examples

Information noteThe following examples assume that you are connecting to an app that initially has no objects such as sheets, bookmarks, and so on.

Example 1:

[](https://help.qlik.com/en-US/sense-developer/Subsystems/EngineAPI/Content/Sense_EngineAPI/WorkingWithAppsAndVisualizations/CreateSheets/list-app-objects.htm)

#### The goal of this example is to create multiple objects in an app and to get an app overview that contains all those objects.

1. Create the app overview. A transient object is used to contain the list.

The client sends:

```
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "CreateSessionObject",
  "handle": 1,
  "params": [
    {
      "qInfo": {
        "qId": "",
        "qType": "SessionLists"
      },
      "qAppObjectListDef": {
        "qType": "sheet",
        "qData": {
          "id": "/qInfo/qId"
        }
      },
      "qDimensionListDef": {
        "qType": "Dimension",
        "qData": {}
      },
      "qMeasureListDef": {
        "qType": "Measure",
        "qData": {}
      }
    }
  ]
}
```

The engine returns:

```
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "qReturn": {
      "qType": "GenericObject",
      "qHandle": 2
      "qGenericType": "SessionLists",
      "qGenericId": "88bc83bd-a0fc-47f7-a344-ad3ac1d125a2"
    }
  },
  "change": [
    2
  ]
}
```

The app overview is created. The handle is 2.

This app overview contains the lists of:

* app objects (for example the list of sheets and stories)
* measures
* dimensions

2. Check the content of the app overview. The handle is 2.

The client sends:

```
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "GetLayout",
  "handle": 2,
  "params": []
}
```

The engine returns:

```
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "qLayout": {
      "qInfo": {
        "qId": "54dcfa19-7627-4204-b5b8-7c60c91dc7b1",
        "qType": "SessionLists"
      },
      "qSelectionInfo": {},
      "qAppObjectList": {
        "qItems": []
      },
      "qDimensionList": {
        "qItems": []
      },
      "qMeasureList": {
        "qItems": []
      }
    }
  }
}
```

The app overview is empty. The identifier of the app overview is 54dcfa19-7627-4204-b5b8-7c60c91dc7b1.

3. Create a sheet Sheet01 (qId is Sheet01).

The client sends:

```
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "CreateObject",
  "handle": 1,
  "params": [
    {
      "title": "Sheet 1",
      "description": "Description of sheet 1",
      "qInfo": {
        "qId": "Sheet01",
        "qType": "sheet"
      },
      "qChildListDef": {
        "qData": {
          "title": "/title",
          "description": "/description",
          "meta": "/meta",
          "order": "/order",
          "type": "/qInfo/qType",
          "id": "/qInfo/qId",
          "lb": "/qListObjectDef",
          "hc": "/qHyperCubeDef"
        }
      }
    }
  ]
}
```

The engine returns:

{ "jsonrpc": "2.0", "id": 3, "result": { "qReturn": { "qType": "GenericObject", "qHandle": 3, "qGenericType": "sheet", "qGenericId": "Sheet01" }, "qInfo": { "qId": "Sheet01", "qType": "sheet" } }, "change": [ 2, 3 ] }

The sheet is created. Its handle is 3. The member change shows that the transient object is updated, meaning that the list of app objects has been updated with the new sheet.

4. Add a dimension in the app.

The client sends:

{ "jsonrpc": "2.0", "id": 4, "method": "CreateDimension", "handle": 1, "params": [ { "qInfo": { "qId": "DI01", "qType": "dimension" }, "qDim": { "qGrouping": "N", "qFieldDefs": [ "Country" ], "qFieldLabels": [ "Lander" ] } } ] }

The engine returns:

{ "jsonrpc": "2.0", "id": 4, "result": { "qReturn": { "qType": "GenericDimension", "qHandle": 4, "qGenericType": "dimension", "qGenericId": "DI01" }, "qInfo": { "qId": "DI01", "qType": "dimension" } }, "change": [ 4 ] }

The dimension is added and has 4 as a handle.

5. Check that the app overview (handle is 2) is updated.

The client sends:

{ "jsonrpc": "2.0", "id": 5, "method": "GetLayout", "handle": 2, "params": [] }

The engine returns:

{ "jsonrpc": "2.0", "id": 5, "result": { "qLayout": { "qInfo": { "qId": "54dcfa19-7627-4204-b5b8-7c60c91dc7b1", "qType": "SessionLists" }, "qSelectionInfo": {}, "qAppObjectList": { "qItems": [ { "qInfo": { "qId": "Sheet01", "qType": "sheet" }, "qData": { "id": "" } } ] }, "qDimensionList": { "qItems": [ { "qInfo": { "qId": "DI01", "qType": "dimension" }, "qData": {} } ] }, "qMeasureList": { "qItems": [] } } } }

The app overview has been updated with the sheet Sheet01 and the dimension DI01. No measure is defined in the app.

Information noteTo get the list of the children of a sheet, you need to get the layout of the sheet.

Example 2:

[](https://help.qlik.com/en-US/sense-developer/Subsystems/EngineAPI/Content/Sense_EngineAPI/WorkingWithAppsAndVisualizations/CreateSheets/list-app-objects.htm)

#### The goal of this example is to create bookmarks and to list the bookmarks in the app.

1. The first step is to create a list of bookmarks in the app. A transient object is used to contain the list.

The client sends:

{ "jsonrpc": "2.0", "id": 1, "method": "CreateSessionObject", "handle": 1, "params": [ { "qInfo": { "qId": "BL01", "qType": "BookmarkList" }, "qBookmarkListDef": { "qType": "bookmark" } } ] }

The engine returns:

{ "jsonrpc": "2.0", "id": 1, "result": { "qReturn": { "qType": "GenericObject", "qHandle": 2 "qGenericType": "BookmarkList", "qGenericId": "BL01" } }, "change": [ 2 ] }

The list of bookmarks is created. The handle is 2.

2. Check the content of the list of bookmarks. The handle is 2.

The client sends:

{ "jsonrpc": "2.0", "id": 2, "method": "GetLayout", "handle": 2, "params": [] }

The engine returns:

{ "jsonrpc": "2.0", "id": 2, "result": { "qLayout": { "qInfo": { "qId": "BL01", "qType": "BookmarkList" }, "qSelectionInfo": {}, "qBookmarkList": { "qItems": [] } } } }

The list of bookmarks is empty.

3. Create a bookmark BM01.

The client sends:

{ "jsonrpc": "2.0", "id": 3, "method": "CreateBookmark", "handle": 1, "params": [ { "qInfo": { "qId": "BM01", "qType": "bookmark" } } ] }

The engine returns:

{ "jsonrpc": "2.0", "id": 3, "result": { "qReturn": { "qType": "GenericBookmark", "qHandle": 3 "qGenericType": "bookmark", "qGenericId": "BM01" }, "qInfo": { "qId": "BM01", "qType": "Bookmark" } }, "change": [ 1, 2, 3 ] }

The bookmark BM01 is created. Its handle is 3. The member change shows that the transient object is updated, meaning that the list of bookmarks has been updated with the new bookmark.

4. Check the content of the bookmark. The handle is 3.

The client sends:

{ "jsonrpc": "2.0", "id": 4, "method": "GetLayout", "handle": 3, "params": [] }

The engine returns:

{ "jsonrpc": "2.0", "id": 4, "result": { "qLayout": { "qInfo": { "qId": "BM01", "qType": "Bookmark" }, "qBookmark": { "qStateData": [ { "qStateName": "$", "qFieldItems": [] } ], "qUtcModifyTime": 41674.659722222219, "qVariableItems": [] }, "qFieldInfos": [] } } }

The data related to the bookmark are displayed under qBookmark.

5. Check that the list of bookmarks is updated. The handle is 2.

The client sends:

{ "jsonrpc": "2.0", "id": 5, "method": "GetLayout", "handle": 2, "params": [] }

The engine returns:

{ "jsonrpc": "2.0", "id": 5, "result": { "qLayout": { "qInfo": { "qId": "BL01", "qType": "BookmarkList" }, "qSelectionInfo": {}, "qBookmarkList": { "qItems": [ { "qInfo": { "qId": "BM01", "qType": "bookmark" }, "qData": { "qBookmark": { "qStateData": [ { "qStateName": "$", "qFieldItems": [] } ], "qUtcModifyTime": 43234.89525462963, "qVariableItems": [] } } } ] } } } }

The list of bookmarks has been updated with the new bookmark BM01. The data related to the bookmark are returned.

Example 3:

[](https://help.qlik.com/en-US/sense-developer/Subsystems/EngineAPI/Content/Sense_EngineAPI/WorkingWithAppsAndVisualizations/CreateSheets/list-app-objects.htm)

#### The goal of this example is to create variables and to list the variables in the app.

In this example, two lists are created: one to list the variables of type variable and one to list the variables of type OtherVariable.

Information noteA list can only contain variables of the same type.

1. The first step is to create a transient object that can list the variables of type variable in the app. The identifier of the transient object is VL01. This list of variables should gather all variables of type variable. Therefore qVariableListDef/qType is set to variable.

The client sends:

{ "jsonrpc": "2.0", "id": 2, "method": "CreateSessionObject", "handle": 1, "params": [ { "qInfo": { "qId": "VL01", "qType": "VariableList" },

"qVariableListDef": { "qType": "variable" }

} ] }

The engine returns:

{ "jsonrpc": "2.0", "id": 2, "result": { "qReturn": { "qType": "GenericObject", "qHandle": 2 } }, "change": [ 2 ] }

The list of variables VL01 is created and has 2 as a handle.

[VariableListDef](https://help.qlik.com/en-US/sense-developer/November2025/Subsystems/EngineJSONAPI/Content/models-variablelistdef.htm).

2. Check the content of the list of variables. The handle of the request is 2 because the handle of the list of variables is 2.

The client sends:

{ "jsonrpc": "2.0", "id": 3, "method": "GetLayout", "handle": 2, "params": [] }

The engine returns:

{ "jsonrpc": "2.0", "id": 3, "result": { "qLayout": { "qInfo": { "qId": "VL01", "qType": "VariableList" }, "qSelectionInfo": {}, "qVariableList": { "qItems": [] } } } }

The list of variables is empty.

[VariableListDef](https://help.qlik.com/en-US/sense-developer/November2025/Subsystems/EngineJSONAPI/Content/models-variablelistdef.htm).

3. Create the variableVariable01. The identifier of the variable is VB01. A name (in qName), a comment (in qComment) and a definition (in qDefinition) are set. The type of the variable is variable, meaning that this variable should be part of the list of variables VL01.

The client sends:

{ "jsonrpc": "2.0", "id": 4, "method": "CreateVariableEx", "handle": 1, "params": [ { "qInfo": { "qId": "VB01", "qType": "variable" }, "qName": "Variable01", "qComment": "My first variable", "qDefinition": "=Count(Sales)" } ] }

The engine returns:

{ "jsonrpc": "2.0", "id": 4, "result": { "qReturn": { "qType": "GenericVariable", "qHandle": 3 }, "qInfo": { "qId": "VB01", "qType": "variable" } }, "change": [ 1, 2, 3 ] }

The variable is created and has 3 as a handle. The member change shows that the transient object is updated (handle 2 in the list), meaning that the list of variables has been updated with the new variable.

4. Check the content of the list of variables. The handle of the request is 2 because the handle of the list of variables is 2.

The client sends:

{ "jsonrpc": "2.0", "id": 5, "method": "GetLayout", "handle": 2, "params": [] }

The engine returns:

{ "jsonrpc": "2.0", "id": 5, "result": { "qLayout": { "qInfo": { "qId": "VL01", "qType": "VariableList" }, "qSelectionInfo": {}, "qVariableList": { "qItems": [ { "qName": "Variable01", "qDescription": "My first variable", "qDefinition": "=Count(Sales)", "qInfo": { "qId": "VB01", "qType": "variable" }, "qData": {} } ] } } } }

The list of variables (in qVariableList) has been updated with the new variable VB01.

5. Create the variableVariable02. The identifier of the variable is VB02. A name (in qName), a comment (in qComment) and a definition (in qDefinition) are set. The type of this variable is variable, meaning that this variable should be part of the list of variables VL01.

The client sends:

{ "jsonrpc": "2.0", "id": 6, "method": "CreateVariableEx", "handle": 1, "params": [ { "qInfo": { "qId": "VB02", "qType": "variable" }, "qName": "Variable02", "qComment": "My second variable", "qDefinition": "=Sum(Sales)" } ] }

The engine returns:

{ "jsonrpc": "2.0", "id": 6, "result": { "qReturn": { "qType": "GenericVariable", "qHandle": 4 }, "qInfo": { "qId": "VB02", "qType": "variable" } }, "change": [ 1, 2, 4 ] }

The variable is created and has 4 as a handle. The member change shows that the transient object is updated (handle 2 in the list), meaning that the list of variables has been updated with the new variable.

6. Check the content of the list of variables. The handle of the request is 2 because the handle of the list of variables is 2.

The client sends:

{ "jsonrpc": "2.0", "id": 7, "method": "GetLayout", "handle": 2, "params": [] }

The engine returns:

{ "jsonrpc": "2.0", "id": 7, "result": { "qLayout": { "qInfo": { "qId": "VL01", "qType": "VariableList" }, "qSelectionInfo": {}, "qVariableList": { "qItems": [ { "qName": "Variable01", "qDescription": "My first variable", "qDefinition": "=Count(Sales)", "qInfo": { "qId": "VB01", "qType": "variable" }, "qData": {} }, { "qName": "Variable02", "qDescription": "My second variable", "qDefinition": "=Sum(Sales)", "qInfo": { "qId": "VB02", "qType": "variable" }, "qData": {} } ] } } } }

The list of variables (in qVariableList) has been updated with the new variable VB02.

7. Create two script variables: vSales and vSales2.

The client sends:

{ "jsonrpc": "2.0", "id": 8, "method": "SetScript", "handle": 1, "params": [ "\r\nTRACE script set from file: E:\\GIT\\engine-sense-fork\\prod\\data\\Engine\\test\\qlikviewTests\\ProtocolTester4Net\\Resources\\\\CustomScript\\VariableScript\_DOC.txt;\r\nLOAD \* INLINE [\r\n Sales\r\n 150\r\n 200\r\n 240\r\n ];\r\nLet vSales = '=Sum(Sales)' ;\r\nLet vSales2 = '=Avg(Sales)' ;" ] }

The engine returns:

{ "jsonrpc": "2.0", "id": 8, "result": {} }

The variables are created. Per default, script-defined variables have variable as type.

8. Load the script.

The client sends:

{ "jsonrpc": "2.0", "id": 9, "method": "DoReload", "handle": 1, "params": [] }

The engine returns:

{ "jsonrpc": "2.0", "id": 9, "result": { "qReturn": true }, "change": [ 1, 2, 3, 4 ] }

The script is reloaded.

9. Check the content of the list of variables VL01. The handle of the request is 2 because the handle of the list of variables is 2.

The client sends:

{ "jsonrpc": "2.0", "id": 10, "method": "GetLayout", "handle": 2, "params": [] }

The engine returns:

{ "jsonrpc": "2.0", "id": 10, "result": { "qLayout": { "qInfo": { "qId": "VL01", "qType": "VariableList" }, "qSelectionInfo": {}, "qVariableList": { "qItems": [ { "qName": "Variable01", "qDescription": "My first variable", "qDefinition": "=Count(Sales)", "qInfo": { "qId": "VB01", "qType": "variable" }, "qData": {} }, { "qName": "Variable02", "qDescription": "My second variable", "qDefinition": "=Sum(Sales)", "qInfo": { "qId": "VB02", "qType": "variable" }, "qData": {} }, { "qName": "vSales", "qDefinition": "=Sum(Sales)", "qInfo": { "qId": "ff28e996-20bc-4ba5-8915-32e7b4a9523c", "qType": "variable" }, "qData": {}, "qIsScriptCreated": true }, { "qName": "vSales2", "qDefinition": "=Avg(Sales)", "qInfo": { "qId": "796003fa-9958-415e-a515-f1be240276dd", "qType": "variable" }, "qData": {}, "qIsScriptCreated": true } ] } } } }

This list displays all user variables and all script-defined variables with the type variable in the app. The property qIsScriptCreated is set to true for the variables vSales and vSales2 because these variables have been defined through script.

10. Create the variableVariable03. The identifier of the variable is VB03. A name (in qName), a comment (in qComment) and a definition (in qDefinition) are set. The type of this variable is OtherVariable, meaning that this variable should not be part of the list of variables VL01.

The client sends:

{ "jsonrpc": "2.0", "id": 8, "method": "CreateVariableEx", "handle": 1, "params": [ { "qInfo": { "qId": "VB03", "qType": "OtherVariable" }, "qName": "Variable03", "qComment": "My third variable", "qDefinition": "=Sum(Sales)" } ] }

The engine returns:

{ "jsonrpc": "2.0", "id": 8, "result": { "qReturn": { "qType": "GenericVariable", "qHandle": 5 }, "qInfo": { "qId": "VB03", "qType": "OtherVariable" } }, "change": [ 1, 5 ] }

The variable is created and has 5 as a handle. The member change does not contain the handle of the transient object (handle 2), meaning that this variable is not added to the list of variables. The reason is that the type of this variable is OtherVariable and not variable, as defined in VariableListDef when creating the transient session object in the first step of this example.

11. Create another list of variables by creating a new transient object. The identifier of this transient object is VL02. This list of variables should contain all variables of type OtherVariable (in qVariableListDef/qType).

The client sends:

{ "jsonrpc": "2.0", "id": 9, "method": "CreateSessionObject", "handle": 1, "params": [ { "qInfo": { "qId": "VL02", "qType": "VariableList" }, "qVariableListDef": { "qType": "OtherVariable" } } ] }

The engine returns:

{ "jsonrpc": "2.0", "id": 9, "result": { "qReturn": { "qType": "GenericObject", "qHandle": 6 } }, "change": [ 6 ] }

The list of variables VL02 is created and has 6 as a handle.

[VariableListDef](https://help.qlik.com/en-US/sense-developer/November2025/Subsystems/EngineJSONAPI/Content/models-variablelistdef.htm)

12. Check the content of the list of variables VL02. The handle of the request is 6 because the handle of the list of variables is 6.

The client sends:

{ "jsonrpc": "2.0", "id": 10, "method": "GetLayout", "handle": 6, "params": [] }

The engine returns:

{ "jsonrpc": "2.0", "id": 10, "result": { "qLayout": { "qInfo": { "qId": "VL02", "qType": "VariableList" }, "qSelectionInfo": {}, "qVariableList": { "qItems": [ { "qName": "Variable03", "qDescription": "My third variable", "qDefinition": "=Sum(Sales)", "qInfo": { "qId": "VB03", "qType": "OtherVariable" }, "qData": {} } ] } } } }

The list of variables VL02 contains the variable VB03. The variables VB01 and VB02 are not included because they are not of type OtherVariable.

## Learn more

* [List the children of a generic object](https://help.qlik.com/en-US/sense-developer/November2025/Subsystems/EngineAPI/Content/Sense_EngineAPI/WorkingWithAppsAndVisualizations/CreateVisualizations/list-childs-in-generic-object.htm)