# Flattening: Transformação de dados utilizando JSONata

### Objetivo <a href="#objetivo" id="objetivo"></a>

Alguns serviços SaaS permitem a criação de campos personalizados. No caso em questão, trata-se de campos de informação criados para acompanhar chamados de atendimento - também conhecidos como tickets. Normalmente, esses campos possuem campos de título ou descrição, porém, geralmente as APIs desses serviços utilizam identificadores numéricos para referenciá-los.

Exemplo: Um ticket no Zendesk com campos personalizados contém uma propriedade chamada **custom\_fields** contendo uma lista de ids e seus valores.

```json
"custom_fields": [
  {
    "id": 360032901812,
    "value": "0457000"
  },
  {
    "id": 360032943991,
    "value": "Depto Suporte"
  },
  {
    "id": 360030824791,
    "value": "XDY667"
  }
]

```

Cada **custom filed** possui seu nome, mas a comunicação por API utiliza apenas o ID para referenciar os campos. Para trabalharmos com dados analíticos vamos "traduzir" os ID para os seus nomes verdadeiros utilizando a tabela abaixo, que foi construída apenas para esse propósito:

```json
 "map": {
  "360032901812": "CEP",
  "360032943991": "Contato Assistência",
  "360030824791": "Cupom"
}
```

O objetivo é transformar a informação original do Zendesk em um objeto contendo os nomes das propriedades, como no exemplo abaixo:

```json
 "resp": {
  "CEP": "0457000",
  "Contato Assistência": "Depto Suporte",
  "Cupom": "XDY667"
}
```

### **Registro de Tickets Completo** <a href="#registro-de-tickets-completo" id="registro-de-tickets-completo"></a>

Segue abaixo a listagem do conteúdo JSON original que utilizaremos. Observe que existem dois **tickets** em uma lista na propriedade **tickets** e o mapeamento está na propriedade **map**.

```json
{
 "tickets": [
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612022.json",
     "id": 612022,
     "external_id": null,
     "created_at": "2023-10-18T08:12:42Z",
     "updated_at": "2023-10-18T08:212:42Z",
     "subject": "Importação não funcional",
     "description": "Cliente reclama que a importação trava com o seu arquivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Suporte"
       },
       {
         "id": 360030824791,
         "value": "XDY667"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838127
   },
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612011.json",
     "id": 612011,
     "external_id": null,
     "created_at": "2023-10-18T03:26:42Z",
     "updated_at": "2023-10-18T03:26:42Z",
     "subject": "Problema de acesso ao site. Cliente novo",
     "description": "Cliente reclama que o browser não dá acesso ao site",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0381000"
       },
       {
         "id": 360032943991,
         "value": "Parceiro"
       },
       {
         "id": 360030824791,
         "value": "WQK890"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838249
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contato Assistência",
   "360030824791": "Cupom"
 }
}

```

E no final da transformação desejamos chegar ao seguinte resultado:

```json
{
 "tickets": [
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612022.json",
     "id": 612022,
     "external_id": null,
     "created_at": "2023-10-18T08:12:42Z",
     "updated_at": "2023-10-18T08:212:42Z",
     "subject": "Importação não funcional",
     "description": "Cliente reclama que a importação trava com o seu arquivo",
     "satisfaction_rating": null,
     "custom_status_id": 1900000838127,
     "CEP": "0457000",
     "Contato Assistência": "Depto Suporte",
     "Cupom": "XDY667"
   },
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612011.json",
     "id": 612011,
     "external_id": null,
     "created_at": "2023-10-18T03:26:42Z",
     "updated_at": "2023-10-18T03:26:42Z",
     "subject": "Problema de acesso ao site. Cliente novo",
     "description": "Cliente reclama que o browser não dá acesso ao site",
     "satisfaction_rating": null,
     "custom_status_id": 1900000838249,
     "CEP": "0381000",
     "Contato Assistência": "Parceiro",
     "Cupom": "WQK890"
   }
 ]
}

```

