> 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/xpe-3200-plus-ip/xpe-3200-plus-ip.md).

# XPE 3200 Plus IP

## API HTTP de Integração

Manual API HTTP de integração com Intelbras XPE 3200 Plus IP

Última atualização do documento – 27/09/2023

### Introdução

API HTTP é uma interface de aplicação desenvolvida para o controle de funções do produto Intelbras selecionado via HTTP. Ele permite que os videoporteiros XPE3200 sejam facilmente integrados a softwares de terceiros, como automação residencial, sistemas de segurança e monitoramento, etc.

### HTTP API Descrição

A API HTTP XPE3200 é um protocolo padrão baseado no método HTTP GET/POST. Qualquer solicitação pode interagir com o dispositivo via GET ou POST. O formato da mensagem interativa é JSON e o modo de transferência de arquivo usa o modo de upload FORM padrão.

### HTTP API Requisição (Request)

Todos os comandos são enviados via HTTP/HTTPS para o endereço com caminho absoluto preenchido com o prefixo `/api`. O protocolo escolhido depende das configurações atuais de intercomunicação na seção "Segurança / HTTP API". As funções da API HTTP são atribuídas a serviços com níveis de segurança definidos, incluindo a solicitação de conexão TLS (ou seja, HTTPS).

O caminho absoluto inclui o módulo do sistema de destino (`system`, `firmware`, `config`, `relay`, etc.) e o nome da ação (`status`, `get`, `add`, etc.). Para ser aceito pelo dispositivo, um pedido deve incluir o método e a especificação do caminho absoluto seguidos pelo cabeçalho do Host.

Exemplo: `http://IP address/api/Target/Action?Param`

### HTTP API Método (Method)

O videoporteiro XPE3200 aplica os dois métodos HTTP a seguir: GET e POST.

Os métodos GET e POST são equivalentes do ponto de vista da API HTTP, mas usam transferências de parâmetros diferentes (consulte a próxima subseção).

#### GET

Para solicitar o conteúdo e informações do dispositivo.

Exemplo de solicitação: `http://10.0.0.108/api/system/status`

Exemplo de Resposta:

```
{
    "retcode": 0,
    "action": "status",
    "message": "OK",
    "data": {
         "SystemTime": 1662991013,
         "UpTime": 861136
    }
}
```

#### POST

O modo Post é similar ao Get que solicita o conteúdo/informações do dispositivo ou a execução de comando geral, mas Post necessita dos parâmetros Query String no json para processamento.

Exemplo de solicitação:

```
http://10.0.0.108/api/system/status

{
  "target": "system",
  "action": "status",
}
```

Exemplo de resposta:

```
{
        "retcode": 0,
        "action": "status",
        "message": "OK",
        "data": {
            "SystemTime": 1662992966,
            "UpTime": 863089
        }
}
```

### Respostas da API HTTP

As respostas às solicitações são principalmente no formato JSON, e os arquivos exportados de acordo com as solicitações são salvos nos formatos `.tgz`, `.xml` e etc. (por exemplo, config é salvo no tipo de arquivo `.tgz`). O cabeçalho Content-Type especifica o formato de resposta. Três tipos básicos de resposta são definidos para JSON.

#### Resposta positiva sem parâmetros

Esta resposta é enviada caso uma solicitação tenha sido executada com sucesso para funções que não retornam nenhum parâmetro. Esta resposta é sempre combinada com o código de status HTTP 200 OK.

```
{
    "retcode": 0,
    "action": "xxxx",
    "message": "OK"
}
```

#### Resposta positiva com parâmetros

Esta resposta é enviada caso uma solicitação tenha sido executada com sucesso para funções que retornam parâmetros suplementares. O item de resultado inclui outros parâmetros de resposta relacionados à função. Esta resposta é sempre combinada com o código de status HTTP 200 OK.

```
{
     "retcode": 0,
     "action": "xxxxx",
     "message": "OK",
     "data":
     {
   ......
     }
 }
```

#### Resposta negativa

Esta resposta é enviada caso ocorra um erro durante o processamento da solicitação. A resposta especifica o código do erro (código), a descrição do texto (descrição) e os detalhes do erro, se necessário (param). A resposta pode ser combinada com o código de status HTTP 200 OK ou 401 Unauthorized Required.

```
 {
     "retcode": -1,
     "action": "unknow",
     "message": "unsupport action"
 }
```

### Configuração da API HTTP

As configurações da API HTTP para o XPE3200 são definidas via interface web caminho: Segurança -> HTTP API para desabilitar/habilitar um serviço e selecionar o método de autenticação do usuário.

| Item         | Descrição                                                                                                                                                                                                                                                                        |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| HTTP API     | Desabilitada: o sistema sempre retorna o status HTTP 403 Proibido / Ativado: ativar API http                                                                                                                                                                                     |
| Auth Mode    | None: Sem método de autenticação / Normal: (reservado) / WhiteList: Modelo de lista branca listando os IPs permitidos pra acesso / Basic: Método de autenticação padrão http básico (RFC2671) / Digest: Método de autenticação padrão http Digest (RFC2671) / Token: (reservado) |
| User Name    | Usuário usado na autenticação nos métodos básico ou Digest                                                                                                                                                                                                                       |
| Password     | Senha usada na autenticação nos métodos básico ou Digest                                                                                                                                                                                                                         |
| IP01 \~ IP05 | IP liberado na lista branca                                                                                                                                                                                                                                                      |

### HTTP API Functions

A tabela abaixo fornece uma lista de todas as funções de API HTTP disponíveis, incluindo:

* o caminho absoluto da solicitação HTTP
* os métodos HTTP suportados

| Caminho absoluto           | API Método |
| -------------------------- | ---------- |
| /api/system/info           | GET/POST   |
| /api/system/status         | GET/POST   |
| /api/system/reboot         | GET/POST   |
| /api/firmware/status       | GET/POST   |
| /api/firmware/prepare      | GET/POST   |
| /api/firmware/upload       | POST       |
| /api/firmware/upgrade      | GET/POST   |
| /api/config/get            | GET/POST   |
| /api/config/set            | POST       |
| /api/config/export         | GET/POST   |
| /api/config/import         | POST       |
| /api/config/reset\_factory | GET/POST   |
| /api/relay/get             | GET/POST   |
| /api/relay/set             | POST       |
| /api/relay/status          | GET/POST   |
| /api/relay/trig            | GET/POST   |
| /api/input/get             | GET/POST   |
| /api/input/set             | POST       |
| /api/input/status          | GET/POST   |
| /api/publiccode/get        | GET/POST   |
| /api/publiccode/set        | POST       |
| /api/contact/get           | GET/POST   |
| /api/contact/add           | POST       |
| /api/contact/set           | POST       |
| /api/contact/del           | POST       |
| /api/contact/clear         | GET/POST   |
| /api/group/get             | GET/POST   |
| /api/group/add             | POST       |
| /api/group/set             | POST       |
| /api/group/clear           | GET/POST   |
| /api/call/status           | GET/POST   |
| /api/call/dial             | GET/POST   |
| /api/call/hangup           | GET/POST   |
| /api/sip/get               | GET/POST   |
| /api/sip/set               | POST       |
| /api/sip/status            | GET/POST   |
| /api/dialreplace/get       | GET/POST   |
| /api/dialreplace/add       | POST       |
| /api/dialreplace/set       | POST       |
| /api/dialreplace/del       | POST       |
| /api/dialreplace/clear     | GET/POST   |
| /api/dialreplace/export    | GET/POST   |
| /api/dialreplace/import    | GET/POST   |
| /api/log/get               | GET/POST   |
| /api/log/set               | POST       |
| /api/log/export            | GET/POST   |
| /api/log/clear             | GET/POST   |
| /api/calllog/get           | GET/POST   |
| /api/calllog/del           | POST       |
| /api/calllog/clear         | GET/POST   |
| /api/calllog/export        | GET/POST   |
| /api/doorlog/get           | GET/POST   |
| /api/doorlog/del           | POST       |
| /api/doorlog/clear         | GET/POST   |
| /api/doorlog/export        | GET/POST   |
| /api/pcap/status           | GET/POST   |
| /api/pcap/start            | GET/POST   |
| /api/pcap/stop             | GET/POST   |
| /api/pcap/export           | GET/POST   |
| /api/schedule/get          | GET/POST   |
| /api/schedule/add          | POST       |
| /api/schedule/set          | POST       |
| /api/schedule/del          | POST       |
| /api/schedule/clear        | POST       |
| /api/schedule/export       | POST       |
| /api/schedule/import       | GET/POST   |
| /api/user/get              | GET/POST   |
| /api/user/add              | POST       |
| /api/user/set              | POST       |
| /api/user/del              | POST       |
| /api/user/clear            | POST       |

***

### Api system

#### Api system info

