> For the complete documentation index, see [llms.txt](https://portal-integracao.intelbras.com.br/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://portal-integracao.intelbras.com.br/linha-de-faciais/obtendo-eventos-em-tempo-real/servidor-de-envio-de-eventos-2.0.md).

# Servidor de Envio de Eventos 2.0&#x20;

Assim como a versão 1.0, através do servidor de envio de eventos é possível receber os eventos ocorridos no dispositivo, como acessos, estado do sensor de porta, alarmes e sistema.

No Servidor de Envio de Eventos 2.0, além dos eventos listados acima é possível receber os eventos de alterações do cadastro dos usuários, como adição, alteração ou exclusão, quando efetuado via web ou interface local do dispositivo.

Todos os eventos recebidos no servidor deverão ser respondidos com o código HTTP 200, desta forma o dispositivo tem a garantia da entrega, para eventos que não sejam respondidos com este código o dispositivo irá realizar o armazenamento dos mesmos e fará a tentativa de envio destes eventos até que ocorra a resposta de status 200 (Estado Offline).

**Dispositivos que suportam esta função:**

| Dispositivos    | Firmware             |
| --------------- | -------------------- |
| SS 3531 MF Lite | 20250625 ou superior |
| SS 3542 MF LITE | 20250625 ou superior |
| SS 3532 MF      | 20250625 ou superior |
| SS 3532 MF      | 20250625 ou superior |
| SS 3532 MF W    | 20250625 ou superior |
| SS 3542 MF W    | 20250625 ou superior |
| SS 5531 MF W    | 20250625 ou superior |
| SS 5531 MF EX   | 20250625 ou superior |
| SS 5541 MF W    | 20250625 ou superior |
| SS 5532 MF W    | 20250625 ou superior |
| SS 5542 MF W    | 20250625 ou superior |

Para configurar e habilitar o Servidor de Envio de Eventos 2.0 (Post Eventos 2.0) como servidor de autenticação via API e direcionar as requisições de acesso ao servidor, deve ser realizado as requisições em dois passos, 1° = configuração e 2° = habilitar modo de operação.

### Configurando Servidor de Envio de Eventos - Passo 1

#### Requisição - GET

`http://{{device_ip}}/cgi-bin/configManager.cgi?action=setConfig&Intelbras_ModeCfgII.UploadServerList[0].Enable=false&Intelbras_ModeCfgII.UploadServerList[0].Address=192.168.1.201&Intelbras_ModeCfgII.UploadServerList[0].Port=3000&Intelbras_ModeCfgII.UploadServerList[0].Uploadpath=/notification&Intelbras_ModeCfgII.UploadServerList[0].OfflineRetransmission=true&Intelbras_ModeCfgII.UploadServerList[0].ReportPicture=true&Intelbras_ModeCfgII.UploadServerList[0].EventType[0]=UserManagerInfo&Intelbras_ModeCfgII.UploadServerList[0].EventType[1]=AccessControl&Intelbras_ModeCfgII.UploadServerList[0].EventType[2]=DoorStatus&Intelbras_ModeCfgII.UploadServerList[0].EventType[3]=AlarmEvent&Intelbras_ModeCfgII.UploadServerList[0].EventType[4]=SystemEvent&Intelbras_ModeCfgII.UploadServerList[0].HttpsEnable=false`

| param                      | type    | description                                                                                                                                   |
| -------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `setConfig` \*             | String  | Comando para configuração                                                                                                                     |
| `Enable` \*                | Boolean | true/false: Habilita/Desabilita a função                                                                                                      |
| `Address` \*               | String  | Endereço IP do Servidor (exemplo: 192.168.3.88)                                                                                               |
| `Port` \*                  | Number  | Porta (Exemplo: 3000)                                                                                                                         |
| `Uploadpath` \*            | String  | Path (Exemplo: /notification)                                                                                                                 |
| `OfflineRetransmission` \* | Boolean | true/false: habilita/desabilita a transmissão dos eventos que ocorreram no estado offline                                                     |
| `ReportPicture` \*         | Boolean | Habilita/Desabilita o envio da foto do evento                                                                                                 |
| `EventType[0]` \*          | String  | Deve ser usado o valor `UserManagerInfo` para habilitar o recebimento dos eventos de alteração do cadastro dos usuários                       |
| `EventType[1]` \*          | String  | Deve ser usado o valor `AccessControl` para habilitar o recebimento dos eventos de acesso ao dispostivo                                       |
| `EventType[2]` \*          | String  | Deve ser usado o valor `DoorStatus` para habilitar o recebimento dos eventos para o sensor de porta                                           |
| `EventType[3]` \*          | String  | Deve ser usado o valor `AlarmEvent` para habilitar o recebimento dos eventos dos alarmes do dispositivo                                       |
| `EventType[4]` \*          | String  | Deve ser usado o valor `SystemEvent` para habilitar o recebimento dos eventos do sistema, como atualização, registro SIP, reboot entre outros |
| `HttpsEnable` \*           | Boolean | Habilita/Desabilita o HTTPS                                                                                                                   |

Para melhor entendimento do campo `EventType` e como deve ser a sua configuração, segue a explicação detalhada:

* Os valores de 0 a 4 junto ao campo `EventType` é a posição de memória no sistema para os eventos ativos.
* Os valores para os eventos são: `UserManagerInfo`, `AccessControl`, `DoorStatus`, `AlarmEvent`, `SystemEvent`.
* Portanto, caso queira ativar somente os eventos `AccessControl` e `DoorStatus`, deve ser repassado para o equipamento da seguinte maneira: Intelbras\_ModeCfgII.UploadServerList\[0].EventType\[0]=AccessControl\&Intelbras\_ModeCfgII.UploadServerList\[0].EventType\[1]=DoorStatus
* Para desativar uma posição, basta passar o valor numérico de 0 a 4, não repetindo mesmo valor para posições diferentes. Exemplo: Intelbras\_ModeCfgII.UploadServerList\[0].EventType\[0]=0
* Por padrão, o sistema vem ativo as posições de 0 a 4 com a seguinte relação de eventos: | Posição&#x20;

| Posição        | Valor             | Evento               |
| -------------- | ----------------- | -------------------- |
| `EventType[0]` | `UserManagerInfo` | Informações Pessoais |
| `EventType[1]` | `AccessControl`   | Eventos de Acesso    |
| `EventType[2]` | `DoorStatus`      | Status Sensor Porta  |
| `EventType[3]` | `AlarmEvent`      | Evento de Alarme     |
| `EventType[4]` | `SystemEvent`     | Sistema              |

{% hint style="warning" %}
Verifique sempre as configurações de rede do seu produto, como Endereço de IP e Gateway, para garantir que o mesmo esteja acessível na rede.
{% endhint %}

### Habilitar Servidor de Envio de Eventos 2.0 via API - Passo 2

Após a configuração, deve ser ativado o Modo Post Eventos 2.0:

`http://{{device_ip}}/cgi-bin/configManager.cgi?action=setConfig&Intelbras_ModeCfg.DeviceMode=3`

| Valor      | Tipo   | Parametros                                                                                      |
| ---------- | ------ | ----------------------------------------------------------------------------------------------- |
| DeviceMode | Number | 0: StandAlone, 1: Servidor de Envio de Eventos, 2: Modo Online, 3: Modo Online/Post Eventos 2.0 |

#### Exemplo de Retorno - *application/json*:

```shellscript
--myboundary
Content-Type: application/json
Content-Disposition: form-data; name="info"

{
    "Channel": 0,
    "Events": [{
            "Action": "Pulse",
            "Code": "AccessControl",		// Código do tipo de Evento
            "Data": {						// Informação do Evento
                "CardName": "",				// Nome do Usuário
                "CardNo": "",				// Código do cartão em Hexadecimal 
                "CardType": 0,          	// Tipo do Cartão 0: Ordinary card, 1: VIP card, 2: Guest card, 3: Patrol card, 4: Blocklist card, 5: Duress card
                "CreateTime": 1759322131	// Data da criação do Evento em Timestamp ,
                "Door": 0,              	// Porta ao qual ocorreu o acesso
                "DoorTypeStr": "Local", 	
                "ErrorCode": 16,        	// Código do Erro / Motivo do Acesso negado 	 
                "ImageEncode":				// Imagem capturada do evento em formato base64 -- Código abaixo quebrado propositalmente. 
                "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",
                "ImageInfo": [{				//Lista de informações da foto que é mandada junto ao evento
                        "Height": 640,
                        "Length": 17058,
                        "Offset": 0,
                        "Type": 1,
                        "Width": 360
                    }
                ],
                "Method": 14,				// Método usado na autenticação
                "QRCodeStr": "4225090077657653040000793981103116878|2|1|1|eec0544e7b175d90fa5b59ba650cc79af21bfbed", // QRCode habilitado para ler string alfanumérica
                "ReaderID": "1",			// Leitor usado na autenticação
                "RealUTC": 1759322131,
                "Status": 0,				// Status do acesso Liberado/Negado
                "Type": "Entry",            // Tipo de Acesso Entrada/Saida
                "UTC": 1759322131,          // UTC do acesso
                "UserID": "",               // ID do Usuário
                "UserType": 0               // Tipo de usuário 
            },
            "Index": 0,
            "PhysicalAddress": "54:6c:ac:21:40:17"
        }
    ],
    "FilePath": "/SnapShotFilePath/2025-10-01/09/35/20251001093531778.jpg",  // Diretório de armazenamento da foto capturada do evento
    "Time": "01-10-2025 09:35:31"			// Data e Hora do evento
}

##### Exemplo do arquivo config.txt para configuração:
#{
#"host":"192.168.1.254",
#"port":"3000",
#"path":"/notification"
#}
###############################################
```

#### Exemplos de Servidor

{% tabs %}
{% tab title="Python" %}

```python
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from os.path import abspath, dirname, join
import json
import os
import time
from bottle import route, request, response, run

# Carrega configurações
run_conf = open(join(dirname(abspath(__file__)), "config.txt")).read()
run_conf = json.loads(run_conf)

# Diretórios para salvar arquivos
save_dir = join(dirname(abspath(__file__)), "s_files")
save_raw_dir = join(dirname(abspath(__file__)), "s_raw_files")

@route('%s' % run_conf["path"], method='POST')
def do_upload():
    try:
        # Lê os dados JSON recebidos
        Dados = request.json

        # Salva os dados brutos para auditoria
        raw_name = "post_eventos_%s.json" % time.strftime("%Y-%m-%d_%H_%M_%S", time.localtime())
        with open(join(save_raw_dir, raw_name), "w", encoding="utf-8") as fp:
            json.dump(Dados, fp, indent=4, ensure_ascii=False)

        # Aplica filtros nos eventos
        eventos_filtrados = []
        for evento in Dados.get("Events", []):
            data = evento.get("Data", {})
            # Exemplo de filtro: DoorAction = True e CardNo não vazio
            if data.get("DoorAction") and data.get("CardNo"):
                eventos_filtrados.append({
                    "CardNo": data["CardNo"],
                    "ReaderID": data["ReaderID"],
                    "UTC": data["UTC"],
                    "FilePath": Dados.get("FilePath"),
                    "Time": Dados.get("Time")
                })

        # Salva os eventos filtrados (opcional)
        if eventos_filtrados:
            filtered_name = "filtrado_%s.json" % time.strftime("%Y-%m-%d_%H_%M_%S", time.localtime())
            with open(join(save_dir, filtered_name), "w", encoding="utf-8") as fp:
                json.dump(eventos_filtrados, fp, indent=4, ensure_ascii=False)

        return 'OK' # json.dumps({"status": "OK", "filtrados": len(eventos_filtrados}}, ensure_ascii=False)

    except Exception as e:
        return json.dumps({"status": "erro", "detalhes": str(e)}, ensure_ascii=False)

# Inicia o servidor
run(host='%s' % run_conf["host"], port=int(run_conf["port"]), debug=True)
```

{% endtab %}
{% endtabs %}

### Comando para Limpar Eventos em Cache

Caso você possua muitos eventos, tanto no modo servidor de envio de eventos quanto no modo online que não foi feito a confirmação de envio ao servidor e deseja apagar todos os eventos em cache, você pode utilizar o comando abaixo.

#### Requisição - GET

`http://19.168.3.87/cgi-bin/recordUpdater.cgi?action=clear&name=AccessOffline`

| param      | type   | description         |
| ---------- | ------ | ------------------- |
| `clear` \* | String | Comando para Limpar |

#### Exemplo de Retorno - *text/plain*:

```sh
OK

```

#### Exemplos de Servidor

{% tabs %}
{% tab title="Python" %}

```python
import requests
 
device_ip = '10.1.35.144'
username = 'admin'
password = 'acesso1234'

url = "http://{}/cgi-bin/recordUpdater.cgi?action=clear&name=AccessOffline".format(
                            str(device_ip),
                        )

digest_auth = requests.auth.HTTPDigestAuth(username, password)
rval = requests.get(url, auth=digest_auth, stream=True, timeout=20, verify=False)

print(rval.text)
```

{% endtab %}
{% endtabs %}

### Alterar Content-Type

O Modo Online 2.0 os eventos de autenticação encaminhados do dispositivo para o servidor, utilizando o formato Content-Type como **application/json** . Porém, é possível retornar ao método **text/plain** caso seja o interesse e manter a compatibilidade com o Modo Online atual - v.1.0.

Abaixo, segue a requisição que efetua a alteração do Content-Type de JSON para TEXT/PLAIN.

#### Requisição - GET

`http://192.168.1.201/cgi-bin/configManager.cgi?action=setConfig&Intelbras_UploadContentType.ContentType=jsonv2`

| param            | type   | description                                                               |
| ---------------- | ------ | ------------------------------------------------------------------------- |
| `setConfig` \*   | String | Comando para definir configurações                                        |
| `ContentType` \* | String | `jsonv2` para formato application/json e `text` para o formato text/plain |

#### Exemplo de Retorno - *text/plain*

```sh
OK
```

{% hint style="warning" %}
**Importante:** Ao alterar o formato do Content-Type de JSON para TEXT/PLAIN, irá afetar o Modo Online 2.0.
{% endhint %}

### Configuração via web

A configuração do Servidor de Envio de Eventos 2.0 é feita no mesmo menu de configuração para o Modo Online 2.0.

Para maiores detalhes, consulte a página **Configurar Via Interface 2.0** .


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://portal-integracao.intelbras.com.br/linha-de-faciais/obtendo-eventos-em-tempo-real/servidor-de-envio-de-eventos-2.0.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