#### Solução <a href="#light_bulb_on-solucao" id="light_bulb_on-solucao"></a>

Para solucionar a situação, siga os seguintes passos:

<mark style="color:blue;">**Passo 1: Criar uma função que permita encontrar um nome de custom field baseado-se apenas no seu ID.**</mark>&#x20;

Ou seja, ao fornecer um ID, como por exemplo `360035700992`, a função busca e identifica o nome correspondente dentro de uma lista de mapeamento.

Para isso usamos a função **$lookup** do JSONata, como por exemplo:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th><th data-hidden>JSONata</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{
 "map": {
    "360032901812": "CEP",
    "360032943991": "Contato Assistência",
    "360030824791": "Cupom"
  }
}

</code></pre></td><td><pre><code>$lookup(map, "360032901812") </code></pre></td><td>"CEP"</td><td></td></tr></tbody></table>

Observe que a função **$lookup** recebe como parâmetros uma lista e uma string que contém o nome da propriedade a ser buscada na lista. A função retorna o valor da propriedade encontrada.

***

\ <mark style="color:blue;">**Passo 2: Mapear cada entrada de um custom field em uma propriedade cujo valor é o mesmo valor do custom field.**</mark>

Para isso, vamos utilizar a função [**$map**](https://docs.jsonata.org/higher-order-functions#map) do JSONata. Essa função recebe uma lista e permite a definição de uma outra função que será executada para cada um dos elementos da lista. É equivalente a um laço FOR que executará a função para cada um dos elementos da lista.

Conseguimos executar essa operação através do código abaixo:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{  
  "custom_fields": [
    {
      "id": 360032901812,
      "value": "0457000"
    },
    {
      "id": 360032943991,
      "value": "Depto Suporte"
    },
    {
      "id": 360030824791,
      "value": "XDY667"
    }
  ],
  "map": {
    "360032901812": "CEP",
    "360032943991": "Contato Assistência",
    "360030824791": "Cupom"
  }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">$map(custom\_fields, function($v, $i, $a) {

```
    {$lookup(map,$string($v.id)) : $v.value}

})
```

</code></pre></td><td><pre class="language-json"><code class="lang-json">\[
{
"CEP": "0457000"
},
{
"Contato Assistência": "Depto Suporte"
},
{
"Cupom": "XDY667"
}
] </code></pre></td></tr></tbody></table>

Observe que a função **$map** recebeu a lista **custom\_fields** como parâmetro. Além disso, especificamos uma função através da chamada **function($v, $i, $a){}**. As variáveis especificadas nesta chamada recebem respectivamente os seguintes valores:

* **$v** : elemento do array que está sendo processado
* **$i** : indice do elemento no array
* **$a** : o array inteiro

Utilizamos as variáveis acima dentro da função para referenciar o que precisamos processar.

Essa função retorna um objeto para cada elemento da lista que é processado. O conteúdo desse objeto é dado por:

```json
                 {$lookup(map,$string($v.id)) : $v.value}
```

Observe que o nome da propriedade na resposta é exatamente o resultado da função de **$lookup** quando buscamos no objeto **map** pela propriedade cujo nome é o valor da propriedade **id** do elemento sendo processado (**$**[**v.id**](http://v.id/)). E o valor da resposta é exatamente o valor da propriedade **value** do mesmo elemento.

Na primeira interação desse **$map** teremos:

<table data-header-hidden><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td>$v</td><td><pre class="language-json"><code class="lang-json">{
  "id": 360032901812,
  "value": "0457000"
},
</code></pre></td></tr><tr><td>$i</td><td>0</td></tr><tr><td>$a</td><td><pre class="language-json"><code class="lang-json">[
  {
    "id": 360032901812,
    "value": "0457000"
  },
  {
    "id": 360032943991,
    "value": "Depto Suporte"
  },
  {
    "id": 360030824791,
    "value": "XDY667"
  }
]

</code></pre></td></tr></tbody></table>

\
Portanto o objeto retornado é:

<pre><code><strong>                            {"CEP" : "0457000"}
</strong></code></pre>

***

<mark style="color:blue;">**Passo 3: Juntar objetos de uma lista em um único objeto**</mark>

Observe que a resposta do **$map** no passo anterior retorna uma lista onde cada objeto é uma propriedade diferente. Precisamos agora juntar esses objetos de uma lista em um único objeto. Para isso, vamos utilizar a função **$merge**.&#x20;

No nosso exemplo, basta passar o resultado da operação anterior como parâmetro da função **$merge**. Essa função concatena todas as propriedades de todos objetos na lista em um único objeto.

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{  
  "custom_fields": [
    {
      "id": 360032901812,
      "value": "0457000"
    },
    {
      "id": 360032943991,
      "value": "Depto Suporte"
    },
    {
      "id": 360030824791,
      "value": "XDY667"
    }
  ],
  "map": {
    "360032901812": "CEP",
    "360032943991": "Contato Assistência",
    "360030824791": "Cupom"
  }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">$merge($map(custom\_fields, function($v, $i, $a) {

```
    {$lookup(map,$string($v.id)) : $v.value}

}))
```

</code></pre></td><td><pre class="language-json"><code class="lang-json">{
"CEP": "0457000",
"Contato Assistência": "Depto Suporte",
"Cupom": "XDY667"
}

</code></pre></td></tr></tbody></table>

***

<mark style="color:blue;">**Passo 4: Função $flat**</mark>

Sabemos que essa função do passo 03 deverá ser executada para cada um dos tickets e, portanto, teremos que invocá-la muitas vezes. Por essa razão, criamos uma função que acomoda esse código e espera apenas a propriedade **custom\_fields** do ticket para ser executada.

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{ 
 "custom_fields": [
   {
     "id": 360032901812,
     "value": "0457000"
   },
   {
     "id": 360032943991,
     "value": "Depto Suporte"
   },
   {
     "id": 360030824791,
     "value": "XDY667"
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contato Assistência",
   "360030824791": "Cupom"
 }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">   $flat := function($fld) {

$merge($map($fld, function($v, $i, $a) {

```
   {$lookup(map,$string($v.id)) : $v.value}
```

}))};

/\* Exemplo de chamada da função \*/

{"resp" : $flat(custom\_fields)};

) </code></pre></td><td><pre class="language-json"><code class="lang-json">{
"resp": {
"CEP": "0457000",
"Contato Assistência": "Depto Suporte",
"Cupom": "XDY667"
}
} </code></pre></td></tr></tbody></table>

Observe que criamos a função **$flat** definida como:

```json
                       $flat := function($fld) { };
```

O código da função está definido dentro das chaves sendo exatamente igual à função definida no passo anterior. A única diferença é que parametrizamos a lista de **custom\_fields** na forma da variável **$fld**.&#x20;

Outra mudança observada é que precisamos envolver o código com  parênteses que englobam todas as especificações funcionais. Isso nos permite definir variáveis e funções que terminam com ponto e vírgula (;).

Dentro desse bloco programático precisamos invocar a função para que o JSONata efetivamente execute o código. É exatamente isso que fazemos com a seguinte linha:

```
                      {"resp" : $flat(custom_fields)};
```

Chamamos a função passando a lista definida em **custom\_field** na variável **$fld**. Com isso recebemos o objeto que desejávamos.

Finalmente nota-se que utilizamos linhas de comentários para documentar o código. Essas linhas possuem delimitadores no formato **/\* texto \*/**.

***

<mark style="color:blue;">**Passo 5: Consolidando os campos mapeados no objeto de ticket original com a função $merge**</mark>

Já geramos no passo 4 um objeto contendo os campos do **custom\_fields** já mapeados. Precisamos agora inserir todas as propriedades desse novo objeto no objeto do ticket original. A melhor forma de fazer isso é utilizando a função **$merge**. Essa função recebe um array de objetos e consolida todas as propriedades dos objetos individuais em um único objeto.

Entretanto, precisamos construir um array que contenha dois objetos, um com as propriedades originais do ticket e outro com as novas propriedades. Conseguimos fazer isso com a seguinte linha de código:

```json
               $append(ticket, $flat(ticket.custom_fields))
```

A função **$append** neste caso anexa dois objetos à uma lista, sendo que primeiro objeto é o **tickets** e o segundo objeto é o resultado da nossa operação **$flat** que também retorna um objeto. Nesse caso a função **$append** retorna uma lista contendo os dois objetos mencionados.

Nos falta apenas executar a função **$merge** sobre a lista gerada. O JSONata nos permite uma sintaxe alternativa na qual indicamos uma função que recebe como argumento o resultado do código previamente especificado. Segue o exemplo abaixo:

```json
          $append(ticket, $flat(ticket.custom_fields)) ~> merge()
```

No exemplo acima, a função **$merge** recebe o resultado da função **$append** como parâmetro de execução. Segue abaixo o exemplo completo para este passo:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json" data-title="index.js" data-overflow="wrap" data-line-numbers><code class="lang-json">{
 "tickets": [
   {
     "description": "Cliente reclama que a importação trava com o seu arquivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Suporte"
       },
       {
         "id": 360030824791,
         "value": "XDY667"
       }
     ]
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contato Assistência",
   "360030824791": "Cupom"
 }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">(

/\* Função que mapeia os customs\_fields e devolve um objeto com as propriedades \*/

$flat := function($fld)

```
   {$merge($map($fld, function($v, $i, $a) {

       {$lookup(map,$string($v.id)) : $v.value}

   }))};
```

{

```
   /* código de teste */

   "register":$append(tickets[0], $flat(tickets[0].custom_fields)) ~> $merge()
```

}

) </code></pre></td><td><pre class="language-json"><code class="lang-json">{
"register": {
"description": "Cliente reclama que a importação trava com o seu arquivo",
"custom\_fields": \[
{
"id": 360032901812,
"value": "0457000"
},
{
"id": 360032943991,
"value": "Depto Suporte"
},
{
"id": 360030824791,
"value": "XDY667"
}
],
"CEP": "0457000",
"Contato Assistência": "Depto Suporte",
"Cupom": "XDY667"
}
} </code></pre></td></tr></tbody></table>

Observe que a resposta contém todas as propriedades originais do ticket, mais as propriedades geradas no mapeamento. Mais adiante apresentaremos uma forma de remover o campo **custom\_fields** que tornou-se desnecessário depois do mapeamento.      &#x20;

***

<mark style="color:blue;">**Passo 6: Processamento de múltiplos tickets usando $map e a função $all**</mark>\
Até o passo 5 consideramos a manipulação de um único ticket, porém recebemos múltiplos tickets em um único array e precisamos processar cada um dos tickets individualmente. Esse é exatamente o propósito da função **$map** que será utilizada mais uma vez para processar cada um dos tickets individualmente.

Faremos isso criando uma nova função chamada **$all** cujo objetivo é processar todos os tickets, como definido abaixo:

```json
            $all := $map(tickets, function($r, $s, $t) {

            $append($r, $flat($r.custom_fields)) ~> $merge()

             }) ;
```

Basicamente essa função executa o passo 5 para cada um dos tickets recebidos no array **tickets**.

Existe apenas um problema na abordagem acima que se manifesta apenas quando recebemos um array vazio de tickets. Na forma como está acima, o resultado seria apenas um objeto vazio. Para garantir que essa execução **sempre** retorne um array, mesmo que vazio, executamos um **$append** vazio na sequência da função. Esse **$append** é inócuo quando a operação resultar um array de tickets, mas será útil quando a função retornar vazio, pois transformará o objeto vazio em um array vazio.

```json
             $all := $map(tickets, function($r, $s, $t) {
             $append($r, $flat($r.custom_fields)) ~> $merge()

             }) ~> $append([]);
```

&#x20;Com isso, nosso código fica:

<table><thead><tr><th>Input</th><th width="211">JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{
 "tickets": [
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612022.json",
     "id": 612022,
     "external_id": null,
     "created_at": "2023-10-18T08:12:42Z",
     "updated_at": "2023-10-18T08:212:42Z",
     "subject": "Importação não funcional",
     "description": "Cliente reclama que a importação trava com o seu arquivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Suporte"
       },
       {
         "id": 360030824791,
         "value": "XDY667"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838127
   },
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612011.json",
     "id": 612011,
     "external_id": null,
     "created_at": "2023-10-18T03:26:42Z",
     "updated_at": "2023-10-18T03:26:42Z",
     "subject": "Problema de acesso ao site. Cliente novo",
     "description": "Cliente reclama que o browser não dá acesso ao site",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0381000"
       },
       {
         "id": 360032943991,
         "value": "Parceiro"
       },
       {
         "id": 360030824791,
         "value": "WQK890"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838249
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contato Assistência",
   "360030824791": "Cupom"
 }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">(

/\* Função que mapeia os customs\_fields e devolve um objeto com as propriedades \*/

$flat := function($fld)

```
   {$merge($map($fld, function($v, $i, $a) {

       {$lookup(map,$string($v.id)) : $v.value}

   }))};
```

/\* Função que executa o mapeamento para cada um dos tickets \*/

$all := $map(tickets, function($r, $s, $t) {

```
   $append($r, $flat($r.custom_fields)) ~> $merge()
```

}) \~> $append(\[]);

{

```
   /* executa função */

   "registers":$all
```

}

) </code></pre></td><td><pre class="language-json"><code class="lang-json">{
"registers": \[
{
"url": "<https://soft.zendesk.com/api/v2/tickets/612022.json>",
"id": 612022,
"external\_id": null,
"created\_at": "2023-10-18T08:12:42Z",
"updated\_at": "2023-10-18T08:212:42Z",
"subject": "Importação não funcional",
"description": "Cliente reclama que a importação trava com o seu arquivo",
"custom\_fields": \[
{
"id": 360032901812,
"value": "0457000"
},
{
"id": 360032943991,
"value": "Depto Suporte"
},
{
"id": 360030824791,
"value": "XDY667"
}
],
"satisfaction\_rating": null,
"sharing\_agreement\_ids": \[],
"custom\_status\_id": 1900000838127,
"CEP": "0457000",
"Contato Assistência": "Depto Suporte",
"Cupom": "XDY667"
},
{
"url": "<https://soft.zendesk.com/api/v2/tickets/612011.json>",
"id": 612011,
"external\_id": null,
"created\_at": "2023-10-18T03:26:42Z",
"updated\_at": "2023-10-18T03:26:42Z",
"subject": "Problema de acesso ao site. Cliente novo",
"description": "Cliente reclama que o browser não dá acesso ao site",
"custom\_fields": \[
{
"id": 360032901812,
"value": "0381000"
},
{
"id": 360032943991,
"value": "Parceiro"
},
{
"id": 360030824791,
"value": "WQK890"
}
],
"satisfaction\_rating": null,
"sharing\_agreement\_ids": \[],
"custom\_status\_id": 1900000838249,
"CEP": "0381000",
"Contato Assistência": "Parceiro",
"Cupom": "WQK890"
}
]
} </code></pre></td></tr></tbody></table>

***

<mark style="color:blue;">**Passo 7: Removendo propriedades indesejadas com o Transform**</mark>

Observe que o resultado no passo 06 ainda exige algumas propriedades que não são mais desejadas, como o **custom\_fields**. Vamos remover essa propriedade assim como o **sharing\_agreements\_ids** para ilustrar como remover propriedades indesejadas.

Utilizamos o operador [**Transform**](https://docs.jsonata.org/other-operators#-------transform) para executar esse tipo de remoção. A operação abaixo remove as propriedades:

```json
        $all ~> |$ |$, ["custom_fields", "sharing_agreement_ids"]|
```

Observe que invocamos a função **$all** e depois submetemos o resultado dela ao operador **Transform** que recebe três argumentos. Os dois primeiros **$** referem-se ao objeto raiz e a lista seguinte possui as propriedades que são removidas.&#x20;

Com isso, chegamos ao nosso resultado final:

<table><thead><tr><th>Input</th><th>JSONata</th><th>Output</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{
 "tickets": [
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612022.json",
     "id": 612022,
     "external_id": null,
     "created_at": "2023-10-18T08:12:42Z",
     "updated_at": "2023-10-18T08:212:42Z",
     "subject": "Importação não funcional",
     "description": "Cliente reclama que a importação trava com o seu arquivo",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0457000"
       },
       {
         "id": 360032943991,
         "value": "Depto Suporte"
       },
       {
         "id": 360030824791,
         "value": "XDY667"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838127
   },
   {
     "url": "https://soft.zendesk.com/api/v2/tickets/612011.json",
     "id": 612011,
     "external_id": null,
     "created_at": "2023-10-18T03:26:42Z",
     "updated_at": "2023-10-18T03:26:42Z",
     "subject": "Problema de acesso ao site. Cliente novo",
     "description": "Cliente reclama que o browser não dá acesso ao site",
     "custom_fields": [
       {
         "id": 360032901812,
         "value": "0381000"
       },
       {
         "id": 360032943991,
         "value": "Parceiro"
       },
       {
         "id": 360030824791,
         "value": "WQK890"
       }
     ],
     "satisfaction_rating": null,
     "sharing_agreement_ids": [],
     "custom_status_id": 1900000838249
   }
 ],
 "map": {
   "360032901812": "CEP",
   "360032943991": "Contato Assistência",
   "360030824791": "Cupom"
 }
}

</code></pre></td><td><pre class="language-json"><code class="lang-json">(

/\* Função que mapeia os customs\_fields e devolve um objeto com as propriedades \*/

$flat := function($fld)

```
   {$merge($map($fld, function($v, $i, $a) {

       {$lookup(map,$string($v.id)) : $v.value}

   }))};
```

/\* Função que executa o mapeamento para cada um dos tickets \*/

$all := $map(tickets, function($r, $s, $t) {

```
   $append($r, $flat($r.custom_fields)) ~> $merge()
```

}) \~> $append(\[]);

{

```
   /* executa e remove propriedades indesejadas */

   "tickets":$all ~> |$ |$, ["custom_fields", "sharing_agreement_ids"]|
```

}

) </code></pre></td><td><pre class="language-json"><code class="lang-json">{
"tickets": \[
{
"url": "<https://soft.zendesk.com/api/v2/tickets/612022.json>",
"id": 612022,
"external\_id": null,
"created\_at": "2023-10-18T08:12:42Z",
"updated\_at": "2023-10-18T08:212:42Z",
"subject": "Importação não funcional",
"description": "Cliente reclama que a importação trava com o seu arquivo",
"satisfaction\_rating": null,
"custom\_status\_id": 1900000838127,
"CEP": "0457000",
"Contato Assistência": "Depto Suporte",
"Cupom": "XDY667"
},
{
"url": "<https://soft.zendesk.com/api/v2/tickets/612011.json>",
"id": 612011,
"external\_id": null,
"created\_at": "2023-10-18T03:26:42Z",
"updated\_at": "2023-10-18T03:26:42Z",
"subject": "Problema de acesso ao site. Cliente novo",
"description": "Cliente reclama que o browser não dá acesso ao site",
"satisfaction\_rating": null,
"custom\_status\_id": 1900000838249,
"CEP": "0381000",
"Contato Assistência": "Parceiro",
"Cupom": "WQK890"
}
]
} </code></pre></td></tr></tbody></table>