| Section  | Param           | Description                                                                |
| -------- | --------------- | -------------------------------------------------------------------------- |
| Status   | Model           | ProductModel "XPE-3200-IP-FACE"                                            |
|          | MAC             | MAC address                                                                |
|          | FirmwareVersion | Firmware version: "116.57.2.72"                                            |
|          | HardwareVersion | Hardware version "116.0.6.1.0.0.0.0"                                       |
|          | PortType        | 0: DHCP / 1: Static                                                        |
|          | LinkStatus      | 0: Disconnect / 1: Connected / 2: IP Conflict                              |
| Lan      | IPAddress       |                                                                            |
|          | SubnetMask      |                                                                            |
|          | Gateway         |                                                                            |
|          | DNS1            |                                                                            |
|          | DNS2            |                                                                            |
| Account1 | UserName        | 114                                                                        |
|          | SipServer       | 192.168.1.115                                                              |
|          | Status          | -1: unknow / 0: disable / 1: registering / 2: registed / 3: registe failed |
| Account2 | UserName        | 115                                                                        |
|          | SipServer       | 192.168.1.115                                                              |
|          | Status          | -1: unknow / 0: disable / 1: registering / 2: registed / 3: registe failed |

O método GET ou POST pode ser usado para esta função. A resposta está no formato application/json e inclui as seguintes informações no dispositivo:

Exemplo:

```
GET: /api/system/info
```

POST:

```
{
 "target": "system",
 "action": "info"
}
```

Exemplo de resposta:

```
{
     "retcode": 0,
     "action": "info",
     "message": "OK",
     "data": {
       "Status": {
         "Model": "XPE-3200-IP-FACE",
         "MAC": "0C:11:00:88:F1:F1",
         "FirmwareVersion": "116.57.2.72",
         "HardwareVersion": "116.0.6.1.0.0.0.0"
       },
       "Lan": {
         "PortType": "0",
         "LinkStatus": "1",
         "IPAddress": "192.168.12.119",
         "SubnetMask": "255.255.255.0",
         "Gateway": "192.168.12.1",
         "DNS1": "218.85.152.99",
         "DNS2": "218.85.157.99"
       },
       "Account1": {
         "UserName": "",
         "SipServer": "",
         "Status": "0"
       },
       "Account2": {
         "UserName": "",
         "SipServer": "",
         "Status": "0"
       }
     }
}
```

#### Api system status

O método GET ou POST pode ser usado para esta função.

| Param      | Description        |
| ---------- | ------------------ |
| SystemTime | Unix time          |
| UpTime     | Device online time |

Exemplo:

```
GET: /api/system/status
```

POST:

```
{
  "target": "system",
  "action": "status"
}
```

Exemplo de resposta:

```
{
     "retcode": 0,
     "action": "status",
     "message": "OK",
     "data": {
       "SystemTime": 1636946708,
       "UpTime": 1065
     }
}
```

#### Api system reboot

Exemplo:

```
GET: /api/system/reboot
```

POST:

```
{
  "target": "system",
  "action": "reboot"
}
```

Exemplo de resposta:

```
{
     "retcode": 0,
     "action": "status",
     "message": "OK",
}
```

***

### Api firmware

#### Api firmware param

| Param  | Description                                                                                                       |
| ------ | ----------------------------------------------------------------------------------------------------------------- |
| md5    | string, optional / md5sum of the firmware / only use in action "upgraer"                                          |
| silent | silent / 0 - ui will display upgrade process / 1 - upload in backgroup / only use in action "upload" / default: 0 |

#### Api firmware status

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/firmware/status
```

POST:

```
{
  "target": "firmware",
  "action": "status",
}
```

Exemplo de resposta:

```
{
     "retcode": 0,
     "action": "status",
     "message": "OK",
     "data": {
       "FirmwareVersion": "116.57.2.72",
       "HardwareVersion": "116.0.6.1.0.0.0.0",
       "MAC": "0C:11:00:88:F1:F1",
       "Model": "XPE-3200-IP-FACE"
     }
}
```

#### Api firmware prepare

Informe o dispositivo no modo de atualização, isso deve ser feito antes do upload e da ação de atualização. O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/firmware/prepare
```

POST:

```
{
       "target": "firmware",
       "action": "prepare",
}
```

Exemplo de resposta:

```
{
     "retcode": 0,
     "action": "prepare",
     "message": "OK"
}
```

#### Api firmware upload

Upload firmware, somente no método POST.

```
PATH: /api/firmware/upload
PARAM: /api/firmware/upload?silent=0
```

#### Api firmware upgrade

O método GET ou POST pode ser usado para esta função.

Exemplo (sem parâmetro MD5):

```
GET: /api/firmware/upgrade
```

POST:

```
{
     "target": "firmware",
     "action": "upgrade",
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "upgrade",
    "message": "OK"
}
```

Exemplo (com parâmetro MD5):

```
GET: /api/firmware/upgrade?md5=25e317773f308e446cc84c503a6d1f85
```

POST:

```
{
        "target": "firmware",
        "action": "upgrade",
        "data": {
                "md5" : "25e317773f308e446cc84c503a6d1f85"
        }
}
```

Exemplo de resposta (com parâmetro MD5):

```
{
    "retcode": -1,
    "action": "upgrade",
    "message": "Wrong MD5",
    "data": {
      "md5": "25e317773f308e446cc84c503a6d1f83",
      "md5_calc": "25e317773f308e446cc84c503a6d1f85"
    }
}
```

***

### Api config

#### Api config get

Nota: A configuração para PrivateKey, DialReplace, Contact, Group não estão incluídas nesta seção.

O método GET ou POST pode ser usado para esta função. Obter toda a configuração do Sistema (não puxa configurações de acesso como usuários e suas credenciais).

Exemplo 1:

```
GET: /api/config/get
```

POST:

```
{
"target": "config",
"action": "get"
}
```

Exemplo de resposta 1:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
       "Config.Account1.ADVANCED.ShowMissedCall": "1",
       "Config.Account1.ANONYMOUS_CALL.Enable": "0",
       "Config.Account1.ANONYMOUS_CALL.OffCode": "",
       "Config.Account1.ANONYMOUS_CALL.OnCode": "",
   .......
        "Config.Account1.ANONYMOUS_CALL.PrivacyHeaderValue": "id",
    },
}
```

Obter a configuração com filtro por uma seção.

Exemplo 2:

```
POST:
{
  "action": "get",
  "target": "config",
  "data": {
  "filter": [
     "Config.DoorSetting.HTTPAPI",
     "Config.Features.ACTIONURL"
  ]
  }
}
```

Exemplo de resposta 2:

```
{
   "retcode": 0,
   "action": "get",
   "message": "OK",
   "data": {
      "Config.Features.ACTIONURL.Enable": "1",
      "Config.Features.ACTIONURL.Method": "1",
      "Config.Features.ACTIONURL.MakeCall": "",
      "Config.Features.ACTIONURL.Card": "",
      "Config.Features.ACTIONURL.DoorLog": "http://10.0.0.51:5832",
      "Config.Features.ACTIONURL.CallLog": "",
      "Config.Features.ACTIONURL.AlarmLog": "http://10.0.0.51:5832",
      "Config.Features.ACTIONURL.InputAlarm": "",
      "Config.Features.ACTIONURL.InputBreakIn": "",
      "Config.Features.ACTIONURL.HangUp": "",
      "Config.Features.ACTIONURL.RelayATriggered": "",
      "Config.Features.ACTIONURL.RelayAClosed": "",
      "Config.Features.ACTIONURL.RelayBTriggered": "",
      "Config.Features.ACTIONURL.RelayBClosed": "",
      "Config.Features.ACTIONURL.InputATriggered": "",
      "Config.Features.ACTIONURL.InputAClosed": "",
      "Config.Features.ACTIONURL.InputBTriggered": "",
      "Config.Features.ACTIONURL.InputBClosed": "",
      "Config.Features.ACTIONURL.InputCTriggered": "",
      "Config.Features.ACTIONURL.InputCClosed": "",
      "Config.Features.ACTIONURL.ValidCodeEntered": "",
      "Config.Features.ACTIONURL.InvalidCodeEntered": "",
      "Config.Features.ACTIONURL.ValidCardEntered": "",
      "Config.Features.ACTIONURL.InvalidCardEntered": "",
      "Config.DoorSetting.HTTPAPI.AuthMode": "3",
      "Config.DoorSetting.HTTPAPI.WhiteListIP01": "",
      "Config.DoorSetting.HTTPAPI.WhiteListIP02": "",
      "Config.DoorSetting.HTTPAPI.WhiteListIP03": "",
      "Config.DoorSetting.HTTPAPI.WhiteListIP04": "",
      "Config.DoorSetting.HTTPAPI.WhiteListIP05": "",
      "Config.DoorSetting.HTTPAPI.UserName": "admin",
      "Config.DoorSetting.HTTPAPI.Password": "Intelbras01",
      "Config.DoorSetting.HTTPAPI.Enable": "1"
   }
}
```

Obter uma configuração específica.

Exemplo 3:

```
POST:
{
  "action": "get",
  "target": "config",
  "data": {
  "item": [
    "Config.DoorSetting.HTTPAPI.Enable",
    "Config.Features.ACTIONURL.DoorLog"
  ]
  }
}
```

Exemplo de resposta 3:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
      "Config.Features.ACTIONURL.DoorLog": "http://10.0.0.51:5832"
    }
}
```

#### Api config set

Somente método POST para esta função.

```
POST: /api/config/set
```

Exemplo:

```
POST:
{
  "target": "config",
  "action": "set",
  "data": {
    "Config.Features.ACTIONURL.Enable": "1",
    "Config.Features.ACTIONURL.Method": "1",
    "Config.Features.ACTIONURL.DoorLog": "http://10.0.0.51:5832",
    "Config.Features.ACTIONURL.AlarmLog": "http://10.0.0.51:5832"
  }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "set",
    "message": "OK"
}
```

