Skip to content
Talk to our solutions team

Data API

GET /data/health (get health status of the server)

response:

{
"healthy": true,
"dependencies": {},
"memstats": {
"Alloc": 7,
"HeapAlloc": 7,
"HeapSys": 19,
"HeapIdle": 8,
"HeapInUse": 10,
"TotalAlloc": 60224,
"Sys": 27,
"NumGC": 12653
},
"version": ""
}

GET /data/ready (get ready status of the server)

response:

ready:true

GET /data/entities/list (list all the entities in the datastore)

nametypedata typedescription
tagoptionalstringfilter by tag
storeoptionalstringstore to list (tenant or customer)
datastoreoptionalstringdatastore to list

response:

{
"datastore": "default",
"entities": [
{
"name": "answer",
"source": "data",
"store": "customer"
}
]
}

GET /data/hashes/list (list all the hashes)

nametypedata typedescription
tagoptionalstringfilter by tag
storeoptionalstringstore to list (tenant or customer)
datastoreoptionalstringdatastore to list

response:

{
"datastore": "default",
"hashes": {
}
}

GET /data/entities/list/:entity (describe specified entity)

nametypedata typedescription
entityrequiredstringentity to describe
nametypedata typedescription
tagoptionalstringfilter by tag
storeoptionalstringstore to list (tenant or customer)
datastoreoptionalstringdatastore to list

response:

{
"entity": {
"description": "",
"fields": [
{
"name": "id",
"description": "",
"type": "ULID",
"arraytype": "None",
"enum": "",
"embeddables": null,
"computed": true,
"serial": false,
"inherited": false,
"subfields": null,
"annotations": [
{
"type": "default",
"value": "ulid()",
"annotations": null,
"message": "",
"code": "",
"plugintype": "cel"
}
],
"required": true,
"stateflow": "",
"stateflowfield": "",
"tokenized": false,
"tokenstrategy": "",
"meta": {
"defaultvalue": "ulid()",
"name": "id",
"type": "ulid",
"validations": [
{
"type": "required"
}
]
}
}
],
"name": "survey",
"service": "data"
}
}

GET /data/entities/references/:entity (list all the references to the entity)

nametypedata typedescription
entityoptionalstringentity to show references of
nametypedata typedescription
tagoptionalstringfilter by tag
storeoptionalstringstore to list (tenant or customer)
datastoreoptionalstringdatastore to list

response:

{
"references": {
"survey_section_reference": {
"name": "survey_section_reference",
"description": "",
"fromentity": "survey",
"fromentityfield": "id",
"toentity": "section",
"toentityfield": "surveyid",
"type": "onetomany",
"fromfield": "survey_id",
"tofield": "section_surveyid",
"iscustom": false,
"customentity": ""
}
}
}

GET /data/entities/diff (get all diff queries to execute in database)

response:

{
"queries": "create schema if not exists tenant;..."
}

POST /data/entities/diff/sync (fire all the diffed queries in the database)

nametypedata typedescription
datastoreoptionalstringdatastore to list

response:

{
"message": "queries ran successfully",
"queries": "create schema if not exists tenant;..."
}

POST /data/entities/diff/sync/:entity (fire diffed queries for entity in the database)

nametypedata typedescription
entityrequiredstringentity to perform sync the diffed queries for
nametypedata typedescription
datastoreoptionalstringdatastore to list

response:

{
"message": "queries ran successfully",
"queries": "create schema if not exists tenant;..."
}

POST /data/entities/index/:entity (seed entity index)

nametypedata typedescription
datastoreoptionalstringdatastore to list

response:

{
"statusid": "1",
"status": "success"
}

POST /data/entities/validate (validate addition of an entity into the datastore)

nametypedata typedescription
datastoreoptionalstringdatastore to list

request:

{
"files": [
"<entity definition in string>"
]
}

response:

{
"datastore": "default",
"errors": null,
"path": "surveyappds",
"valid": true
}

POST /data/rest/:entity (create an entity)

nametypedata typedescription
entityrequiredstringentity to create
nametypedata typedescription
localeoptionalstringlocale information
statsoptionalbooleanreturn stats of create operation
expressionoptionalstringjq expression to evaluate over the response
datastoreoptionalstringdatastore to access
customstateflowoptionalstringstate: definition

request:

{
"<key to add>": "<value to add>",
"description": "custom entity field"
}

