> For the complete documentation index, see [llms.txt](https://docs.agnosticdata.ai/agnosticdata.ai-or-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.agnosticdata.ai/agnosticdata.ai-or-documentation/fundamentals/destinations.md).

# Destinations

### Destinations

#### API Rest Agnostic

A seguir temos as configurações necessárias para cadasdtrar um REST API com "destination". &#x20;

````json
```json
      "rest_api": [
        {
          "id": "instanceid",
          "method": "POST",
          "base_url": "https://api.rd.services",
          "routes": {
            "contacts": "/platform/contacts",
            "deals": "/platform/deals",
            "companies": "/platform/companies"
          },
          "docs": "https://developers.rdstation.com/en/reference/contacts",
          "is_active": true,
          "api_key": "asas",
          "api_version": "v15.0",
          "auth_type": {
            "type": "Bearer",
            "settings": {
              "token": "samplexasasadda"
            }
          },
          "headers": {
            "Content-Type": "application/json",
            "accept": "application/json"
          }
        }
      ]
    },
```
````

**method**

O atributo é o tipo de VERBO padrão que será utilizado caso uma rota não tenha um verbo definido.&#x20;

**routes**

São as rotas configuradas como destino e podem ser definidas a partir de uma condição em **Filtros**. Ao apontar para um destino API Rest Agnostic iremos enviar o evento "as-is" para a base\_url + route selecionada e utilizar o tipo de verbo para requisição da rota ou o default.&#x20;

````json
// Sample routes
```json
          "routes": {
            "contacts": {
              "path": "/platform/contacts",
              "method": "POST"
            },
            "deals": {
              "path": "/platform/deals/",
              "method": "GET"
            },
            "companies": "/platform/companies"
          },
```
````

**{{route}}**

Se for adicionado {{route}} na base\_url a rota default será interpolado no local exato onde {{route}} foi inserido. Logo, se você precisa alterar a ordem da concactenação utilize {{route}}.

Se&#x20;

```typescript
"base_url": "http://localhost:3000/{{route}}?access_key={{access_key}}"
```

Quando a rota ou qualquer rota for interpolada na base\_url, ao invés de concatenar base\_url com rota.default.path será interpolado no local exatado de route.&#x20;

O resultado do uso de {{route}} na base url irá resultar em para o exemplo com \`deals\`.&#x20;

> base\_url + deals.path
>
> DE: <http://localhost:3000/{{route}}?access_key={{access_key}}">&#x20;
>
> PARA: [http://localhost:3000/](http://localhost:3000/{{route}}?access_key={{access_key}}")platform/deals/[?access\_key={{access\_key}}"](http://localhost:3000/{{route}}?access_key={{access_key}}")

Sem {{route}} o resultado seria

> base\_url + deals.path
>
> DE: [http://localhost:3000/?access\_key={{access\_key}}"](http://localhost:3000/{{route}}?access_key={{access_key}}")&#x20;
>
> PARA: <http://localhost:3000/?access\\_key=\\{{access\\_key\\}}/platform/deals/>"

**api\_version**

Caso \`api\_version\` esteja definido é necessário que \`base\_url\` tenha a variável de interpolação \`{{api\_version}}\` para a correta aplicação da versão. Veja o exemplo.&#x20;

```json
      "rest_api": [
        {
          "id": "instanceid",
          "method": "POST",
          "base_url": "https://api.rd.services/{{api_version}}",
          ...
```

**auth\_type**

Há variadas possibilidades para autenticar em uma API REST. No Agnostic Data temos algumas suportadas para a implementação de um destination REST.&#x20;

> **Lembre-se**
>
> * Existem duas formas de fluxo de dados:
>   * **1) Destinations** são fluxos onde todo o payload será encaminhado para o destino
>     * no máximo o usuário pode remover alguns campos via **filtros** para casos como supressão de dados pessoais, etc.&#x20;
>   * **2) Actions**: é possível introspectar no conteúdo do evento e modificar, incrementar, adicionar dados ao evento ou outras ações.
>     * Uma função poderá ouvir o gatilho de uma action para executar qualquer manipulação. (Atualmente essa estratégia está em beta fechado).&#x20;
> * Temos dois tipos de tratamentos
>   * **Diretos** onde para cada evento (tupla) poderá ser enviado para um destination (evento original ou supressão de alguns campos ou uma action (conteúdo personalizado)
>   * **Aggregations** quando uma computação/processamento de agregação de dados é realizada. (a definir)

**Settings para auth\_type**

*Quando auth\_type {type: "access\_key"}*

Com auth\_type "access\_key" será substituída as variáveis em settings como parâmetros de URL (querystring), desta forma, a a url\_base deverá ter os mesmos nomes de variáveis dentro de settings para serem interpoladas.&#x20;

No exemplo abaixo, aplicamos o auth\_type "access\_key" para a URL do Google Analytics Measurement. Veja o exemplo.

**URL base Google Analytics Measurement ID** "<https://www.google-analytics.com/mp/collect?measurement\\_id=MEASUREMENT\\_ID\\&api\\_secret=API\\_SECRET>";

```javascript
const project_settings = {
        {
          "id": "instanceid",
          "method": "POST",
          "base_url": "https://www.google-analytics.com/mp/collect?measurement_id={{measurement_id}}&api_secret={{api_secret}}"
          ...
          "auth_type": { 
            "type": "access_key",
            "settings": {
                "measurement_id": "1293912831737687",
                "api_secret": "meusegredo"
            }
          }
        ...
        }
}
```

> Lembre-se: acima temos apenas um exemplo para o Google Analytics Measurement, contudo para o GA Measurement a implemente oficial do Agnostic Data basta informar id e access\_token pela console de cadastro de destinations, onde **id** é measurement\_id e **access\_token** é api\_secret.&#x20;

*Quando auth\_type {type: "Bearer"}*

```javascript
const project_settings = {
        {
          "id": "instanceid",
          "method": "POST"
          ...
          "auth_type": { 
            "type": "Bearer",
            "settings": {
                "token": "samplehashtokenforBearer"
            }
          }
        ...
        }
}
```

*Quando auth\_type {type: "*&#x4F;auth&#x32;*"}*

```javascript
const project_settings = {
        {
          "id": "instanceid",
          "method": "POST"
          ...
          "auth_type": { 
            "type": "Bearer",
            "settings": {
                "access_token": "samplehashtokenforBearer",
                "refresh_token": "",
                "client_id": "",
                "client_secret": "",
                "code": "",
                "url_callback": "http://example.com"
                "url_callback_encoded": "http%3A%2F%2Fexample.com"
            }
          }
        ...
        }
}
```

### BigQuery Destination (schematized)

Para configurar um Google Biguery como Destino é simples basta informar o id do projeto, dataset e tabela, um e-mail de uma service account e sua private key convertida em base64.&#x20;

* **is\_active**: Indica se a configuração está ativa ou não. .
* **id**: Identificador no formato "PROJECT\_ID.DATASET.TABLE".
* **project\_id**: O ID do projeto no GCP.
* **client\_email**: O e-mail da service account associado à conta de serviço que tem permissão para acessar o BigQuery no projeto.
  * Papéis:
    * role = "roles/bigquery.dataEditor"
    * role = "roles/bigquery.jobUser"
    * role = "roles/bigquery.dataEditor"
* **private\_key\_base64**: A chave privada da conta de serviço codificada em base64. Essa chave é usada para autenticar a conta de serviço ao acessar o BigQuery.
* **account\_id**: O ID da conta de serviço associada (service account) à configuração.
* **dataset\_name**: O nome do conjunto de dados (dataset) no BigQuery onde os dados serão armazenados.&#x20;
* **dataset\_table**: O nome da tabela dentro do conjunto de dados onde os dados serão armazenados. Neste caso, a tabela é chamada "events".
* **dataset\_location**: A localização geográfica onde o conjunto de dados está localizado no BigQuery. Isso pode afetar a latência e a conformidade regulatória. [Lista de locais](https://cloud.google.com/bigquery/docs/locations?hl=pt-br).

```json
    "destinations": {
      "bigquery": [
        {
          "is_active": true,
          "id": "PROJECT_ID.agnostic.events",
          "project_id": "PROJECT_ID",
          "client_email": "ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com",
          "private_key_base64": "PRIVATE_KEY_FROM_JSON_KEY_AS_BASE64",
          "account_id": "ACCOUNT_ID",
          "dataset_name": "agnostic",
          "dataset_table": "events",
          "dataset_location": "LOCATION"
        }
      ],
```

Utilize o esquema abaixo para receber os eventos *"as-is"* do Agnostic Data.

<details>

<summary>AVRO Scheme </summary>

```json
[
  {
    "name": "inserted_date",
    "mode": "NULLABLE",
    "type": "INTEGER",
    "description": "timestamp do insert do lado do servidor",
    "fields": []
  },
  {
    "name": "created",
    "mode": "NULLABLE",
    "type": "INTEGER",
    "description": "timestamp do evento enviado pelo cliente",
    "fields": []
  },
  {
    "name": "event_name",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "nome do evento Custom",
    "fields": []
  },
  {
    "name": "eid",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "ID do evento do sistema de fluxo pub/sub, kafka, etc",
    "fields": []
  },
  {
    "name": "event_type",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "agnostic, facebook, google, algolia, etc.",
    "fields": []
  },
  {
    "name": "event_name_from_type",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "nome original do evento em agnostic, facebook, google, etc",
    "fields": []
  },
  {
    "name": "scope",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "indicado para receber nome do projeto, quando o cliente tem vários e 1 bigquery",
    "fields": []
  },
  {
    "name": "event_provider",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "para indicar o provedor do evento (marketplace)",
    "fields": []
  },
  {
    "name": "app_info_version",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "build do aplicativo Customer",
    "fields": []
  },
  {
    "name": "app_package_name",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "e.g:  com.customer.app",
    "fields": []
  },
  {
    "name": "relative_view",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "utilizado para definir caminhso relatios app/view1 ou site/urlrelativa",
    "fields": []
  },
  {
    "name": "action_source",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "identify which source the action came from",
    "fields": []
  },
  {
    "name": "carrier",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "operadora ",
    "fields": []
  },
  {
    "name": "session_id",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "session id navegacao",
    "fields": []
  },  
  {
    "name": "user_id",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "id do usuário Customer",
    "fields": []
  },
  {
    "name": "user_pseudo_id",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "identificador de usuário de terceiros ou lead ainda não cadastrado",
    "fields": []
  },
  {
    "name": "user_phone",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "telefone se existir",
    "fields": []
  },
  {
    "name": "userToken",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "user token do algolia",
    "fields": []
  },
  {
    "name": "is_promo",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "se existia uma promoção relacionado ao evento",
    "fields": []
  },
  {
    "name": "device_id",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "id do device",
    "fields": []
  },
  {
    "name": "device_brand",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "marca do device",
    "fields": []
  },
  {
    "name": "device_resolution",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "resolucao do dispositivo",
    "fields": []
  },
  {
    "name": "device_screen_density",
    "mode": "NULLABLE",
    "type": "INTEGER",
    "description": "densidade da tela em inteiro x10",
    "fields": []
  },
  {
    "name": "device_so",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "sistema operacional ",
    "fields": []
  },
  {
    "name": "device_so_version",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "versao do so",
    "fields": []
  },
  {
    "name": "device_language",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "idioma",
    "fields": []
  },
  {
    "name": "device_model_name",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "e.g:  iPhone 11",
    "fields": []
  },
  {
    "name": "device_web_browser",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "navegador do device ou utilizado",
    "fields": []
  },
  {
    "name": "device_ipaddress",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "endereço ipv4 ou ipv6",
    "fields": []
  },
  {
    "name": "device_geohash",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "geohash com 4 a 5 acuracidade",
    "fields": []
  },
  {
    "name": "device_timezone",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "String no formato:  America/Sao_Paulo:GMT-3  ",
    "fields": []
  },
  {
    "name": "opened_from_type",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "identifica de onde o usuario abriu o app, push, dymic link ou outros",
    "fields": []
  },
  {
    "name": "opened_from_content",
    "mode": "NULLABLE",
    "type": "STRING",
    "description": "o conteudo como url, push message, etc",
    "fields": []
  },
  {
    "name": "rfid",
    "type": "RECORD",
    "mode": "NULLABLE",
    "description": "group people by regex for hash id",
    "fields": [
      {
        "name": "tl",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "telephone number is sha256 without blank space and special characters",
        "fields": []
      },          
      {
        "name": "ad",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "address id is sha256 without blank space and special characters"
      },
      {
        "name": "cc",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "credit card id is sha256 without blank space and special characters"
      },
      {
        "name": "em",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "email id is sha256 without blank space and special characters"
      }
    ]
  },
  {
    "name": "geodata",
    "mode": "NULLABLE",
    "type": "RECORD",
    "description": "dados de geolocalizacao",
    "fields": [
      {
        "name": "latitude",
        "mode": "NULLABLE",
        "type": "FLOAT",
        "description": "latitude",
        "fields": []
      },
      {
        "name": "longitude",
        "mode": "NULLABLE",
        "type": "FLOAT",
        "description": "longitude",
        "fields": []
      },
      {
        "name": "city",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "cidade",
        "fields": []
      },
      {
        "name": "region",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "regiao",
        "fields": []
      },
      {
        "name": "region_code",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "codigo da regiao",
        "fields": []
      },
      {
        "name": "country",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "pais",
        "fields": []
      },
      {
        "name": "country_name",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "nome do pais",
        "fields": []
      },
      {
        "name": "country_code",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "codigo do pais",
        "fields": []
      },
      {
        "name": "continent_code",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "codigo do continente",
        "fields": []
      },
      {
        "name": "postal",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "codigo postal",
        "fields": []
      },
      {
        "name": "org",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "organizacao",
        "fields": []
      }

    ]
  },
  {
    "name": "target_data",
    "mode": "REPEATED",
    "type": "RECORD",
    "description": "DEPRECATED: pares de valores com target_name:value_for_id. utilizados para compor uma URL ex.: api.{target_name}.com/{value_for_id}/events?name=abc",
    "fields": [
      {
        "name": "key",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "pre-definidos nomes de chaves (key) devem ser recomendados para traduzir em um link válido da API destino",
        "fields": []
      },
      {
        "name": "value",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "para valores string para o ID do target",
        "fields": []
      }
    ]
  },
  {
    "name": "event_data",
    "mode": "REPEATED",
    "type": "RECORD",
    "description": null,
    "fields": [
      {
        "name": "key",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "value",
        "mode": "NULLABLE",
        "type": "RECORD",
        "description": null,
        "fields": [
          {
            "name": "string_value",
            "mode": "NULLABLE",
            "type": "STRING",
            "description": "para valores string",
            "fields": []
          },
          {
            "name": "int_value",
            "mode": "NULLABLE",
            "type": "INTEGER",
            "description": "para valores inteiros",
            "fields": []
          },
          {
            "name": "float_value",
            "mode": "NULLABLE",
            "type": "FLOAT",
            "description": "para valores decimais",
            "fields": []
          },
          {
            "name": "boolean_value",
            "mode": "NULLABLE",
            "type": "BOOLEAN",
            "description": "para verdadeiro ou falso",
            "fields": []
          }
        ]
      }
    ]
  },
  {
    "name": "items",
    "mode": "REPEATED",
    "type": "RECORD",
    "description": null,
    "fields": [
      {
        "name": "item_name",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "lisn_departament",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "lisn_section",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "lisn_item",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "quantity",
        "mode": "NULLABLE",
        "type": "INTEGER",
        "description": null,
        "fields": []
      },
      {
        "name": "currency",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "value",
        "mode": "NULLABLE",
        "type": "INTEGER",
        "description": null,
        "fields": []
      },
      {
        "name": "price",
        "mode": "NULLABLE",
        "type": "FLOAT",
        "description": null,
        "fields": []
      },
      {
        "name": "index_pos",
        "mode": "NULLABLE",
        "type": "INTEGER",
        "description": "position",
        "fields": []
      },
      {
        "name": "id",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "FK do item",
        "fields": []
      },
      {
        "name": "item_id",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "o mesmo que id utilizado pelo Google Analytics",
        "fields": []
      },
      {
        "name": "coupon",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "affiliation",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "discount_value",
        "mode": "NULLABLE",
        "type": "INTEGER",
        "description": "valor em desconto como inteiro",
        "fields": []
      },
      {
        "name": "item_category",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "item_category2",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "item_list_name",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "item_list_id",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": null,
        "fields": []
      },
      {
        "name": "location_id",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "zonas do Customer",
        "fields": []
      },
      {
        "name": "promotion_id",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "id da promocao no banco",
        "fields": []
      },
      {
        "name": "promotion_name",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "nome da promoçao",
        "fields": []
      }
    ]
  }
]

```

</details>

### BigQuery Destination (raw changelog)

Diferente do destino BigQuery esquematizado com os campos pré-definidos e modelados conforme nosso AVRO Scheme, o cliente também pode habilitar um BigQuery Destination Raw Changelog.&#x20;

Os dados armazenados nesta tabela são brutos, ou seja, estão no formato original em que foram capturados, sem processamento, filtragem ou agregação. Neste contexto, implica que a tabela não apenas registra eventos, mas especificamente as mudanças ou atualizações que ocorrem. Isso pode incluir informações sobre o que foi alterado, quando, e possivelmente quem fez a mudança, oferecendo um histórico detalhado de eventos que alteram o estado ou os dados dentro do sistema.

<details>

<summary>AVRO Raw Scheme</summary>

```json
[
    {
      "name": "inserted_date",
      "mode": "REQUIRED",
      "type": "INTEGER",
      "description": "timestamp do insert do lado do servidor",
      "fields": []
    },
    {
        "name": "eid",
        "mode": "REQUIRED",
        "type": "STRING",
        "description": "ID do evento do sistema de fluxo pub/sub, kafka, etc",
        "fields": []
      },
      {
        "name": "operation",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "CREATE, UPDATE, IMPORT, or DELETE.",
        "fields": []
      },  
      {
        "name": "data",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "JSON com os dados do evento",
        "fields": []
      },
      {
        "name": "document_path",
        "mode": "NULLABLE",
        "type": "STRING",
        "description": "JSON com os dados do evento",
        "fields": []
      }      
]
```

</details>

<details>

<summary>Explorando os dados</summary>

#### Dicas de processamento dos dados raw

Faça a importação das bibliotecas necessárias

```python
import pandas as pd
import pandas_gbq as pgbq
import json
from pandas import json_normalize
...
// conexão com o BQ
...
```

em seguida faça a consulta utilizando um controle de tempo e limite devido ao grande volume de dados.&#x20;

```python
# Sua consulta SQL
query = """
SELECT *
FROM `project_id.dataset.events_raw`
WHERE inserted_date >= TIMESTAMP('2024-02-01')
AND inserted_date < TIMESTAMP('2024-03-01')
LIMIT 1000000
"""
```

Atribua a variável *df* para começar a manipular seus dados.

```python
df = pgbq.read_gbq(query, project_id="project_id", dialect="standard")
```

Normalize o JSON

```python
## Converta data (json) do esquema firestore_export para um dataframe
data = df['data'].apply(json.loads)
## normalizar o data para torna-se um dataframe
df_data = pd.json_normalize(data)
```

Acesse os dados e aprenda profundamente! Veja um exemplo de exploração.

```python
# Event durations counts
df_data['event.duration'].value_counts()
```

</details>

## Elastic Cloud Destinations

Para configurar um Elastic Cloud como Destino é simples basta informar o id do projeto, o nome do índice, url do endpoint disponível na console do elastic e a chave convertida em base64.&#x20;

```json
    "destinations": {
      "elastic": [
        {
          "is_active": true,
          "id": "YOUR_ID:YOUR_ACCESSKEY_PROVIDED_BY_ELASTIC_CLOUD",
          "index": "events",
          "private_key_base64": "YOUR_KEY_AS_BASE64",
          "url": "https://YOUR_ID_INSTANCE.brazilsouth.azure.elastic-cloud.com:9243",
          "event_rename": {
            "view_content": "view_content_v2"
          }
        }
      ],
```

### Renomeando evento para um destino (elastic - consulte-nos)

Existem casos de uso onde você precisará alterar o nome do evento original para um nome final desejado, por exemplo, caso um índice do elastic não possa receber mais eventos por exemplo view\_content podemos renomeá-lo para o destino Elastic utilizando **event\_rename**.&#x20;

Abaixo payload para configurar o Destination Elastic para renomear todos os eventos view\_content.&#x20;

```json
    "destinations": {
      "elastic": [
        {
            ...
          "event_rename": {
            "view_content": "view_content_v2"
          }
        }
      ],
```

### Elastic: Renomeando um índice baseado em um evento

Existem casos de uso onde você precisará alterar o nome do índice padrão para um nome final desejado, por exemplo, caso um índice do elastic não possa receber mais eventos por exemplo view\_content podemos renomeá-lo para o destino Elastic utilizando **index\_rename\_by\_event**

```json
index_rename_by_event
```

Os nomes dos índices criados pelo Agnostic Data no Elastic seguem o padrão abaixo:

```javascript

index_concat = `${destination.index}_${project_id}_${objectPlain.event_name}`;
// events_YOUR_AGNOSTICDATA_PROJECT_ID_view_content

```

Digamos que você precise alterar de events\_YOUR\_AGNOSTICDATA\_PROJECT\_ID\_view\_content para events\_YOUR\_AGNOSTICDATA\_PROJECT\_ID\_view\_content\_v2. Siga os passos para definir o payload. &#x20;

Abaixo payload para configurar o Destination Elastic para renomear todos os eventos view\_content.&#x20;

```json
    "destinations": {
      "elastic": [
        {
            ...
          "index_rename_by_event": {
            "view_content": "events_new-dedicated-01_view_content_v2"
          }
        }
      ],
```

***

### Google Ads (roadmap)

#### Prerequisites&#x20;

Uma conta [Google Ads](https://support.google.com/google-ads/answer/6366720) "linkada" para uma uma Conta de Administrador do Google Ads ([Google Ads Manager account)](https://support.google.com/google-ads/answer/7459601)

* Customer ID(s) - <https://support.google.com/google-ads/answer/1704344>
* Customer Statuses Filter - <https://developers.google.com/google-ads/api/reference/rpc/v15/CustomerStatusEnum.CustomerStatus>

#### Principais tabelas

* customer
* customer\_label
* campaign\_criterion
* campaign\_bidding\_strategy
* campaign\_label&#x20;
* label
* ad\_group\_ad
* ad\_group\_ad\_label&#x20;
* ad\_group