#### Api config export

Para exportar a configuração, equivalente a operar via caminho da interface web: Atualização -> Avançado -> Arquivos de Configuração -> Exportar, e a configuração exportada é criptografada e não pode ser modificada.

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/config/export
```

POST:

```
{
  "action": "export",
  "target": "config",
  "data": {
  }
}
```

Exemplo de resposta:

```
Config.tgz tipo de arquivo gerado
```

#### Api config import

Somente método POST para esta função.

#### Api config reset\_factory

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/config/reset_factory
```

POST:

```
{
  "target": "config",
  "action": "reset_factory"
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "reset_factory",
    "message": "OK"
}
```

***

### Api relay

#### API Relay – Abrir porta remotamente

Métodos para liberação de acesso remotamente - OpenDoor

O produto suporta dois métodos diferentes para abertura de porta de forma remota através de comandos HTTP.

#### Comando OpenDoor

Para execução deste processo primeiramente deve ser ativado via interface web a permissão de Acionar Relé por HTTP na interface web do produto, definindo um usuário e uma senha para tal.

> Caso necessite editar estas mesmas configurações via `/api/config/set` use as variáveis abaixo:

```
http://10.0.0.213/api/config/set

{
    "target": "config",
    "action": "set",
    "data": {
          "Config.DoorSetting.RELAY.RelayOnWeb": "1",
          "Config.DoorSetting.RELAY.RelayOnWebUser": "admin",
          "Config.DoorSetting.RELAY.RelayOnWebPwd": "admin"
    }
}
```

Feitas as configurações use o comando HTTP abaixo para enviar uma abertura de porta de forma remota.

Requisição - GET:

```
http://10.0.0.213/fcgi/do?action=OpenDoor&UserName=admin&Password=admin&DoorNum=1
```

| param    | type    | description                                                                       |
| -------- | ------- | --------------------------------------------------------------------------------- |
| UserName | String  | Nome de usuário definido nas configurações do relé                                |
| Password | String  | Senha do usuário definido nas configurações do relé                               |
| DoorNum  | Integer | ID do relé sendo 1 para relé A presente no produto e 2 ou 3 para relés do XFE1000 |

#### Comando Relay Trigger

Enviar comando de abertura remota via API.

Requisição - GET:

```
http://10.0.0.213/api/relay/trig?mode=0&num=1&level=1&delay=15
```

Requisição - POST:

```
http://10.0.0.213/api/relay/trig

{
    "target": "relay",
    "action": "trig",
    "data" : {
        "mode": 0,
        "num": 1,
        "level": 1,
        "delay": 5
    }
}
```

| param | type    | description                                                                                                                                                                                            |
| ----- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| mode  | Integer | Modo de acionamento: 0=Auto Close - será acionado o relé e retorna automaticamente ao status default / 1=Manual - Se acionado o relé permanecerá neste status até um novo comando                      |
| num   | Integer | ID do relé a enviar comando sendo 1 para relé A presente no produto e 2 ou 3 para relés do XFE1000                                                                                                     |
| level | Integer | Nível de acionamento analisado apenas se mode=1: 0=Desacionar Relé / 1=Acionar o Relé. Importante: se usado modo manual para acionar o relé é necessário enviar novo comando com level=0 p/ desacionar |
| delay | Integer | Analisado apenas se mode=0 e será o tempo em que o relé ficará acionado até retornar ao estado default                                                                                                 |

Exemplo de Retorno - JSON:

```
{
    "retcode": 0,
    "action": "trig",
    "message": "OK"
}
```

***

### Api input

#### Api input get

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/input/get
```

POST:

```
{
  "target": "input",
  "action": "get"
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
      "Config.DoorSetting.INPUTA.Enable": "1",
      "Config.DoorSetting.INPUTA.Option": "1",
      "Config.DoorSetting.INPUTA.RelayId": "0",
      "Config.DoorSetting.INPUTA.HTTPURL": "",
      "Config.DoorSetting.INPUTA.Delay": "0",
      "Config.DoorSetting.INPUTA.FTPEnable": "0",
      "Config.DoorSetting.INPUTA.TFTPEnable": "0",
      "Config.DoorSetting.INPUTA.EmailEnable": "0",
      "Config.DoorSetting.INPUTA.HTTPEnable": "0",
    }
}
```

#### Api input set

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST:
{
  "target": "input",
  "action": "set",
  "data" : {
        "Config.DoorSetting.INPUTA.Enable": "0"
  }
}
```

Exemplo de resposta:

```
{
     "retcode": 0,
     "action": "set",
     "message": "OK"
}
```

#### Api input status

| Params | Description       |
| ------ | ----------------- |
| InputA | Door A GPIO Level |

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/input/status
```

POST:

```
{
  "target": "input",
  "action": "status",
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "status",
    "message": "OK",
    "data": {
      "InputA": 0
    }
}
```

***

### Api publiccode

| Params                                      | Description                                 |
| ------------------------------------------- | ------------------------------------------- |
| Config.DoorSetting.PASSWORD.PublicKeyEnable | Enable Public Code / 0: Disable / 1: Enable |
| Config.DoorSetting.PASSWORD.PublicKey1      | Public Key 1                                |

#### Api publiccode get

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/publiccode/get
```

POST:

```
{
       "target": "publiccode",
       "action": "get",
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
      "Config.DoorSetting.PASSWORD.PublicKeyEnable": "0",
      "Config.DoorSetting.PASSWORD.PrivateKeyType": "1",
      "Config.DoorSetting.PASSWORD.PublicKey1": "33333333"
    }
}
```

#### Api publiccode set

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST:
{
  "target": "publiccode",
  "action": "set",
  "data" : {
        "Config.DoorSetting.PASSWORD.PublicKeyEnable": "0"
  }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "set",
    "message": "OK"
}
```

***

### Api contact

| Param    | Description                                                                                                      |
| -------- | ---------------------------------------------------------------------------------------------------------------- |
| ID       | Index                                                                                                            |
| Name     | Name                                                                                                             |
| Phone    | Phone Number                                                                                                     |
| DialType | 0 Auto (if phone number is ip, will can with direct ip, others use register account) / 1 Account 1 / 2 Account 2 |
| Group    | Group Name                                                                                                       |

#### Api contact get

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/contact/get
```

POST:

```
{
     "target": "contact",
     "action": "get"
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
      "num": 2,
      "item": [
         {
            "Account": "0",
            "Email": "",
            "Floor": "103",
            "Group": "Bloco1",
            "ID": "1",
            "Name": "teste1",
            "Phone": "10.0.0.103",
            "Priority": "0"
         },
         {
            "Account": "0",
            "Email": "asdf@asdf.com",
            "Floor": "104",
            "Group": "Default",
            "ID": "2",
            "Name": "Teste2",
            "Phone": "10.0.0.104",
            "Priority": "0"
         }
      ]
    }
}
```

#### Api contact add

Somente o método POST pode ser usado para esta função. Melhorias implementadas a partir do firmware 116.57.2.116.

Exemplo:

```
POST: /api/contact/add
```

POST:

```
{
  "target": "contact",
  "action": "add",
  "data": {
    "num": 2,
    "item": [
       {
          "Account": "0",
          "Email": "",
          "Floor": "105",
          "Group": "Bloco1",
          "ID": "3",
          "Name": "teste105",
          "Phone": "10.0.0.105",
          "Priority": "0"
       },
       {
          "Account": "0",
          "Email": "test@test.com",
          "Floor": "106",
          "Group": "Bloco1",
          "ID": "4",
          "Name": "teste106",
          "Phone": "10.0.0.106",
          "Priority": "0"
       }
    ]
  }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "add",
    "message": "OK",
    "data": {
      "num": 2,
      "item": [
         {
            "Ret": 0,
            "ID": "2",
            "Name": "teste105",
            "Phone": "10.0.0.105"
         },
         {
            "Ret": 0,
            "ID": "3",
            "Name": "teste106",
            "Phone": "10.0.0.106"
         }
      ]
    }
}
```

#### Api contact set

Somente o método POST pode ser usado para esta função. Melhorias implementadas a partir do firmware 116.57.2.116.

Exemplo:

```
POST: /api/contact/set
```

POST:

```
{
  "target": "contact",
  "action": "set",
  "data": {
    "item": [
       {
         "Account": "0",
         "Email": "t@t.com",
         "Floor": "5105",
         "Group": "Bloco1",
         "ID": "3",
         "Name": "5teste105",
         "Phone": "105.0.0.105",
         "Priority": "0"
       }
    ]
  }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "set",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
         {
           "Ret": 0,
           "ID": "3",
           "Name": "5teste105",
           "Phone": "105.0.0.105"
         }
      ]
    }
}
```

#### Api contact del

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST: /api/contact/del
```

POST:

```
{
  "target": "contact",
  "action": "del",
  "data": {
    "item": [
       {
          "Name": "teste105"
       },
       {
          "ID": "1"
       }
    ]
  }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "del",
    "message": "OK",
    "data": {
      "num": 2,
      "item": [
         {
            "Ret": 0,
            "ID": "2",
            "Name": "teste105",
            "Phone": "10.0.0.105"
         },
         {
            "Ret": 0,
            "ID": "1",
            "Name": "teste1",
            "Phone": "10.0.0.103"
         }
      ]
    }
}
```

#### Api contact clear

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/contact/clear
```