response:

{
"data": {
"entity": {
"createdby": "<email>",
"createdon": "<timestamp>",
"deletedby": null,
"deletedon": null,
"description": "custom entity field",
"id": "<id>",
"ownerid": "<owner id>",
"status": true,
"updatedby": "<email>",
"updatedon": "<timestamp>"
}
}
}

GET /data/rest/:entity (get created entities)

nametypedata typedescription
entityrequiredstringentity to read
nametypedata typedescription
pageoptionalstringpage to select while pagination
pagesizeoptionalstringdefine the size of the page while pagination
versionoptionalstringversion to get while cdc is enabled
expressionoptionalstringjq expression to evaluate over the response
eventoptionalstring
fieldsoptionalstring
statsoptionalbooleanreturn stats of operation
filteroptionalstringfilter to apply while reading from the database
deletedoptionalbooleanreturn deleted entities
groupbyoptionalstringgroupby a field
idoptionalstringsearch by id
untokenizeoptionalbooleanuntokenize tokenized fields
deltaoptionalbooleanadd delta information
statesoptionalbooleanadd states
metaoptionalstringadd meta key in response
datastoreoptionalstringdatastore to access
nameexample
equal expressionrank = 1
not equal expressionrank != 1
greater than expressionrank > 1
less than expressionrank < 1
greater than or equal expressionrank >= 1
less than or equal expressionrank <= 1
not expressiondeletedby not null
equal and greater than expressionid = 1 and i > 3
equal, lesser than and greater than expressionid = 1 or i < 3 and i > 3
equal, lesser than and greater than expressions with nested paranthesesid = 1 or ( i < 3 and (i > 3 or i = 3) )
equal and greater than expressions with strings expressionid = 1 and i > “abc”
is expressionid is null
is not expressionid is not null
jsonb expressionembedded_field.field1 = 1
jsonb expression with string expressionembedded_map_field.field1 = ‘foo’ and deletedby is null
in operator for empty array expressionid in []
in operator for array of single valueid in [1]
in operator for array of valueid in [ 1, 2, 3 ]
in operator for array of string valueid in [ ‘abc’ ]
array index parsingid[0] = 32
two quoted strings parsingid = “01FE35BENNXPSYNFB87QSE27JQ” and node = “manager_approval”
crypt quoted string parsingpassword = crypt[‘jfkdl’]
crypt quoted string parsingemail = ‘email’ and password = crypt[‘jfkdl’]
quoted string with null parsingemail = ‘[email protected]’ and password = null and deletedby is null
complex string parsingproperties.tenants[].name = “kisai” and properties.roles[].name = “kisai”
like parsingproperties like false and id = $id and properties like “kisai” and properties not like ”%#@!$%#$%$#@%#$” and properties ilike “kisai” and properties not ilike “kisai”
match parsingproperties match false and id = $id and properties match “kisai” and properties not match ”%#@!$%#$%$#@%#$” and properties imatch “kisai” and properties not imatch “kisai”
parsing . with spaceproperties = ‘abc. fdb’
filter expression parsing examplestate in user.roles and state2 = ‘created’

request:

Note: Not Url encoded

https://{{url}}/data/rest/survey/?description = "custom entity field"

response:

{
"data": {
"survey": [
{
"createdby": "<email>",
"createdon": "<timestamp>",
"deletedby": null,
"deletedon": null,
"description": "custom entity field",
"id": "<id>",
"ownerid": "<ownerid>",
"status": true,
"updatedby": "<email>",
"updatedon": "<timestamp>"
}
]
}
}