POST:

```
{
     "target": "contact",
     "action": "clear"
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "clear",
    "message": "OK",
}
```

#### Api contact export

| Param    | Description                                                                    |
| -------- | ------------------------------------------------------------------------------ |
| filetype | option param, default type csv / csv: csv file / xml: xml file / vcf: vcf file |

Nota: se o contato estiver vazio, ele retornará falha (failed).

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/contact/export?filetype=csv
```

POST:

```
{
  "target": "contact",
  "action": "export",
  "data": {
            "filetype":"csv"
  }
}
```

Exemplo de resposta:

```
succeed: send csv file

failed:
{
  "retcode": -1,
  "action": "export",
  "message": "Export Failed."
}
```

***

### Api group

| Param | Description |
| ----- | ----------- |
| ID    | Index       |
| Name  | Group Name  |

#### Api group get

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/group/get
```

POST:

```
{
     "target": "group",
     "action": "get",
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
         {
           "ID": "12",
           "Name": "FLOOR-1"
         }
      ]
    }
}
```

#### Api group add

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST:
{
         "target": "group",
         "action": "add",
         "data" : {
                 "item": [
     {
             "ID": "0",
             "Name": "FLOOR2"
     }
 ]
         }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "add",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
         {
           "Ret": 0,
           "ID": "13",
           "Name": "FLOOR2"
         }
      ]
    }
}
```

#### Api group set

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST:
{
         "target": "group",
         "action": "set",
         "data" : {
                 "item": [
     {
             "ID": "13",
             "Name": "FLOOR-402"
     }
 ]
         }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "set",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
         {
           "Ret": 0,
           "ID": "13",
           "Name": "FLOOR-402"
         }
      ]
    }
}
```

#### Api group clear

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/group/clear
```

POST:

```
{
     "target": "group",
     "action": "clear"
}
```

Exemplo de resposta:

```
{
    "action": "clear",
    "message": "OK",
    "retcode": 0
}
```

***

### Api call

#### Api call status

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/call/status
```

POST:

```
{
     "target": "call",
     "action": "status"
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "status",
    "message": "OK",
    "data": {
      "Status": "READY"
    }
}
```

#### Api call dial

O método GET ou POST pode ser usado para esta função.

**NÃO SUPORTADO**

#### Api call hangup

O método GET ou POST pode ser usado para esta função.

**NÃO SUPORTADO**

***

### Api sip

| Param                               | Description                   |
| ----------------------------------- | ----------------------------- |
| Account 1                           |                               |
| Config.Account1.GENERAL.Enable      | 0 Disable / 1 Enable          |
| Config.Account1.SIP.Server          | SIP Server / Ex:192.168.1.115 |
| Config.Account1.SIP.Port            | SIP Server Port / Ex:5060     |
| Config.Account1.GENERAL.AuthName    | Sip Server Auth Name          |
| Config.Account1.GENERAL.UserName    | Sip Server Register Name      |
| Config.Account1.GENERAL.Pwd         | Sip Server Password           |
| Config.Account1.GENERAL.DisplayName | Remote Display Name           |
| Account 2                           |                               |
| Config.Account2.GENERAL.Enable      | 0 Disable / 1 Enable          |
| Config.Account2.SIP.Server          | SIP Server / Ex:192.168.1.115 |
| Config.Account2.SIP.Port            | SIP Server Port / Ex:5060     |
| Config.Account2.GENERAL.AuthName    | Sip Server Auth Name          |
| Config.Account2.GENERAL.UserName    | Sip Server Register Name      |
| Config.Account2.GENERAL.Pwd         | Sip Server Password           |
| Config.Account2.GENERAL.DisplayName | Remote Display Name           |

#### Api sip get

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/sip/get
```

POST:

```
{
        "target": "sip",
        "action": "get"
}
```

Exemplo de resposta:

```
{
   "retcode": 0,
   "action": "get",
   "message": "OK",
   "data": {
     "Config.Account1.ANONYMOUS_CALL.Enable": "0",
     "Config.Account1.ANONYMOUS_CALL.OffCode": "",
     "Config.Account1.ANONYMOUS_CALL.OnCode": "",
     "Config.Account1.ANONYMOUS_CALL.PrivacyHeaderValue": "id",
     "Config.Account1.AUTO_ANSWER.Enable": "1",
     "Config.Account1.GENERAL.AuthName": "",
     "Config.Account1.GENERAL.DisplayName": "",
     "Config.Account1.GENERAL.EditEnable": "",
     "Config.Account1.GENERAL.Enable": "0",
     "Config.Account1.GENERAL.Label": "",
     "Config.Account1.GENERAL.Pwd": "",
     "Config.Account1.GENERAL.UserAgent": "",
     "Config.Account1.GENERAL.UserName": "",
     "Config.Account1.NAT.Rport": "0",
     "Config.Account1.NAT.UdpKeepEnable": "1",
     "Config.Account1.NAT.UdpKeepInterval": "30",
     "Config.Account1.OUTPROXY.BakPort": "5060",
     "Config.Account1.OUTPROXY.BakServer": "",
     "Config.Account1.OUTPROXY.DHCPOption": "0",
     "Config.Account1.OUTPROXY.Enable": "0",
     "Config.Account1.OUTPROXY.Port": "5060",
     "Config.Account1.OUTPROXY.Server": "",
     "Config.Account1.REJECT_ANONYMOUSCALL.Enable": "0",
     "Config.Account1.REJECT_ANONYMOUSCALL.OffCode": "",
     "Config.Account1.REJECT_ANONYMOUSCALL.OnCode": "",
     "Config.Account1.SIP.ListenPortMax": "5062",
     "Config.Account1.SIP.ListenPortMin": "5062",
     "Config.Account1.SIP.Port": "5060",
     "Config.Account1.SIP.Port2": "5060",
     "Config.Account1.SIP.Server": "",
     "Config.Account1.SIP.Server2": "",
     "Config.Account1.SIP.TransType": "0",
     "Config.Account1.STUN.Enable": "0",
     "Config.Account1.STUN.Port": "3478",
     "Config.Account1.STUN.Server": "",
     "Config.Account2.ANONYMOUS_CALL.Enable": "0",
     "Config.Account2.ANONYMOUS_CALL.OffCode": "",
     "Config.Account2.ANONYMOUS_CALL.OnCode": "",
     "Config.Account2.ANONYMOUS_CALL.PrivacyHeaderValue": "id",
     "Config.Account2.AUTO_ANSWER.Enable": "1",
     "Config.Account2.GENERAL.AuthName": "",
     "Config.Account2.GENERAL.DisplayName": "",
     "Config.Account2.GENERAL.EditEnable": "",
     "Config.Account2.GENERAL.Enable": "0",
     "Config.Account2.GENERAL.Label": "",
     "Config.Account2.GENERAL.Pwd": "",
     "Config.Account2.GENERAL.UserAgent": "",
     "Config.Account2.GENERAL.UserName": "",
     "Config.Account2.NAT.Rport": "0",
     "Config.Account2.NAT.UdpKeepEnable": "1",
     "Config.Account2.NAT.UdpKeepInterval": "30",
     "Config.Account2.OUTPROXY.BakPort": "5060",
     "Config.Account2.OUTPROXY.BakServer": "",
     "Config.Account2.OUTPROXY.DHCPOption": "0",
     "Config.Account2.OUTPROXY.Enable": "0",
     "Config.Account2.OUTPROXY.Port": "5060",
     "Config.Account2.OUTPROXY.Server": "",
     "Config.Account2.REJECT_ANONYMOUSCALL.Enable": "0",
     "Config.Account2.REJECT_ANONYMOUSCALL.OffCode": "",
     "Config.Account2.REJECT_ANONYMOUSCALL.OnCode": "",
     "Config.Account2.SIP.ListenPortMax": "5063",
     "Config.Account2.SIP.ListenPortMin": "5063",
     "Config.Account2.SIP.Port": "5060",
     "Config.Account2.SIP.Port2": "5060",
     "Config.Account2.SIP.Server": "",
     "Config.Account2.SIP.Server2": "",
     "Config.Account2.SIP.TransType": "0",
     "Config.Account2.STUN.Enable": "0",
     "Config.Account2.STUN.Port": "3478",
     "Config.Account2.STUN.Server": ""
   }
}
```

#### Api sip set

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST:
{
     "target": "sip",
     "action": "set",
     "data" : {
             "Config.Account1.GENERAL.AuthName" : "130",
             "Config.Account1.GENERAL.DisplayName": "130",
             "Config.Account1.GENERAL.Enable": "1",
             "Config.Account1.GENERAL.Label": "130",
             "Config.Account1.GENERAL.Pwd": "130",
             "Config.Account1.GENERAL.UserName":"130",
             "Config.Account1.SIP.Port":"5060",
             "Config.Account1.SIP.Server": "192.168.1.115"
     }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "set",
    "message": "OK"
}
```

#### Api sip status

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/sip/status
```

POST:

```
{
     "target": "sip",
     "action": "status",
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "status",
    "message": "OK",
    "data": {
      "Account1": {
         "UserName": "130",
         "SipServer": "192.168.1.115",
         "Status": "2"
      },
      "Account2": {
         "UserName": "",
         "SipServer": "",
         "Status": "0"
      }
    }
}
```

***

### Api dialreplace

| Param       | Description                               |
| ----------- | ----------------------------------------- |
| ID          | ID                                        |
| Prefix      | number                                    |
| Replace     | number                                    |
| Replace2    | number                                    |
| Account1    | 0 Auto / 1 Account 1 / 2 Account 2 / 3 IP |
| Account2    | 0 Auto / 1 Account 1 / 2 Account 2 / 3 IP |
| TimeRinging | time                                      |
| GroupTime   | time                                      |

#### Api dialreplace get

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/dialreplace/get
```

POST:

```
{
            "target": "dialreplace",
            "action": "get"
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
     "num": 1,
     "item": [
          {
        "ID": "1",
        "Prefix": "100",
        "Replace": "1001",
        "Replace2": "1002",
         "Account1": "1",
         "Account2": "0",
        "TimeRinging": "15",
         "GroupTime": "0",
      }
     ]
    }
}
```

#### Api dialreplace add

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST:
{
          "target": "dialreplace",
          "action": "add",
          "data" : {
                  "item": [
      {
          "ID": "1",
          "Prefix": "101",
          "Replace": "1001",
          "Replace2": "1002",
          "Account1": "1",
          "Account2": "0",
          "TimeRinging": "5",
          "GroupTime": "0",
      }
                  ]
          }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "add",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
        {
          "Ret": 0,
          "ID": "1",
          "Prefix": "101"
        }
      ]
    }
}
```

#### Api dialreplace set

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST:
{
          "target": "dialreplace",
          "action": "set",
          "data" : {
                  "item": [
      {
                        "ID": "1",
                        "Prefix": "101",
                        "Replace": "1001",
                        "Replace2": "1002",
              "Account1": "1",
              "Account2": "2",
                        "TimeRinging": "5",
              "GroupTime": "0",
      }
                    ]
          }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "set",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
        {
          "Ret": 7,
          "ID": "1",
          "Prefix": "101"
        }
      ]
    }
}
```

#### Api dialreplace del

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST:
{
        "target": "dialreplace",
        "action": "del",
        "data" : {
                "item": [
    {
            "ID": "1"
    }
                   ]
        }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "del",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
         {
           "Ret": 0,
           "ID": "1"
         }
      ]
    }
}
```

#### Api dialreplace clear

Exemplo:

```
GET: /api/dialreplace/clear
```

POST:

```
{
        "target": "dialreplace",
        "action": "clear",
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "clear",
    "message": "OK"
}
```

#### Api dialreplace export

Exemplo:

```
GET: /api/dialreplace/export
```

POST:

```
{
      "target": "dialreplace",
      "action": "export",
}
```

Exemplo de resposta:

```
DialReplace.xml
```

#### Api dialreplace import

Somente o método POST pode ser usado para esta função.

***

### Api log

| Param                          | Description                                                                                                                                                                                    |
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Config.Settings.LOGLEVEL.Level | log debug level / 0 LOG\_LEVEL\_EMERG / 1 LOG\_LEVEL\_ALERT / 2 LOG\_LEVEL\_CRIT / 3 LOG\_LEVEL\_ERR / 4 LOG\_LEVEL\_WARNING / 5 LOG\_LEVEL\_NOTICE / 6 LOG\_LEVEL\_INFO / 7 LOG\_LEVEL\_DEBUG |

#### Api log get

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/log/get
```

POST:

```
{
     "target": "log",
     "action": "get",
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
      "Config.Settings.LOGLEVEL.Level": "3"
    }
}
```

#### Api log set

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST:
{
     "target": "log",
     "action": "set",
     "data" : {
  "Config.Settings.LOGLEVEL.Level": "7"
     }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
}
```

#### Api log export

| Param | Description                                                                                                                            |
| ----- | -------------------------------------------------------------------------------------------------------------------------------------- |
| type  | export log type / log: default, application log (Android logcat or Linux syslog) / kmsg: kernel log / log\_debug: support android only |

Exemplo:

```
GET: /api/log/export?type=log
```

POST:

```
{
     "target": "log",
     "action": "export",
     "data" : {
             "type" : "log"
     }
}
```

Exemplo de resposta:

```
log.txt
kmsg.txt
log_debug.tar.gz
```

#### Api log clear

| Param | Description                                                                                                                            |
| ----- | -------------------------------------------------------------------------------------------------------------------------------------- |
| type  | export log type / log: default, application log (Android logcat or Linux syslog) / kmsg: kernel log / log\_debug: support android only |

Exemplo:

```
GET: /api/log/clear?type=kmsg
```

POST:

```
{
      "target": "log",
      "action": "clear",
      "data" : {
              "type" : "kmsg"
      }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "clear",
    "message": "OK"
}
```

***

### Api calllog

| Param          | Description                                                                   |
| -------------- | ----------------------------------------------------------------------------- |
| ID             |                                                                               |
| Type           | 0 "All" / 1 "Dialed" / 2 "Received" / 3 "Missed" / 4 "Forwarded" / 5 "Unknow" |
| Date           |                                                                               |
| Time           |                                                                               |
| Local Identity | Sip Server                                                                    |
| Name           | Remote DisplayName                                                            |
| Number         | Call Num                                                                      |

#### Api calllog get

| Param | Description                                                                                             |
| ----- | ------------------------------------------------------------------------------------------------------- |
| Type  | Optional, Default "All" / 0 "All" / 1 "Dialed" / 2 "Received" / 3 "Missed" / 4 "Forwarded" / 5 "Unknow" |

Exemplo:

```
GET: /api/calllog/get
```

POST:

```
{
    "target": "calllog",
    "action": "get"
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
         {
           "Date": "2018-12-13",
           "ID": "23",
           "LocalIdentity": "192.168.1.98@192.168.1.98",
           "Name": "192.168.1.48",
           "Num": "192.168.1.98@192.168.1.98",
           "Time": "05:55:59",
           "Type": "Received"
         }
      ]
    }
}
```

#### Api calllog del

| Param | Description   |
| ----- | ------------- |
| ID    | string, index |

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST:
{
     "target": "calllog",
     "action": "del",
     "data" : {
             "ID" : "23"
     }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "del",
    "message": "OK"
}
```

#### Api calllog clear

| Param | Description                                                                            |
| ----- | -------------------------------------------------------------------------------------- |
| Type  | string / 0 "All" / 1 "Dialed" / 2 "Received" / 3 "Missed" / 4 "Forwarded" / 5 "Unknow" |

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/calllog/clear?type=Missed
```

POST:

```
{
     "target": "calllog",
     "action": "clear",
     "data" : {
             "Type" : "Missed"
     }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "upgrade",
    "message": "OK"
}
```

#### Api calllog export

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/calllog/export
```

POST:

```
{
    "target": "calllog",
    "action": "export",
}
```

Exemplo de resposta:

```
History.csv
```

***

### Api doorlog

| Param  | Description                                                  |
| ------ | ------------------------------------------------------------ |
| ID     |                                                              |
| Type   | 0 "Unknow" / 1 "Card" / 2 "Password" / 3 "Public" / 4 "Face" |
| Name   |                                                              |
| Status | 0 Success / 1 Failed                                         |
| Code   |                                                              |
| Date   |                                                              |
| Time   |                                                              |

#### Api doorlog get

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/doorlog/get
```

POST:

```
{
       "target": "doorlog",
       "action": "get"
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
        {
          "Code": "OpenDoor",
          "Date": "2021-11-15",
          "ID": "1",
          "Name": "HTTPAPI",
          "Relay": "1",
          "Status": "Success",
          "Time": "03:30:24",
          "Type": "Cloud"
        }
      ]
    }
}
```

A partir da versão de firmware "116.57.2.72" ou superior é possível realizar comando `/doorlog/get` aplicando o filtro do UserID.

Exemplo:

```
POST:
{
      "target": "doorlog",
      "action": "get",
 "data": {
         "item": [{"UserID":"9000"}]
 }
}
```

Exemplo de resposta:

```
{
      "retcode": 0,
      "action": "get",
      "message": "OK",
      "data": {
         "num": 1,
         "item": [
            {
              "Code": "655553",
              "Date": "2022-11-21",
              "ID": "6",
              "Name": "Mick Jagger",
              "Picture": "https://10.101.1.121/Image/DoorPicture/2022-11-21_15-3-28.jpg",
              "Relay": "1",
              "Status": "Success",
              "Time": "15:03:28",
              "Type": "PIN",
              "UserID": "9000"
            }
         ]
      }
}
```

A partir da versão de firmware "116.57.2.124" ou superior é possível realizar comando `/doorlog/get` aplicando o filtro por data ou XX últimos registros.

Exemplo com data:

```
POST:
{
  "target": "doorlog",
  "action": "get",
  "data" : {
     "StartTime" : "2023-05-11",
     "EndTime"  : "2023-05-12"
}
}
```

Exemplo com número de registros:

```
POST:
{
  "target": "doorlog",
  "action": "get",
  "data" : {
       "Num" : "n", // n means the number of latest logs
   }
}
```

#### Api doorlog del

| Param | Description   |
| ----- | ------------- |
| ID    | string, index |

Somente o método POST pode ser usado para esta função.

Exemplo:

```
POST:
{
      "target": "doorlog",
      "action": "del",
      "data" : {
              "ID" : "1"
      }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "del",
    "message": "OK"
}
```

#### Api doorlog clear

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/doorlog/clear
```