GET /data/rest/:entity/id/:id (get entity by it's id)

nametypedata typedescription
entityrequiredstringentity to read
idrequiredstringid of the entity to read
nametypedata typedescription
deltaoptionalbooleanadd delta information
depthoptionalintegerdepth of the children
deletedoptionalbooleanreturn deleted entities
unmaskoptionalbooleanunmask masked fields
untokenizeoptionalbooleanuntokenize tokenized fields
expressionoptionalstringjq expression to evaluate over the response
localeoptionalstringspecifies the locale of the entity
versionoptionalstringversion to get while cdc is enabled
rangeoptionalboolean
payloadoptionalboolean
filteroptionalstringfilter to apply while reading from the database
datastoreoptionalstringdatastore to access

response:

{
"data": {
"survey": [
{
"createdby": "<email>",
"createdon": "<timestamp>",
"deletedby": null,
"deletedon": null,
"description": "custom entity field",
"id": "<id>",
"ownerid": "<ownerid>",
"status": true,
"updatedby": "<email>",
"updatedon": "<timestamp>"
}
]
}
}

GET /data/rest/:entity/page/:pagespec (get entity and limit by pagination)

nametypedata typedescription
entityrequiredstringentity to read
pagespecrequiredstringlimit of the number of entities and the page to select, comma separated

same parameters as in get entities

response:

when pagespec is 1, 2 here is the page number and 2 is the number of entities in one page

{
"data": {
"survey": [
{
"createdby": "<email>",
"createdon": "<timestamp>",
"deletedby": null,
"deletedon": null,
"description": "custom entity field",
"id": "<id>",
"ownerid": "<ownerid>",
"status": true,
"updatedby": "<email>",
"updatedon": "<timestamp>"
},
{
"createdby": "<email>",
"createdon": "<timestamp>",
"deletedby": null,
"deletedon": null,
"description": "custom entity field entry 2",
"id": "<id>",
"ownerid": "<ownerid>",
"status": true,
"updatedby": "<email>",
"updatedon": "<timestamp>"
}
]
}
}

PUT /data/rest/:entity (update an entity)

nametypedata typedescription
entityrequiredstringentity to update
nametypedata typedescription
eventoptionalstring
noversionoptionalstringbypasses creating a version
fieldoptionalstring
expressionoptionalstringjq expression to evaluate over the response
datastoreoptionalstringdatastore to access

request:

{
"id": "<id>",
"<key to change>": "<new value>"
}

response:

{
"data": {
"survey": [
{
"createdby": "<email>",
"createdon": "<timestamp>",
"deletedby": null,
"deletedon": null,
"description": "custom entity field",
"id": "<id>",
"ownerid": "<ownerid>",
"status": true,
"updatedby": "<email>",
"updatedon": "<timestamp>"
}
]
}
}

DELETE /data/rest/:entity/id/:id (delete an entity by id)

nametypedata typedescription
entityrequiredstringentity to delete
idrequiredstringid of the entity to operate
nametypedata typedescription
deletechildrenoptionalbooleandelete children of this entity
purgeoptionalbooleanhard delete from the database
statsoptionalbooleanreturn stats of operation
datastoreoptionalstringdatastore to access

response:

{
"data": {
"survey": [
{
"createdby": "<email>",
"createdon": "<timestamp>",
"deletedby": "<email>",
"deletedon": "<timestamp>",
"description": "custom entity field",
"id": "<id>",
"ownerid": "<ownerid>",
"status": true,
"updatedby": "<email>",
"updatedon": "<timestamp>"
}
]
}
}

PATCH /data/rest (bulk query to perform multiple data queries at once)

nametypedata typedescription
datastoreoptionalstringdatastore to access
searchoptionalstringdatastore to access
expressionoptionalstringjq expression to evaluate over the response
statsoptionalbooleanreturn stats of operation
metaoptionalstringadd meta key in response
noversionoptionalstringbypasses creating a version
{
"queries": [
{
"query": "entity(DSLquery: argument){fields}"
}
]
}

DSL is an acryonym for Data Selection Language

A DSLquery lets you perform the query on the entity that is being queried for

There are various DSLqueries that can be used

namedata typedescriptionexample
filterstringfilters the data (discussed above in get all entity)entity(filter: ‘status is not “null”‘)
referencestringreturn stats of operation
orderstring, csv, space separatedorders the reponse based on the field specifiedentity(order: ‘createdon desc’)
pagesizeintpagination parameter for how many entities in the responseentity(page: 2, pagesize: 10)
pageintpagination parameter for which page to selectentity(page: 2, pagesize: 10)
deltabooleanreturn delta for cdc entityentity(delta: true)
statesbooleanentity(states: true)
cdcbooleanentity(cdc: true)
idstringspecifies the if of the entity to returnentity(id: ‘01HCVTEX25MQCJCQYJBBAHNK74’)
deletedbooleanquery on deleted entities tooentity(deleted: true)
unmaskbooleanunmasks masked fields (if access rule is given)entity(unmask: true)
untokenizebooleanuntokenizes masked fields (if access rule is given)entity(untokenize: true)
sendhashbooleansend hashed fieldsentity(sendhash: true)
versionstring, containing a number of the versionversion of the entity to get (cdc entities)entity(version: “2”)

request:

{
"queries": [
{
"query": "survey(id: \"01HCKVG283M00JQPS7VCWRDM5Z\", filter: 'status = true', states: true, page: 1, pagesize: 2){section(filter: 'body = \"first section body\"'){question{}}}"
}
]
}

response:

{
"data": {
"survey": {
"createdby": "<email>",
"createdon": "<token>",
"deletedby": null,
"deletedon": null,
"description": "demo",
"id": "01HCKVG283M00JQPS7VCWRDM5Z",
"status": true,
"section": {
"body": "first section body",
"question": {
"questiontype": "text"
}
}
}
}
}

request: Page and Page size

{
"queries": [
{
"query": "survey(filter: 'status = true', states: true, page: 1, pagesize: 2){section{question{}}}"
}
]
}

response:

{
"data": {
"survey": [
{
"description": "second complete survey",
"id": "01HCKR9E7CSENFE4ZR7RQRZZKK",
"section": [
{
"body": "first section body",
"heading": "First section",
"id": "01HCKR9E7GV7H29BFWQ7278NRV",
"question": {
"id": "01HCKR9E7S1GCMWR1AX2S5NEJ1",
"questiontype": "text",
"rules": ".*",
"sectionid": "01HCKR9E7GV7H29BFWQ7278NRV"
},
"surveyid": "01HCKR9E7CSENFE4ZR7RQRZZKK"
},
{
"body": "second section does not contain a question",
"heading": "Second section",
"id": "01HCKR9E7WQ1X3RRMN8CR027YG",
"medialink": null,
"pagenumber": 0,
"question": null,
"surveyid": "01HCKR9E7CSENFE4ZR7RQRZZKK"
}
],
"status": true,
"validfrom": "2023-10-13",
"validtill": "2023-11-13"
},
{
"description": "demo",
"id": "01HCKVG283M00JQPS7VCWRDM5Z",
"ownerid": "01GGCG5ZPVXWA17JFGTS1HD03F",
"section": [
{
"body": "first section body",
"heading": "First section",
"id": "01HCKVG287YE55C2CZGNJCJN07",
"medialink": null,
"pagenumber": 0,
"question": {
"id": "01HCKVG28E9P1P0H6EXWJ1DE6H",
"questiontype": "text",
"rules": ".*",
"sectionid": "01HCKVG287YE55C2CZGNJCJN07"
},
"surveyid": "01HCKVG283M00JQPS7VCWRDM5Z"
},
{
"body": "second section does not contain a question",
"heading": "Second section",
"id": "01HCKVG28HEAB5QFJ08RFDTYC7",
"medialink": null,
"pagenumber": 0,
"question": null,
"surveyid": "01HCKVG283M00JQPS7VCWRDM5Z"
}
],
"status": true,
"validfrom": "2023-10-13",
"validtill": "2023-11-13"
}
]
}
}

GraphQL is supported on kis.ai out of the box

Section titled “GraphQL is supported on kis.ai out of the box”

Let’s query items data

request:

{
items(orderby: "id desc", filter: "price > $price1") {
id
itemname
price
}
}

variables:

{
"price1": 300
}

response:

{
"data": {
"items": [
{
"id": "01GEQ1YYM0MMXVSFFJFZSD6ADE",
"itemname": "Beetroot and Cheese Croquettes",
"price": 350
},
{
"id": "01GEQ1JEEXSABSTQHHKH6CTV68",
"itemname": "Baked Vegetable Casserole",
"price": 550
},
{
"id": "01GEPREATBE87QFEJT2KHJHPMG",
"itemname": "Spanish Gin Tonic",
"price": 485
}
]
}
}

We can query multiple related entities in a single query. Let’s get the list of items for menu entity.

request:

{
menu {
name
id
items {
itemname
}
}
}

response:

{
"data": {
"menu": [
{
"id": "01GE1DZNR1QXCBB1T1C43JXJB2",
"items": [
{
"itemname": "Baked Vegetable Casserole"
},
{
"itemname": "Beetroot and Cheese Croquettes"
}
],
"name": "Breakfast all day!"
}
]
}
}

Let’s create a new menu called Dinner

request:

mutation createMenu ($input: MenuInput) {
createMenu (input: $input) {
name
summary
outletid
}
}

variables:

{
"input": {
"name": "Dinner",
"summary":"Dinner menu",
"outletid":"01GE1DBGFC8D8545YM6YXFWK6C"
}
}

response:

{
"data": {
"menu": {
"id": "01GF32ZPS4HZQ38E07C8PRK103",
"name": "Dinner"
}
}
}

POST /data/graphql (graphql query on the data layer)

request:

{
survey
section
question
answer
}

response:

{
"data": {
"survey": {
},
"section": {
},
"question": {
},
"answer": {
}
}
}

POST /data/graphql (graphql query on the data layer)

request:

mutation createSurvey ($input: SurveyInput) {
createSurvey (input: $input) {
description
validfrom
validto
}
}

inputs:

{
"input": {
"description": "graphql",
"validfrom": "2023-10-10",
"validtill": "2023-10-10"
}
}

response:

{
"data": {
"survey": {
"description": "Dinner",
"validfrom": "2023-10-10",
"validtill": "2023-10-10"
}
}
}

Note: add all capabilities for multi action mutation

POST /data/rest (multiple operation can be performed at once)

nametypedata typedescription
deletechildrenoptionalbooleandelete children of this entity
{
"operations": [
{
"action": {
"entity": "<<actions to be performed>>",
"entity": {
"action": "<<actions to be performed>>",
"actionKey": "<<actionValue>>"
}
},
"data": {
"<<entity1>>": {
}
}
}
]
}

Multiple Operations can be specified, in which each Operation contains an action and data block

Action Block format can be of three types

  • string
  • entity : action string
  • entity : action map

Data Block format is the shape of the entity that we’d like to create, update

To delete - just an id is enough

To delete along with it’s children - “deletechildren” key must be set to true in action map (specified in action block)

request:

{
"operations": [
{
"action": {
"survey": "create"
},
"data": {
"survey": [
{
"description": "bulk mutation demo",
"validfrom": "2023-10-10",
"validtill": "2023-11-11"
}
]
}
},
{
"action": {
"survey": {
"action": "delete",
"deletechildren": "true"
}
},
"data": {
"survey": [
{
"id": "01HD0PNXGNWE6R608MYHTGRMEE"
}
]
}
},
{
"action": {
"section": "create"
},
"data": {
"section": {
"surveyid": "01HD0PNXGNWE6R608MYHTGRMEE",
"body": "some data",
"heading": "demo heading"
}
}
}
]
}

response:

{
"data": {
"section": {
"body": "some data",
"createdby": "[email protected]",
"createdon": "2023-10-18T10:16:09+04:00",
"deletedby": null,
"deletedon": null,
"heading": "demo heading",
"id": "01HD0PTR6J9ZC0K3BNA9CB2R6F",
"medialink": null,
"pagenumber": 0,
"position": null,
"surveyid": "01HD0PNXGNWE6R608MYHTGRMEE",
"updatedby": "[email protected]",
"updatedon": "2023-10-18T10:16:09+04:00"
},
"survey": [
{
"createdby": "[email protected]",
"createdon": "2023-10-18T10:16:09+04:00",
"deletedby": null,
"deletedon": null,
"description": "bulk mutation demo",
"id": "01HD0PTR6BE2X8ZCMAW4AY7ZH5",
"ownerid": "01GGCG5ZPVXWA17JFGTS1HD03F",
"status": true,
"updatedby": "[email protected]",
"updatedon": "2023-10-18T10:16:09+04:00",
"validfrom": "2023-10-10",
"validtill": "2023-11-11"
},
{
"createdby": "[email protected]",
"createdon": "2023-10-18T10:13:30+04:00",
"deletedby": "[email protected]",
"deletedon": "2023-10-18T10:16:09+04:00",
"description": "bulk mutation demo",
"id": "01HD0PNXGNWE6R608MYHTGRMEE",
"ownerid": "01GGCG5ZPVXWA17JFGTS1HD03F",
"status": true,
"updatedby": "[email protected]",
"updatedon": "2023-10-18T10:13:30+04:00",
"validfrom": "2023-10-10",
"validtill": "2023-11-11"
}
]
}
}

POST /data/bulk (upload excel sheet to create data)

Uploads the xlsx data into the datastore

It tries to create the data uploaded

It depends on

  • sheet name, to decide which entity to insert the data into
nametypedata typedescription
datastoreoptionalstringdatastore to use

request:

Screenshot of the xlsx file being uploaded in microsoft excel

response:

{
"answer": {
"errored": 0,
"errors": [],
"imported": 1
}
}

PATCH /data/bulk (download data as an excel file)

Depending on the query given, the data is formatted in xlsx file and sent as xml data

nametypedata typedescription
datastoreoptionalstringdatastore to use

request:

{
"queries": [
{
"query": "survey(pagesize: -1){}"
}
]
}

response:

Response is a application/xml data that is to be saved as a .xlsx file to view the file

xlsx would display this Table

Screenshot of the xlsx file in microsoft excel

GET /data/ramlschema (get the rest raml schema)

A config for tenant seshat is needed for this api to work

properties:
rest:
schema: true

response:

#%RAML 1.0
title: default
mediaType: applicaton/json
protocols:
- HTTPS
/rest:
patch:
description: query entities in bulk
queryParameters:
stats:
displayName: Send Stats
type: boolean
description: Set the stats about the request handling
example: true
required: false
post:
description: create entities in bulk
queryParameters:
stats:
displayName: Send Stats
type: boolean
description: Set the stats about the request handling
example: true
required: false

GET /data/stateflows (get all stateflows defined)

response:

stateflows:
bugflow2:
name: bugflow2
description: ""
initial: new
states:
accepted:
"on":
FIXED:
target: fixed
REJECT:
target: rejected
closed:
type: final
surveyflow:
name: surveyflow

GET /data/stateflows/:name (get stateflow definition by name)

nametypedata typedescription
namerequiredstringstateflow to return

request: if request was to /data/stateflows/bugflow2

response:

stateflows:
name: bugflow2
description: ""
initial: new
states:
accepted:
"on":
FIXED:
target: fixed
REJECT:
target: rejected
closed:
type: final

DELETE /data/cache (delete tenant cache)

response:

{
"success": true
}

POST /data/rest/:entity/search

nametypedata typedescription
entityrequiredstringentity to search
nametypedata typedescription
expressionoptionalstringjq expression to evaluate over the response

request:

{
"query": "apple",
"filter": ""
}

response:

{
"data": {
"bug": {
"estimatedTotalHits": 0,
"facetDistribution": null,
"hits": [],
"hitsPerPage": 0,
"limit": 20,
"offset": 0,
"page": 0,
"processingTimeMs": 0,
"query": "apple",
"totalHits": 0,
"totalPages": 0
}
}
}

POST /data/rest

nametypedata typedescription
entityrequiredstringentity to search
nametypedata typedescription
searchrequiredbooleanparameter to enable search payload parsing
expressionoptionalstringjq expression to evaluate over the response

request:

{
"entities": [
"bug",
"menu"
],
"filter": ""
}

response:

{
"data": {
"bug": {
"estimatedTotalHits": 2,
"facetDistribution": null,
"hits": [
{
"boolfield": null,
"createdby": "testemail",
"createdon": "2023-10-25T09:00:56Z",
"deletedby": null,
"deletedon": null,
"description": null,
"id": "01HDK11H1WE5EGFYVRXQQGWBPK",
"name": "test bug 1",
"state2": "new",
"updatedby": "testemail",
"updatedon": "2023-10-25T09:00:56Z",
"userid": null,
"version": 1
},
{
"boolfield": null,
"createdby": "testemail",
"createdon": "2023-10-25T09:02:56Z",
"deletedby": null,
"deletedon": null,
"description": null,
"id": "01HDK156D9WN6PVHVDKK5WG1BR",
"intfield": null,
"name": "test bug 2",
"state2": "new",
"updatedby": "testemail",
"updatedon": "2023-10-25T09:02:56Z",
"userid": null,
"version": 1
}
],
"hitsPerPage": 0,
"limit": 20,
"offset": 0,
"page": 0,
"processingTimeMs": 0,
"query": "",
"totalHits": 0,
"totalPages": 0
},
"menu": {
"estimatedTotalHits": 0,
"facetDistribution": null,
"hits": [],
"hitsPerPage": 0,
"limit": 20,
"offset": 0,
"page": 0,
"processingTimeMs": 0,
"query": "",
"totalHits": 0,
"totalPages": 0
}
}
}