POST:

```
{
      "target": "doorlog",
      "action": "clear",
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "clear",
    "message": "OK"
}
```

#### Api doorlog export

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/doorlog/export
```

POST:

```
{
     "target": "doorlog",
     "action": "export",
}
```

Exemplo de resposta:

```
DoorLog.xml
```

***

### Api pcap

#### Api pcap status

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/pcap/status
```

POST:

```
{
     "target": "pcap",
     "action": "status"
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "status",
    "message": "OK",
    "data": {
      "FileSize": 0,
      "Status": "stop"
    }
}
```

#### Api pcap start

| Param  | Description                                                                             |
| ------ | --------------------------------------------------------------------------------------- |
| type   | capture type, optional / auto auto stop (capture 60 second) / manual                    |
| filter | pcap filter type, optional / more info see libpcap / default: "ip"                      |
| time   | capture time 1-180, optional / default 60 second / only work on type == auto            |
| size   | optional capture limit size, when reach size limit it will auto stop / default: 1048576 |

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/pcap/start
```

POST:

```
{
     "target": "pcap",
     "action": "start",
     "data" : {
             "type" : "auto",
             "filter" : "ip",
             "time": "180",
             "size": "1048576"
     }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "start",
    "message": "OK",
    "data": {
      "filter": "ip",
      "interface": "eth0",
      "size": "1048576",
      "time": "180",
      "type": "auto"
    }
}
```

#### Api pcap stop

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/pcap/stop
```

POST:

```
{
     "target": "pcap",
     "action": "stop"
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "stop",
    "message": "OK",
    "data": {
      "FileSize": "314407",
      "Time": "9"
    }
}
```

#### Api pcap export

O método GET pode ser usado para esta função.

Exemplo:

```
GET: /api/pcap/export

{
     "target": "pcap",
     "action": "export",
}
```

Exemplo de resposta:

```
phone.pcap
```

***

### Api schedule

| Param     | Description |
| --------- | ----------- |
| ID        | ID          |
| Name      | Name        |
| Type      | Type        |
| WeekDay   | WeekDay     |
| StartDate | StartDate   |
| EndDate   | EndDate     |
| StartTime | StartTime   |
| EndTime   | EndTime     |

#### Api schedule get

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/schedule/get
```

POST:

```
{
    "target": "schedule",
    "action": "get",
}
```

Exemplo de resposta:

```
{
  "retcode": 0,
  "action": "get",
  "message": "OK",
  "data": {
    "num": 2,
    "item": [
      {
        "DateEnd": "",
        "DateStart": "",
        "Fri": 0,
        "ID": 1001,
        "Mon": 0,
        "Name": "Always",
        "Sat": 0,
        "Sun": 0,
        "Thur": 0,
        "TimeEnd": "23:59",
        "TimeStart": "00:00",
        "Tue": 0,
        "Type": 2,
        "Wed": 0
      },
      {
        "DateEnd": "",
        "DateStart": "",
        "Fri": 0,
        "ID": 1002,
        "Mon": 0,
        "Name": "Never",
        "Sat": 0,
        "Sun": 0,
        "Thur": 0,
        "TimeEnd": "00:00",
        "TimeStart": "00:00",
        "Tue": 0,
        "Type": 2,
        "Wed": 0
      }
    ]
  }
}
```

#### Api schedule add

O método GET ou POST pode ser usado para esta função. Número máximo de schedule serão 500 posições.

Exemplo:

```
GET: /api/schedule/add
```

POST:

```
{
      "target": "schedule",
      "action": "add",
      "data": {
      "item": [
              {
              "Type": "0",
              "Name": "1",
              "DateStart": "20211021",
              "DateEnd": "20211022",
              "Sun": "1",
              "Mon": "1",
              "Tue": "1",
              "Wed": "1",
              "Thur": "1",
              "Fri": "1",
              "Sat": "1",
              "TimeStart": "00:00",
              "TimeEnd": "23:59"
              },
      ]
      }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "add",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
        {
          "Ret": 0,
          "Name": "1"
        }
      ]
    }
}
```

#### Api schedule set

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/schedule/set
```

POST:

```
{
    "target": "schedule",
    "action": "set",
    "data": {
    "item": [
            {
            "Type": "0",
            "Name": "1",
            "ID": "1",
            "DateStart": "20211021",
            "DateEnd": "20211022",
            "Sun": "1",
            "Mon": "1",
            "Tue": "1",
            "Wed": "1",
            "Thur": "1",
            "Fri": "1",
            "Sat": "1",
            "TimeStart": "00:00",
            "TimeEnd": "20:59"
            },
    ]
    }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "set",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
        {
          "ID": 1,
          "Ret": 0
        }
      ]
    }
}
```

#### Api schedule del

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/schedule/del
```

POST:

```
{
      "target": "schedule",
      "action": "del",
      "data": {
      "item": [
              {
              "ID": "1",
              },
      ]
      }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "del",
    "message": "OK",
    "data": {
      "num": 1,
      "item": [
        {
          "ID": 1,
          "Ret": 0
        }
      ]
    }
}
```

#### Api schedule clear

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/schedule/clear
```

POST:

```
{
       "target": "schedule",
       "action": "clear",
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "clear",
    "message": "OK",
    "data": {}
}
```

#### Api schedule export

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/schedule/export
```

POST:

```
{
    "target": "schedule",
    "action": "export",
}
```

Exemplo de resposta:

```
schedule.xml
```

#### Api schedule import

Somente o método POST pode ser usado para esta função.

***

### Api user

#### Api user get

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/user/get
```

POST:

```
{
    "target": "user",
    "action": "get",
}
```

Exemplo de resposta:

```
{
  "retcode": 0,
  "action": "get",
  "message": "OK",
  "data": {
    "num": 1,
    "item": [
       {
         "FaceStatus": 1,
         "Frequency": -1,
         "ID": 1,
         "Validity": 0,
         "CardCode": "AAABBB",
         "FaceID": "https://10.101.1.121/Image/RegisterImg/0.jpg",
         "FaceUrl": "",
         "LiftFloorNum": "101",
         "Name": "Mick Jagger",
         "PrivatePIN": "655553",
         "ScheduleRelay": "",
         "UserID": "9000",
         "WebRelay": "0"
       }
    ]
  }
}
```

A partir da versão de firmware "116.57.2.72" ou superior é possível realizar comando `/user/get` aplicando o filtro do UserID.

Exemplo:

```
POST:
{
    "target": "user",
    "action": "get",
    "data": {
      "item": [{"UserID":"9000"}]
}
}
```

Exemplo de resposta:

```
{
  "retcode": 0,
  "action": "get",
  "message": "OK",
  "data": {
    "num": 1,
    "item": [
       {
         "FaceStatus": 1,
         "Frequency": -1,
         "ID": 334,
         "Validity": 0,
         "CardCode": "AAABBB",
         "FaceID": "https://10.0.0.108/Image/RegisterImg/329.jpg",
         "FaceImage": "data:image/jpeg;base64,/9j/4AAQSk..../9k=",
         "FaceUrl": "",
         "LiftFloorNum": "101",
         "Name": "Mick Jagger",
         "PrivatePIN": "655553",
         "ScheduleRelay": "",
         "UserID": "9000",
         "WebRelay": "0"
       }
    ]
  }
}
```

#### Api user add

Somente o método POST pode ser usado para esta função.

Exemplo:

```
{
         "target": "user",
         "action": "add",
         "data": {
    "item": [
       {
          "CardCode": "AAABBB",
          "FaceUrl": "",
          "LiftFloorNum": "101",
          "Name": "Mick Jagger",
          "PrivatePIN": "655553",
          "ScheduleRelay": "",
          "UserID": "9000",
          "WebRelay": "0",
          "Frequency": "0",
          "Validity": "0",
          "Relay":"1",
          "FaceImage":"/9j.....//2Q=="
       }
    ]
}
}
```

Exemplo de resposta:

```
{
  "retcode": 0,
  "action": "add",
  "message": "OK",
  "data": {
    "num": 1,
    "item": [
       {
         "ID": -1,
         "UserID": "9000"
       }
    ]
}
}
```

#### Api user set

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/user/set
```

POST:

```
{
          "target": "user",
          "action": "set",
          "data": {
     "item": [
        {
          "ID": "1",
           "CardCode": "AAABBB,00112233",
           "LiftFloorNum": "101",
           "Name": "Mick Jagger",
           "PrivatePIN": "655553",
           "ScheduleRelay": "",
           "UserID": "9000",
           "WebRelay": "0",
           "Frequency": 0,
           "Validity": "0",
           "Relay":"1"
        }
     ]
 }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "set",
    "message": "OK",
    "data": {}
}
```

#### Api user del

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/user/del
```

POST:

```
{
          "target": "user",
          "action": "del",
          "data": {
     "item": [
        {
          "ID": "2",
          "UserID": "0002"
        }
     ]
 }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "del",
    "message": "OK",
    "data": {}
}
```

A partir da versão de firmware "116.57.2.72" ou superior é possível realizar comando `/user/del` aplicando o filtro do UserID.

Exemplo:

```
POST:
{
          "target": "user",
          "action": "del",
          "data": {
     "item": [
        {
           "UserID": "9000"
         }
     ]
 }
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "del",
    "message": "OK",
    "data": {}
}
```

#### Api user clear

O método GET ou POST pode ser usado para esta função.

Exemplo:

```
GET: /api/user/clear
```

POST:

```
{
       "target": "user",
       "action": "clear",
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "clear",
    "message": "OK"
}
```

***

### Api snapshot

O método GET ou POST pode ser usado para esta função.

A partir da versão de firmware "116.57.2.116" ou superior é possível realizar comando `/api/snapshot/get` para realizar uma captura de face em formato base64 direto da câmera do XPE.

Exemplo:

```
POST: /api/snapshot/get

{
       "target": "snapshot",
       "action": "get",
}
```

Exemplo de resposta:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
      "snapshot": "data:image/jpeg;base64,/9j/4AAQSkZ......Wt39w+Rn/9k="
    }
}
```

***

### Eventos em tempo real

Eventos de Acesso, Alarmes ou chamadas podem ser enviados para um servidor externo de forma automática. Para isto configure o caminho http no modo POST ao qual será enviado no formato json os eventos em tempo real.

#### Doorlog – Usuário cadastrado e autorizado

```
{
  "Event_type":        "DoorLog",
  "EventID": 11,
  "MAC_ADDR":          "48:51:CF:60:50:A4",
  "Name": "Joao da Silva",
  "Type": "Card",
  "Status": 0,
  "Code": "838DC744",
  "Date": "2022-05-23",
  "Time": "10:31:22",
  "Picture": "2022-05-23_10-31-22.jpg",
  "UseId": "1001",
  "Relay": "1"
}
```

#### Doorlog – Usuário não cadastrado e acesso negado

```
{
  "Event_type":        "DoorLog",
  "EventID": 12,
  "MAC_ADDR":          "48:51:CF:60:50:A4",
  "Name": "Desconhecido",
  "Type": "Card",
  "Status": 1,
  "Code": "8DF8CCE9",
  "Date": "2022-05-23",
  "Time": "10:32:48",
  "Picture": "2022-05-23_10-32-48.jpg",
  "UseId": "Desconhecido",
  "Relay": "1"
}
```

#### Doorlog – Abertura de fechadura por DTMF

```
{
  "Event_type":        "DoorLog",
  "EventID": 14,
  "MAC_ADDR":          "48:51:CF:60:50:A4",
  "Name": "10.0.0.136",
  "Type": "DTMF",
  "Status": 0,
  "Code": "*1",
  "Date": "2023-05-23",
  "Time": "10:39:41",
  "Picture": "2023-05-23_10-39-41.jpg",
  "UseId": "-",
  "Relay": "1"
}
```

#### Alarmlog – Arrombamento

```
{
  "Event_type":      "AlarmLog",
  "EventID": 1,
  "MAC_ADDR":        "48:51:CF:60:50:A4",
  "Type": "Break-in intrusion",
  "Code": "-",
  "Relay": "1",
  "Date": "2022-05-23",
  "Time": "10:35:31"
}
```

#### Alarmlog – Porta aberta

```
{
  "Event_type":      "AlarmLog",
  "EventID": 2,
  "MAC_ADDR":        "48:51:CF:60:50:A4",
  "Type": "Door Open Alarm",
  "Code": "-",
  "Relay": "1",
  "Date": "2022-05-23",
  "Time": "10:36:54"
}
```

#### Alarmlog – Tamper

```
{
  "Event_type":      "AlarmLog",
  "EventID": 4,
  "MAC_ADDR":        "48:51:CF:60:50:A4",
  "Type": "Tamper Alarm",
  "Code": "-",
  "Relay": "1",
  "Date": "2022-05-23",
  "Time": "10:41:12"
}
```

#### Calllog – Chamada originada ponto a ponto

```
{
  "Event_type":       "CallLog",
  "EventID": 0,
  "MAC_ADDR":         "48:51:CF:60:50:A4",
  "Type": "Dialed",
  "Date": "2022-05-23",
  "Time": "10:38:05",
  "LocalIdentity":  "10.0.0.129@10.0.0.129",
  "Name": "10.0.0.136",
  "Num": "10.0.0.136@10.0.0.136"
}
```

A partir da versão de firmware "116.57.2.72" ou superior é possível ter o evento de sensor de porta após cada transição. Para isto configure o caminho url conforme a imagem abaixo.

#### Evento sensor – Porta foi aberta

```
{
  "Event_type":       "Input",
  "MAC_ADDR":         "48:51:CF:60:50:A4",
  "Date": "2023-05-23",
  "Time": "10:43:31",
  "Status": "Trigger"
}
```

#### Evento sensor – Porta foi fechada

```
{
  "Event_type":      "Input",
  "MAC_ADDR":        "48:51:CF:60:50:A4",
  "Date": "2023-05-23",
  "Time": "10:43:34",
  "Status": "Closed"
}
```

***

## API User – Edição de usuários e credenciais de acesso

### Obter informações dos usuários cadastrados para o controle de acesso e suas credenciais

Obter dados dos usuários cadastrados e suas credenciais (Face, Senha, Cartão RFID).

Requisição - GET:

```
http://10.0.0.213/api/user/get
```

Requisição - POST:

```
http://10.0.0.213/api/user/get

{
"target": "user",
"action": "get"
}
```

Exemplo de Retorno - JSON:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
        "num": 2,
        "item": [
             {
                   "FaceStatus": 1,
                   "Frequency": 0,
                   "ID": 338,
                   "Validity": 0,
                   "CardCode": "54C9200B",
                   "FaceID": "https://10.0.0.213/Image/RegisterImg/0.jpg",
                   "FaceUrl": "",
                   "LiftFloorNum": "101",
                   "Name": "Maria Joana da Silva",
                   "PrivatePIN": "54321",
                   "ScheduleRelay": "",
                   "UserID": "1",
                   "WebRelay": "0"
             },
             {
                   "FaceStatus": 1,
                   "Frequency": -1,
                   "ID": 339,
                   "Validity": 2,
                   "CardCode": "032CD844",
                   "FaceID": "https://10.0.0.213/Image/RegisterImg/1.jpg",
                   "FaceUrl": "",
                   "LiftFloorNum": "102",
                   "Name": "João Salezio da Silva",
                   "PrivatePIN": "333765",
                   "ScheduleRelay": "1-1;2-1;3-1",
                   "UserID": "2",
                   "WebRelay": "0"
             }
        ]
    }
}
```

| param         | type    | description                                                                                                                                                                                                                          |
| ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| FaceStatus    | Integer | indica se o usuário possui uma face cadastrada se igual a 1 indica que possui face cadastrada                                                                                                                                        |
| Frequency     | Integer | referente ao campo "Qtde de acessos" no cadastro do usuário, analisado apenas se validade setado como agenda, onde: o número colocado neste campo será a quantidade de vezes que este usuário poderá liberar o acesso no dispositivo |
| Validity      | Integer | referente ao campo "termo de validade" no cadastro do usuário onde: 0=Sempre / 1=Nunca / 2=Agenda                                                                                                                                    |
| CardCode      | String  | Código HEXA do cartão RFID                                                                                                                                                                                                           |
| FaceID        | String  | Caminho da imagem com a foto de cadastro da face do usuário                                                                                                                                                                          |
| FaceUrl       | String  | Campo reservado                                                                                                                                                                                                                      |
| LiftFloorNum  | String  | Utilizado para informar número do apartamento cadastrado                                                                                                                                                                             |
| Name          | String  | Nome de usuário                                                                                                                                                                                                                      |
| PrivatePIN    | String  | Senha do usuário usada para liberação do acesso                                                                                                                                                                                      |
| ScheduleRelay | String  | Referente ao campo agenda, que define quais as zonas de tempo o usuário possui acesso                                                                                                                                                |
| UserID        | String  | Campo de identificação do usuário, este campo é setado pelo administrador do sistema ao cadastrar um novo usuário                                                                                                                    |
| WebRelay      | String  | lista dos "web relés" disponíveis pra este usuário                                                                                                                                                                                   |
| ID            | Integer | Campo de identificação do usuário e gerado automaticamente pelo sistema, este campo não é editável                                                                                                                                   |

### Obter informações dos usuários cadastrados aplicando o filtro

Obter dados dos usuários cadastrados e suas credenciais (Face, Senha, Cartão RFID), com filtro pelo UserID pra trazer os dados apenas do usuário solicitado.

Requisição - POST:

```
http://10.0.0.213/api/user/get

{
    "target": "user",
    "action": "get",
    "data": {
        "item": [{"UserID":"2"}]
    }
}
```

Exemplo de Retorno - JSON:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
        "num": 1,
        "item": [
             {
                   "FaceStatus": 1,
                   "Frequency": 0,
                   "ID": 339,
                   "Validity": 0,
                   "CardCode": "032CD844",
                   "FaceID": "https://10.0.0.213/Image/RegisterImg/1.jpg",
                   "FaceImage": "data:image/jpeg;base64,/9j/4AA......buf//Z",
                   "FaceUrl": "",
                   "LiftFloorNum": "102",
                   "Name": "João Salezio da Silva",
                   "PrivatePIN": "333765",
                   "ScheduleRelay": "",
                   "UserID": "2",
                   "WebRelay": "0"
             }
        ]
    }
}
```

| param     | type   | description                                                                 |
| --------- | ------ | --------------------------------------------------------------------------- |
| FaceImage | String | Retorna a face cadastrada do usuário no formato jpeg convertido para base64 |

> Caso necessite buscar a face do usuário em base64 utilize sempre do comando `/api/user/get` aplicando o filtro pelo UserID conforme o exemplo acima.

### Cadastrar novos usuários no dispositivo

Adicionar novo usuário e cadastrar os dados, credenciais (Face, Senha, Cartão RFID) e permissões.

Requisição - POST:

```
http://10.0.0.213/api/user/add

{
    "target": "user",
    "action": "add",
    "data": {
        "item": [
             {
                   "UserID": "10",
                   "Name": "Mick Jagger",
                   "CardCode": "AAABBB",
                   "PrivatePIN": "655553",
                   "LiftFloorNum": "201",
                   "ScheduleRelay": "",
                   "Relay": "1",
                   "Frequency": 0,
                   "Validity": "0",
                   "WebRelay": "0",
                   "FaceUrl": "",
                   "FaceImage":"/9j/4A...............ooA//2Q=="
             }
        ]
    }
}
```

| param         | type   | description                                                                                                                                                                                                                                            |
| ------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| UserID        | String | Campo de identificação do usuário, este campo é setado pelo administrador do sistema ao cadastrar um novo usuário                                                                                                                                      |
| Name          | String | Nome de usuário                                                                                                                                                                                                                                        |
| CardCode      | String | Código HEXA do cartão RFID                                                                                                                                                                                                                             |
| PrivatePIN    | String | Senha do usuário usada para liberação do acesso                                                                                                                                                                                                        |
| LiftFloorNum  | String | Utilizado para informar número do apartamento do usuário                                                                                                                                                                                               |
| ScheduleRelay | String | Referente ao campo agenda, que define quais as zonas de tempo o usuário possui acesso, as agendas devem estar previamente criadas                                                                                                                      |
| Relay         | String | ID do relé a ser acionado pelo usuário sendo 1 para relé A presente no produto e 2 ou 3 para relés do XFE1000, é aceito a combinação de relés para serem executados ao mesmo tempo, exemplo para acionar os 3 relés simultaneamente use "Relay": "123" |
| Frequency     | String | referente ao campo "Qtde de acessos" no cadastro do usuário, analisado apenas se validade setado como agenda, onde: o número colocado neste campo será a quantidade de vezes que este usuário poderá liberar o acesso no dispositivo                   |
| Validity      | String | referente ao campo "termo de validade" no cadastro do usuário onde: 0=Sempre / 1=Nunca / 2=Agenda                                                                                                                                                      |
| WebRelay      | String | lista dos "web relés" disponíveis pra este usuário                                                                                                                                                                                                     |
| FaceUrl       | String | Campo reservado, enviar vazio - "FaceUrl": ""                                                                                                                                                                                                          |
| FaceImage     | String | Enviar a face do usuário no formato jpeg convertido em base64. Para maiores informações e dica de conversão base64 verifique este site <https://base64.guru/converter/encode/image/jpg>                                                                |

Exemplo de Retorno - JSON:

```
{
    "target": "user",
    "action": "add",
    "data": {
        "item": [
             {
                   "ID": "341",
                   "UserID": "10",
                   "Name": "Mick Jagger",
                   "CardCode": "AAABBB",
                   "PrivatePIN": "655553",
                   "LiftFloorNum": "201",
                   "ScheduleRelay": "",
                   "Relay": "1",
                   "Frequency": 0,
                   "Validity": "0",
                   "WebRelay": "0",
                   "FaceUrl": "",
                   "FaceImage":"/9j/4A...............ooA//2Q=="
             }
        ]
    }
}
```

> Para a edição de usuário é obrigatório o envio do campo ID, este campo é gerado pelo sistema e pode ser adquirido pelo `/api/user/get` conforme exemplos acima nesta página. Caso queira remover a face de um usuário envie o campo FaceImage com valor -1 exemplo: "FaceImage":"-1". Os demais parâmetros deste comando são similares ao mostrado na função `/api/user/add`.

### Editar dados de usuários no dispositivo

Editar dados no cadastro de usuários já criados.

Requisição - POST:

```
http://10.0.0.213/api/user/set

{
    "target": "user",
    "action": "set",
    "data": {
        "item": [{"UserID":"2"}]
    }
}
```

Exemplo de Retorno - JSON:

```
{
    "retcode": 0,
    "action": "set",
    "message": "OK",
    "data": {}
}
```

***

## QR Code – Integração

### Configurações de Credenciais de QR Code

O XPE 3200 Plus IP suporta a utilização do QR Code em modo criptografado.

#### Modo Criptografado

Este modo não expõe a credencial do usuário e utiliza um timestamp para validar o QR code, inibindo cópias e utilização de QR codes antigos. E deve ser utilizado na geração do QR Code por meio do seguinte algoritmo:

```
import base64
import time
import qrcode
from Crypto.Cipher import AES

class IntelbrasQREnc(object):
     def __init__(self, key):
           self.key = key.encode('utf-8')
           self.iv = int(0).to_bytes(16, byteorder='big')

     def encrypt(self, cardNrHexStr):
           # convert cardNr string to bytes (4 bytes)
           cardNrHex = int(cardNrHexStr,16).to_bytes(4, byteorder='big')
           # get the epoch unix time (4 bytes)
           timeEpochHex = (int(time.time())).to_bytes(4, byteorder='big')
           print("Used epochTime: ", int.from_bytes(timeEpochHex, byteorder='big', signed=True))
           # concatenate timeEpoch and CardNr
           toEnc = timeEpochHex + cardNrHex
           # create the cipher object
           cipher = AES.new(self.key, AES.MODE_OFB, self.iv)
           # Encrypt the data
           enc = cipher.encrypt(toEnc)
           # encode the encrypted data with base64
           base64enc = base64.b64encode(enc)
           # Concatenate prefix string
           return str(base64enc, 'utf-8')

# key must be 32 chars string with printable chars (utf-8)
key = '0123456789ABCDEF0123456789ABCDEF'
# Card number must be in string in Hex, maximum value "FFFFFFFF", 32bits
cardNr = "4401964D"
print("Encrypting:...")
print("CardNr to enc: ", cardNr)
# Create the IntelbrasQREnc object
QREnc = IntelbrasQREnc(key)
# Create the encrypted message from card
qrcodeStr = QREnc.encrypt(cardNr)
print("Encoded string: ", qrcodeStr)
print("\n")
# Generate qrcode image from crypted data
img = qrcode.make(qrcodeStr)
type(img)  # qrcode.image.pil.PilImage
img.save("qrcode.png")
```

#### Passos para utilização

1º - Cadastrar Chave de Segurança no Dispositivo (deve conter 32 caracteres)

2º - Cadastrar número cartão RFID do usuário no dispositivo (hexadecimal)

3º - Gerar QR code com hash do número do cartão e a senha de segurança (utilizando algoritmo em python).

#### Fluxograma de exemplo

* Usuário envia a Chave Criptográfica ao dispositivo (Exemplo: 6PNKDVQEU6YOULVYDDJW2SISEBNVUOPU) -> Cadastro do Dispositivo recebe a Chave
* Usuário inicia o cadastro de um QR Code -> Sistema gera um cartão randomico (exemplo: 4401964D)
* Sistema utiliza o algoritmo disponibilizado em Python para encriptar este cartão utilizando a mesma chave criptográfica cadastrada no dispositivo
* Sistema obtém um cartão encriptado (exemplo: yvnQ2kNKfGo=)
* Sistema gera um QR Code com base no cartão encriptado, utilizando um módulo do Python QR Code
* Usuário recebe o QR Code -> Preenche os dados do usuário que irá utilizar o QR Code para acesso

### Cadastrar Chave de Segurança

Por meio desta opção é realizado o cadastro da chave de segurança ao dispositivo que realizará a leitura do QRcode com criptografia.

Requisição - POST:

```
http://10.0.0.213/api/config/set

{
    "target": "config",
    "action": "set",
    "data": {
        "Config.DoorSetting.QRCodeDecode.Key": "0123456789ABCDEF0123456789ABCDEF"
    }
}
```

| param            | type   | description                                                                      |
| ---------------- | ------ | -------------------------------------------------------------------------------- |
| QRCodeDecode.Key | String | Chave de criptografia deve ser 32 chars string com caracteres printáveis (utf-8) |

> Obs: Esta chave deve ser gerada e única para cada cenário e não deve ser compartilhada.

Exemplo de Retorno - JSON:

```
{
    "retcode": 0,
    "action": "set",
    "message": "OK"
}
```

### Verificar chave de criptografia cadastrada no dispositivo

Por meio desta opção é realizado a leitura da chave QRcodeDecode cadastrada no dispositivo.

Requisição - POST:

```
http://10.0.0.213/api/config/get

{
    "target": "config",
    "action": "get",
    "data": {
        "item": [
           "Config.DoorSetting.QRCodeDecode.Key"
        ]
    }
}
```

Exemplo de Retorno - JSON:

```
{
    "retcode": 0,
    "action": "get",
    "message": "OK",
    "data": {
        "Config.DoorSetting.QRCodeDecode.Key": "0123456789ABCDEF0123456789ABCDEF"
    }
}
```


---

# 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/xpe-3200-plus-ip/xpe-3200-plus-ip.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.
