# Griaule Biometric Suite

![gbs logo](/files/uniRCdYJulPvu5K2SJE5)

## Introdução

O **Griaule Biometric Suite**, ou GBS, é a solução biométrica completa da Griaule.

O GBS é um ABIS que possui ferramentas para [captura biométrica multimodal](#bcc), [avaliação de qualidade](#mir), [tratamento de exceções](#etr), [digitalização de fichas](#cardscan) e [gestão de casos criminais](#best). Ele é tecnologicamente escalável para qualquer tamanho de base de dados, bastando adicionar nós suficientes ao cluster do servidor.

O Griaule Biometric Suite é totalmente capaz de lidar com impressões digitais, impressões latentes, impressões palmares, íris, faces e impressões palmares de recém-nascidos.

![modalidades biométricas do gbs](/files/29yQySNVKoXXo1PDWjw2)

O GBS isola por design o que é executado no lado do cliente e o que é executado no lado do servidor. As aplicações cliente apenas realizam a coleta de dados e um processamento básico. No lado do servidor, são realizados o armazenamento permanente e as comparações biométricas.

## GBDS

O GBDS, sigla de **Griaule Biometric Database Server**, é o principal componente no lado do servidor. Ele é o sistema de banco de dados biométrico distribuído construído sobre a arquitetura do Hadoop. Os outros componentes atuam como clientes do GBDS.

O GBDS implementa uma arquitetura de microsserviços e inclui serviços para autenticação, notificação, migração, subsistemas para as aplicações do cliente e as rotinas do ABIS, como extração de templates e comparação biométrica. O GBDS também inclui os componentes do Hadoop, o banco de dados relacional interno e o gateway da API.

A base de dados é distribuída por todos os nós do cluster com redundância tripla, evitando gargalos de acesso e minimizando o risco de perda de dados em caso de falhas de hardware.

## Aplicações Cliente

### BCC

![logotipo do BCC](/files/dS6rgccRYA6v0PFEEWju)

O BCC, ou **Biometric Capture Component**, é uma aplicação de cadastro biométrico. Ele foi projetado para o cadastro de perfis civis e de recém-nascidos com dados biográficos e biométricos, como impressões digitais, face, impressões palmares e íris.

O BCC pode ser usado para coletar dados e criar perfis padronizados para cadastro biométrico. O BCC realiza uma verificação de qualidade nos dados para garantir que apenas dados de alta qualidade sejam enviados para o servidor. Esses dados são armazenados no [GBDS](#gbds) e podem ser usados em operações de identificação e verificação. Como parte do Griaule Biometric Suite, o processo de cadastro também checa os novos registros quanto a problemas biométricos (como baixa qualidade, duplicatas, não correspondência com o controle de sequência) e possíveis fraudes (biometria duplicada entre perfis de pessoas diferentes).

![](/files/d39LCPpPfregf4IUq6BF) ![](/files/maKKVftkwrYwPHKfIxtz)

Para mais informações, consulte o manual do produto [clicando aqui](/aplicacoes/bccweb).

#### BCC Mobile

O **BCC Mobile** é um conjunto de bibliotecas para cadastro biométrico com smartphones. É usado para capturar faces e impressões digitais. Para faces, oferece detecção de vivacidade integrada, para melhorar a segurança e confiabilidade.

### CardScan

![logotipo do CardScan](/files/jSgLoh4E1wYUCQArRguz)

O **CardScan** é uma aplicação para escanear fichas de papel contendo dados biométricos, como impressões digitais, impressões palmares, faces e assinaturas.

O CardScan extrai os dados biográficos textuais dos cartões usando reconhecimento óptico de caracteres (OCR), segmenta as biometrias e realiza a operação de cadastro no banco de dados biométrico do GBS ([GBDS](#gbds)). É possível personalizar totalmente os campos de extração, permitindo operações com qualquer layout de cartão decadactilar.

![](/files/oMabBl2TnlLGTTS6q57g) ![](/files/c7RPx3O6hJo69bBV46Ao)

Para mais informações, consulte o manual do produto [clicando aqui](/aplicacoes/cardscanweb).

### Trust

<figure><img src="/files/adxebJeyaQfrApW7UJCj" alt=""><figcaption></figcaption></figure>

O Trust é uma ferramenta de combate a fraudes de identidade. Sempre que uma transação de cadastro ou atualização gera uma inconformidade, seja devido à duplicação ou à falta de correspondência biométrica, um operador precisa analisar e tratá-la. O Trust permite o tratamento e o combate de fraudes, dando ao usuário o poder de decisão sobre qual perfil deve ser mantido ou rejeitado.

<div><figure><img src="/files/nU5HkoIXpLSYr0mFoF73" alt=""><figcaption></figcaption></figure> <figure><img src="/files/XZLwO5qZXHmJ4fxYb8Kd" alt=""><figcaption></figcaption></figure></div>

Para mais informações, consulte o manual do produto [clicando aqui](/aplicacoes/trust).

### MIR

![logotipo do MIR](/files/kUq8TUaU8scDoNGl1gTn)

O MIR, ou **Manual Image Review**, é uma ferramenta para tratar transações de cadastro biométrico que exigem revisão manual devido a problemas de qualidade.

Essa etapa é necessária quando a qualidade biometrias capturadas não atende a requisitos mínimos, quando há dedos duplicados ou quando uma impressão digital não corresponde com seu par do controle de sequência.

Quando um registro é recusado devido à baixa qualidade das biometrias, um operador precisa revisar manualmente os dados no MIR e optar por aceitar, editar ou recusar. Um cenário comum é receber registros com dedos duplicados, ou seja, o mesmo dedo em duas posições distintas.

Nos cadastros com controle de sequência e captura conjunta de vários dedos, o revisor pode recortar a impressão digital correta do controle de sequência e colocá-la no campo individual onde a captura foi feita incorretamente.

Com o MIR, o operador pode lidar facilmente com problemas de qualidade de imagem antes de reenviar o perfil para cadastro, melhorando a qualidade da base de dados biométrica.

![](/files/w2WkPegLd1T5QzSeSNsY) ![](/files/AvcGkuhcDjFUpHHvWIbP)

Para mais informações, consulte o manual do produto [clicando aqui](/aplicacoes/mirweb).

### BEST

![logotipo do BEST](/files/39Nx6DqM51EWspmP6tvs)

O BEST, ou **Biometric Expert Software Tool**, é uma aplicação completa para investigação forense e gerenciamento de casos. O BEST oferece ferramentas para melhoria da qualidade de imagens de evidências, comparação e identificação automatizada de biometrias em uma interface limpa e intuitiva.

O BEST oferece diversos filtros para tratamento de imagens de impressões latentes, ferramentas para marcação manual de minúcias, permite buscas biométricas de diversas modalidades e organiza o trabalho do operador em estruturas comuns da prática forense, como agrupar os dados em casos, fragmentos e listas de suspeitos.

Com o BEST, o operador pode criar um caso, adicionar imagens de biometrias latentes, tratar essas imagens para melhorar sua qualidade e realizar buscas na base de dados biométrica em apenas alguns minutos.

![](/files/70JRlkTFe5rfTCqIg2aR) ![](/files/9CjhOUD1jgq7ROdXjhNZ)

Para mais informações, consulte o manual do produto [clicando aqui](/aplicacoes/bestweb).

### Intelligence

![logotipo do Intelligence](/files/Pmlqt45RA3W2A2axm5ca)

O **Intelligence** é uma aplicação que realiza buscas textuais na base de dados do GBDS, buscando valores em identificadores (PGUID, TGUID), chaves, campos biográficos e campos de label.

![](/files/V7Rg0W1z3EM5lUA6cmIO) ![](/files/CYeInQKjvl3ua6A7Y2ZL)

Para mais informações, consulte o manual do produto [clicando aqui](/aplicacoes/intelligenceweb).

### SmartSense

![logotipo do SmartSense](/files/38RzDo8cXvdyYgtKBJ6O)

O **SmartSense** é uma aplicação para monitorar clusters GBDS, permitindo que o usuário visualize relatórios ao vivo sobre a saúde e o desempenho do ambiente.

![](/files/UJ9vi8U9yvDsF69zeelu) ![](/files/xdusvq3wiR1Rxd7GW0aP)

Para mais informações, consulte o manual do produto [clicando aqui](/aplicacoes/smartsense).

### Control Panel

O **Control Panel** é uma aplicação desenvolvida para alterar facilmente as configurações do GBDS. O Control Panel fornece uma interface gráfica em que o usuário pode controlar os valores dos parâmetros e comparar valores entre diferentes arquivos de configuração.

![](/files/CC5MtIHGrhGhySqNEtbx) ![](/files/u6NzLHgX3kRSGNBqXR0U)

Para mais informações, consulte o manual do produto [clicando aqui](/aplicacoes/controlpanelweb).

### Print

![](/files/ZnkgcCJzrxkCThWSCu1T)

O **GBS Print** é uma aplicação web para gerenciar e imprimir documentos de identidade. Ele recebe documentos a serem impressos e os agrupa em lotes. Os lotes são então impressos, digitalizados e inspecionados para garantir que os documentos foram impressos corretamente. Em seguida, ele verifica os documento e os vincula ao código tipográfico único (código de barras) presente na lâmina de documento recebida da gráfica. Finalmente, os lotes de documentos verificados são agrupados em malotes e enviados para os postos para distribuição. O GBS Print também permite ao usuário configurar as impressoras usadas para imprimir os documentos e gerar relatórios sobre os documentos processados.

![](/files/Hn4xCZtmbZKQyEnhYhc9) ![](/files/bSwI3s764c3SFqy5oBud)

Para mais informações, consulte o manual do produto [clicando aqui](/aplicacoes/print).

### SMART

![](/files/eJ9hRcwxtWpnPvbhBZAG)

O **GBS SMART** é uma aplicação web para a coleta de dados biográficos e biométricos para emissão de carteiras de identidade, carteiras funcionais ou identificação criminal.

![](/files/NdUgEaiigKRbLRIzHhJX) ![](/files/icoCJUPzXXXRMS0Vi4rx)

Para mais informações, consulte o manual do produto [clicando aqui](/aplicacoes/smart).

### Home Screen

O **GBS Home Screen** é uma aplicação web que disponibiliza uma interface com atalhos para acessar todas a Griaule Biometric Suite (GBS) utilizando um login único. Ao se autenticar, o usuário tem acesso a todas as aplicações disponíveis para ele, sem a necessidade de fazer login individualmente em cada aplicação.

![](/files/w8MbFOJwi5KZa2GCcIfd)

Para mais informações, consulte o manual do produto [clicando aqui](/aplicacoes/homescreen).


# Conceitos de Biometria

## Introdução

Historicamente, o termo biometria está relacionado às Ciências Biológicas e refere-se à aplicação de métodos estatísticos a uma vasta gama de características mensuráveis na biologia. Atualmente, é mais comumente usado em Tecnologia da Informação, consistindo de identificação eletrônica de seres humanos baseado em suas características físicas e comportamentais.

## Digitais

Impressões digitais são consideradas uma das características mais confiáveis para reconhecimento humano devido a sua individualidade e persistência. Uma impressão digital consiste de padrões de cristas e vales na superfície do dedo e sua formação ocorre nos primeiros meses de desenvolvimento do feto. Sua principal desvantagem é sua intrusividade, pois as pessoas precisam cooperar explicitamente para fornecer suas impressões digitais para um sistema biométrico. Além do mais, autenticação baseada em impressão digital está tradicionalmente associada a procedimentos criminais. O estado da arte dos métodos de autenticação baseasa em impressões digitais demonstra ter precisão e confiabilidade adequadas.

### Minúcias

Uma impressão digital é caracterizada pelo padrão de intervalos de cristas (linhas escuras) e vales (linhas claras). Geralmente, cristas e vales correm em paralelo e algumas vezes acabam ou bifurcam. Em um nível global, as impressões digitais podem apresentar regiões com padrões de curvatura peculiar, chamados de singularidade. Em nível local, há uma outra característica importante chamada **minúcia** que pode ser encontrada nos padrões de impressão digital. Minúcia deriva do Latim "pequenos detalhes" (minutiae), e isso refere-se a um comportamento de descontinuidade dos cristas, como terminações, bifurcações, trifurcações ou outras características como poros (pequenos buracos dentro das cristas), lagos (duas bifurcações fechadas), pontos (pequenas cristas), etc. A maioria dos sistemas usa somente bifurcações e terminações. Para comparar (casar) propriamente impressões digitais, as características das impressões, tais como minúcias e pontos de singularidades, devem ser extraídos. Também é possível extrair outras informações globais tal como orientação e frequência das regiões de crista da impressão digital. As imagens abaixo mostram uma impressão digital capturada por um scanner de impressões digitais e as características extraídas correspondentes: cristas (linhas negras finas) e minúcias (flechas azuis para terminações e flechas vermelhas para bifurcações).

![](/files/0nIjmHQErWj2zoLLTxOg) ![](/files/PDyat2gTjNHZ7kHWSDLv)

O processo de interpretação dessas características de imagens digitalizadas é chamado de **extração**. Isso envolve algoritmos avançados de processamento de sinal e leva consideravelmente mais tempo que comparar as características de duas impressões digitais. Portanto, sistemas biométricos tentam realizar essa extração somente uma vez e armazenam as características extraídas em um conjunto de dados chamado **template** de impressão digital.

### Templates de Impressão Digital

As características extraídas de impressões digitais (minúcias, cristas, singularidades) são armazenadas em um arquivo de template. Esses podem ser armazenados em uma grande variedades de formatos padrões e proprietários. Formatos padronizados em geral incluem apenas um conjunto mínimo de informações, úteis para a troca de templates de impressão digital entre sistemas biométricos distintos.

Formatos proprietários de template de impressão digital incluem propriedades pré-computadas do conjunto de minúcias que são específicos para cada fabricante de sistema ABIS, permitindo coincidências mais rápidas e com maior precisão.

{% hint style="info" %}
ABIS é um acrônimo para Automated Biometric Identification System (Sistema Automatizado de Identificação Biométrica)
{% endhint %}

#### ISO

O ISO (International Organization for Standardization) e IEC (International Electrotechnical Commission) publicaram em 2015 a família de padrões ISO/IEC 19794, que é comumente aplicada a formatos de dados biométricos, padronizando conteúdos comuns, significados e representações de formatos de dados biométricos e modalidades biométricas, além de especificar quais requisitos resolvem as complexidades da aplicação da biometria a uma ampla variedade de aplicações de reconhecimento de pessoas, quer essas aplicações operem em um ambiente de sistemas abertos ou consistam em um único sistema fechado.

O padrão ISO/IEC 19794-2 especifica os formatos de dados para representação de impressões digitais usando a notação de minúcias, definindo três modelos de formatos para a troca e armazenamento de dados de minúcias de impressões digitais. Ele define um formato baseado em registros, um normal e um compacto para o uso de cartões inteligentes. Também define um formato estendido que pode lidar com contagem de cristas adicionais e localização de núcleos e deltas.

As soluções da suíte biométrica da **Griaule** estão em conformidade com as principais normas e certificações internacionais relacionadas à biometria. Entre elas, destacam-se:

* **ISO/IEC 19784** – Estrutura para interfaces de programação de aplicação de biometria (BioAPI).
* **ISO/IEC 19785** – Estrutura para intercâmbio de informações biométricas (CBEFF).
* **ISO/IEC 19794** – Formatos de dados biométricos para imagens faciais.

Essa aderência assegura que os produtos da Griaule atendem a requisitos internacionais de interoperabilidade, qualidade e segurança no processamento e armazenamento de dados biométricos.

#### ANSI

Imagens de impressões digitais têm sido amplamente utilizadas por agências e polícias ao redor do mundo para identificação criminal. A introdução do Sistema Automatizado de Identificação de Impressões Digitais (AFIS, do inglês *Automatic Fingerprint Identification Systems*) dessas agências criou uma demanda por formatos padrões para interoperabilidade e troca de informação entre subsistemas de AFIS geograficamente dispersos.

O padrão ANSI 378/2004 especifica os formatos de dados para a representação de impressões digitais usando a noção fundamental de minúcias. O formato de dado é genérico, e pode ser aplicado e usado em uma grande variedade de áreas de aplicações onde o reconhecimento automático de impressões digitais está envolvido. Nenhum requerimento específico de aplicação ou de características é endereçado nesse padrão. O padrão contém definições de termos relevantes, uma descrição de as minúcias devem ser definidas, um formato de dados para representar os dados de impressão digital e dados de conformidade.

A suíte biométrica da **Griaule** foi projetada para operar em conformidade com os padrões estabelecidos pelo **American National Standards Institute (ANSI)** e pelo **National Institute of Standards and Technology (NIST)**. Entre eles, destacam-se:

* **ANSI/INCITS 398** – Define os requisitos para intercâmbio de dados de imagens faciais.
* **ANSI/INCITS 385** – Estabelece o formato de intercâmbio de dados de imagens de íris.
* **ANSI/NIST-ITL** (incluindo suas atualizações) – Regulamenta a estrutura de troca de dados biométricos em contextos civis, criminais e forenses.
* **ANSI/INCITS 381** – Define o formato de intercâmbio de dados de imagens de impressão digital.
* **ANSI/INCITS 378** – Estabelece o padrão para representação e intercâmbio de templates de minúcias de impressões digitais.

O atendimento a esses padrões garante que as soluções da Griaule estejam preparadas para **integração em ambientes complexos**, oferecendo compatibilidade com sistemas já consolidados e assegurando conformidade com as práticas adotadas por agências governamentais e instituições internacionais

#### Consolidação de Templates

Duas capturas de um mesmo dedo dificilmente serão idênticas, apresentando pequenas variações no posicionamento das minúcias e na qualidade. Algumas minúcias também podem aparecer ou desaparecer devido a pequenas mudanças no posicionamento do dedo sobre o sensor em cada captura.

Para aumentar a qualidade do modelo, pode-se realizar uma captura rolada, mas este tipo de captura não é suportada por todos os equipamentos de digitalização, e pode apresentar suas próprias dificuldades devido ao movimento de rolagem que o dedo necessita realizar. Nesses casos, pode-se realizar várias capturas e combiná-las para identificar minúcias das impressões digitais gerando um modelo de maior qualidade.

O processo de obtenção de múltiplas capturas e combinação dos modelos extraídos em um é chamado de **consolidação de templates**. Esse método proporciona várias vantagens: Ele é capaz de aumentar a qualidade geral das minúcias; Pode descartar falsas minúcias incorretamente detectadas devido a problemas na qualidade de captura; É capaz de combinar minúcias achadas por capturas seguintes, gerando modelos mais ricos.

### Digitalização de Impressões Digitais

#### Métodos de Captura

Há essencialmente 4 métodos de captura diferentes pada imagens de impressão digital:

{% stepper %}
{% step %}

#### Digitalização de impressões digitais em papel/tinta

Geralmente exigido ao importar registros legados para um sistema biométrico digital. Impressões feitas no papel são digitalizadas com um scanner de mesa, com uma resolução variando de 500 a 1000 dpi.

{% hint style="info" %}
GBS Cardscan Web é o componente do Griaule Biometric Suite projetado para a digitalização de imagens de impressões digitais em tinta e para cadastrar elas no Griaule Biometric Database Server.
{% endhint %}
{% endstep %}

{% step %}

#### Captura digital plana

O dedo do usuário é pressionado contra um digitalizador de impressões digitais, que produz uma imagem digital da área do dedo que está em contato com o equipamento. A maioria dos digitalizadores produzem imagens de 500 dpi. Alguns equipamentos de alta qualidade fornecem imagens com 1000 dpi. Enquanto capturas planas são mais rápidas, a área capturada do dedo é limitada, visto que não é possível posicionar toda a extensão do dedo sobre o sensor.
{% endstep %}

{% step %}

#### Captura digital rolada

O usuário rola o dedo sobre o digitalizador de impressões digitais, o que produz uma imagem digital com a área do dedo exposta no sensor. A resolução típica é também de 500 dpi e equipamentos de alta qualidade fornecem imagens de 1000 dpi. Capturas roladas requerem movimentos suaves do indivíduo, o que leva um tempo maior e pode requerer mais de uma tentativa se o indivíduo rolar o dedo muito rápido ou de forma brusca. Impressões digitais roladas contém mais distorções espaciais que impressões digitais planas, devido à deformação da pele durante o processo de captura, mas capturam uma área maior de impressão digital, e isso permite que sistemas biométricos comparem as impressões digitais com maior acurácia.
{% endstep %}

{% step %}

#### Capturas ao vivo sem contato

Esse é um digitalizador experimental de impressões digitais que tenta capturar a imagem da digital com uma câmera fotográfica modificada, sem necessitar que o sujeito toque o sensor. Enquanto menos intrusivo, esses digitalizadores não garantem uma resolução exata (varia de acordo com a distância do dedo com o sensor), introduzem artefatos de luz e podem ser suscetíveis a ataques de falsificação (*spoofing*), tal como apresentar uma foto de um dedo ao sensor em vez de um dedo real.
{% endstep %}
{% endstepper %}

#### Resolução

A resolução é a densidade de pixels por área, geralmente medida como pontos por polegada (dpi, do inglês *dots per inch*). Quanto maior a resolução do sensor, mais rica em detalhes é a imagem capturada, favorecendo templates de melhor qualidade.

Para imagens de impressões digitais, a resolução comumente exigida por autoridades de segurança é de 500 dpi. Isso significa que o dispositivo com um sensor de 1x1 polegada irá produzir uma imagem de aproximadamente 250000 pixels (500x500 pixels).

Note que dimensão da imagem e resolução da imagem são medidas distintas: Um equipamento com sensor de 2x2 polegadas e uma resolução de 500 dpi irá produzir imagens de dimensão 1000x1000, mas a resolução ainda será 500 dpi. Tanto a área do sensor quanto a resolução são importantes para garantir a qualidade das características das impressões digitais extraídas.

#### Qualidade de Imagem

Se a imagem da impressão digital estiver ruidosa, borrada, ou apresentar artefatos de compressão, o extrator de templates pode não ser capaz de reconhecer corretamente as características da impressão digital. Por exemplo: duas cristas podem acabar ficando conectadas devido a um borrão na imagem, impedindo a detecção de uma minúcia de terminação.

Para mitigar as partículas de poeira depositadas no sensor, alguns leitores fornecem uma tecnologia de redução de ruído embutida. Apesar disso, para aumentar a qualidade da imagem é sempre importante manter limpa a superfície de captura do dispositivo e seguir as boas práticas de captura de impressões digitais.

Para padronizar a avaliação de qualidade de imagem de impressão digital, o NIST (National Institute of Standards and Technology), publicou o NFIQ em 2015. O NFIQ é uma medida padronizada de qualidade de imagem de impressão digital, projetada para predizer a performance de sistemas de batimento de impressões digitais baseado em minúcias. O NFIQ classifica a qualidade de impressões digitais em 5 classes: NFIQ 1 (maior qualidade possível) até a NFIQ 5 (menor qualidade possível).

#### Codificação de Imagem

Em muitos sistemas biométricos é desejável armazenar as imagens para fins de longo prazo, como re-extrair templates com extratores mais modernos, ou para propósitos forenses e de deduplicação.

Devido à grande quantidade de imagens que um ABIS geralmente armazena, e a qualidade exigida pelos extratores de template para realizar uma extração de maneira eficiente, os algoritmos de compressão com perda tradicionais não são adequados para a codificação de imagens de impressões digitais, já que a compressão produz artefatos que podem atrapalhar a extração de templates. No lado oposto, algoritmos de compressão de imagem sem perdas geram arquivos muito grandes, aumentando os requisitos de armazenamento.

Para compressão sem perdas o formato mais comum para para impressões digitais é o PNG (Portable Network Graphics).

Para as necessidades específicas de um ABIS foi desenvolvido o formato Wavelet Scalar Quantization, descrito a seguir.

**Wavelet Scalar Quantization (WSQ):**

O formato Wavelet Scalar Quantization foi desenvolvido pelo FBI especificamente para comprimir imagens de impressões digitais, reduzindo o tamanho do arquivo comprimido sem perda de detalhes, especialmente quando comparado com algorítimos já estabelecidos tal como JPEG/JFIF.

O formato WSQ é baseado na teoria de wavelet, e foi projetada para comprimir imagens de impressão digital em escala de cinza a 500 DPI. Imagens com resoluções maiores são melhor comprimidas com o formato JPEG2000.

Os algoritmos de compressão **WSQ, PNG e JPEG2000** utilizados pela Griaule são certificados pelo **FBI**, garantindo interoperabilidade, qualidade e confiabilidade em aplicações civis, criminais e forenses.

### Batimento de Digitais

O objetivo da extração dos templates é realizar a comparação (ou batimento) de impressões digitais. Casamento ou batimento (Matching) é o processo de comparação de dois templates que produz uma medida quantitativa de semelhança entre eles. Em um sistema biométrico funcional, pares **genuínos** (templates extraídos de capturas do mesmo dedo) produzirão altos scores de similaridade, enquanto pares de **impostores** (templates extraídos de capturas de dedos diferentes) produzirão baixos scores de similaridade.

Uma vez que dois templates dificilmente são idênticos, mesmo se obtidos a partir de capturas sequenciais do mesmo dedo, as impressões digitais correspondentes devem levar em conta as mudanças no posicionamento de minúcias e minúcias que não existem nos dois modelos.

#### Pontuação e Limiar

Um algoritmo de batimento possui dois passos. No primeiro, um Algoritmo de Avaliação atribui uma pontuação de similaridade para a comparação. O segundo passo decide se o par é genuíno ou impostor usando o limiar de decisão. Se a pontuação for maior que o limiar, o algoritmo decide que é uma comparação genuína; de outra forma, é classificado como um par impostor. O limiar de decisão é um parâmetro configurável de qualquer sistema de biometria.

Aumentar o limiar aumentará a ocorrência de erros de falso negativo (pares genuínos identificados como impostores) e diminuir os erros de falso positivo (pares impostores identificados como genuínos); diminuir o limiar reduzirá os erros de falso negativo e aumentará os erros de falso positivo.

Ao escolher o limiar de decisão para uma aplicação o usuário deve levar em consideração a aceitabilidade de erros de falso negativo e falso positivo, e o tamanho da base de templates.

## Reconhecimento Facial

O reconhecimento facial é um dos métodos mais amigáveis e menos intrusivos entre as modalidades biométricas. A captura de dados é simples e os dispositivos de captura são câmeras digitais comuns e baratas.

Para um sistema biométrico, o reconhecimento facial envolve três tarefas:

> * Detectar e delimitar as faces presentes em uma imagem.
> * Extrair um vetor de características de uma face, e codificá-lo para armazenar como um **template**.
> * Batimento: Comparar dois template de face e calcular um score de similaridade.

Algoritmos modernos de reconhecimento facial são baseados em redes neurais profundas, uma técnica de inteligência artificial onde o algoritmo escolhe as melhores características discriminantes entre as faces baseado em um grande conjunto de dados de treinamento. Dado que as características podem mudar conforme os conjuntos de dados de treinamento são continuamente atualizados, não há um formato padrão para templates faciais. Sistemas biométricos geralmente mantêm a imagem original armazenada, para que templates melhorados possam ser extraídos à medida em que o conjunto de dados melhora com o passar do tempo.

## Reconhecimento de Íris

Os padrões de íris são formados durante o desenvolvimento fetal e continuam se desenvolvendo pelos primeiros dois anos de vida. Biometria de íris se beneficia do fato que os padrões de íris são únicos para cada indivíduo, e não mudam depois do desenvolvimento inicial. Diferente de impressões digitais dos dedos, que são suscetíveis a alterações por queimaduras, cortes, abrasões e reações químicas, os padrões de íris são muito improváveis de serem modificados, intencionalmente ou não. A captura de íris requer cooperação do indivíduo, que precisa manter os olhos abertos e imóveis enquanto a captura é realizada. A captura de íris é realizada com scanners especializados com luz próxima ao infravermelho (NIR, Near InfraRed em inglês) e sensores sensíveis à luz próxima ao infravermelho. A imagem abaixo é um exemplo típico de íris capturada por sensor biométrico.

![](/files/Fm42P1LqVTlfjjjeYZr6)

Ainda que sensores de captura de íris estejam se tornando baratos à medida em que são integrados em dispositivos eletrônicos pessoais como smartphones, eles ainda são mais caros que as câmeras normais usadas para reconhecimento facial.

Para um sistema biométrico, o reconhecimento de íris envolve 3 tarefas:

> * Detectar e delimitar a pupila, a íris e detectar a oclusão de pálpebras ou cílios.
> * Extrair características espectrais das regiões da íris e codificá-las para armazenar em um **template**.
> * Batimento: Comparar dois templates de íris e calcular a pontuação de similaridade.

## Taxas de Erro

Um aspecto importante de um sistema biométrico é sua precisão. Do ponto de vista do usuário, um erro de precisão ocorre quando o sistema não consegue reconhecer a identidade de uma pessoa registrada ou quando o sistema reconhece erroneamente a identidade de um intruso.

Existem basicamente três fontes que aumentam a taxa de erro em um sistema:

{% stepper %}
{% step %}

#### Fator Humano

Captura de informações biométricas sempre requerem participação humana em diferentes níveis. Para captura de impressões digitais, os dedos devem estar em contato com a superfície do sensor; em captura de imagens de íris, os olhos devem estar olhando para um ponto fixo da câmera digital. Mesmo para capturas faciais, sendo provavelmente a captura biométrica menos invasiva, uma boa captura exige algumas restrições no posicionamento da face. Como consequência, o comportamento humano no momento da captura biométrica é um fator crítico para etapas de processamento e a acurácia do reconhecimento. Uma captura inadequada provoca uma extração deficiente de características biométricas ou até impede a extração. Um ponto crítico para avaliação de sistemas biométricos é treinar pessoas em boas práticas de captura de registros biométricos.
{% endstep %}

{% step %}

#### Sensores Biométricos

Condições ambientais e propriedades tecnológicas do equipamento afetam a qualidade dos registros biométricos capturados. Além disso, cada tecnologia captura biométrica tem vantagens e desvantagens.
{% endstep %}

{% step %}

#### Imprecisão na comparação biométrica

Mesmo quando os dados biométricos são capturados corretamente e com boa qualidade, os algoritmos de batimento não são perfeitos e podem gerar scores de similaridade baixos para pares genuínos e scores de similaridade altos para pares impostores.
{% endstep %}
{% endstepper %}

### Tipos de Erro

* Erros de Falso Positivo ocorrem quando um sistema biométrico classifica um par impostor como genuíno.
* Erros de Falso Negativo ocorrem quando um sistema biométrico classifica um par genuíno como impostor.


# Avaliação de Qualidade Biométrica

Esse manual tem como função descrever os parâmetros considerados para avaliação da qualidade de uma extração biométrica.

A avaliação de qualidade é feita durante o processo de extração de um template. Este processo tem em vista definir quais são as melhores imagens a serem usadas em procedimentos de comparação biométrica.

Cada modalidade biométrica possui seus diversos critérios de avaliação. Abaixo, serão abordados os critérios para avaliação de imagens de face e de impressões digitais.

## Avaliação de Impressões Digitais

A lista de parâmetros avaliados para uma imagem de impressão digital é a seguinte:

> * Tamanho da imagem;
> * Número de minúcias;
> * Número de minúcias de alta confiabilidade;
> * Número de minúcias acima da dobra interfalangeana;
> * Contraste;
> * Orientação do dedo;
> * Perda de seção da impressão digital (corte de borda do leitor);
> * Área do dedo;
> * Extensão do dedo;
> * Valor pelo padrão NFIQ.

## Avaliação de Imagens de Faces

A lista de parâmetros avaliados para uma imagem de face é a seguinte:

> * Tamanho;
> * Quantidade de faces detectadas na imagem;
> * Posição dos olhos;
> * Correspondência do formato da face com o padrão ICAO;
> * Uniformidade do fundo;
> * Nitidez da imagem;
> * Nível de cinza;
> * Orientação da face;
> * Rotação da face;
> * Boca aberta ou sorriso;
> * Obstruções na face;
> * Cor de fundo.


# Arquitetura do GBDS

## Visão Geral

GBDS é o componente ABIS do Griaule Biometric Suite. O GBDS é implementado sobre a plataforma *Apache Hadoop 3* e usa diversas de suas ferramentas e componentes (tais como Kafka, Zookeeper, Ambari, HBase e HDFS) para implementar um ABIS (Sistema Automatizado de Identificação Biométrica) escalável, distribuído e tolerante a falhas.

O GBDS é responsável por:

* **Armazenamento**: Persistência de registros biométricos, solicitações de clientes e suas respostas, resultados de transações e logs em uma base de dados escalável, distribuída e tolerante a falhas.
* **Extração**: Processamento de dados crus (imagens) de capturas biométricas para geração de templates que serão usados para batimentos biométricos.
* **Batimento**: Execução eficiente de comparação de templates biométricos com distribuição de carga entre diversos servidores (nós).
* **Processamento de Solicitações**: O GBDS recebe solicitações de clientes, gerencia sua execução entre os nós do sistema e os notifica os clientes assincronamente quando as respostas se tornam disponíveis. Solicitações são realizadas através de APIs HTTP/HTTPS. O GBDS implementa um terminal (endpoint) de alta disponibilidade e alto fluxo (High Availability, High Throughput) para solicitações de clientes.

Este documento descreve a arquitetura do GBDS.

## Componentes Hadoop

O Apache Hadoop 3 é uma coleção de ferramentas e componentes de código aberto para o desenvolvimento de sistemas distribuídos. Hadoop é baseado em Java, uma tecnologia presente mais de 13 bilhões de dispositivos. O desenvolvimento do Hadoop começou em 2006, e logo tornou-se o padrão *de facto* para sistemas distribuídos tolerantes a falha com alta disponibilidade. Em 2013, Hadoop já era usado em mais de metade das empresas Fortune 50.

O GBDS usa diversas ferramentas e componentes do ecossistema Hadoop 3:

* **HDFS** é um sistema de arquivos distribuído, escalável e portável. O HDFS provê distribuição transparente de dados entre nós de armazenamento e armazenamento eficiente de arquivos grandes e grandes coleções de arquivos.
* **HBase** é um banco de dados distribuído não-relacional, construído sobre o sistema de arquivos HDFS.
* **Zookeeper** é um repositório distribuído de pares chave-valor, e é usado pelo GBDS como um gerenciador de consenso.
* **Kafka** é uma plataforma de processamento distribuído de filas de tarefas. As filas gerenciadas pelo Kfka são chamadas **tópicos** (topics), que têm conteúdo enfileirado por **produtores** e processado por **consumidores**. Kafka distribui cargas de trabalho de tópicos eficientemente entre os nós disponíveis.
* **Ambari** é uma ferramenta de monitoração e gerenciamento para clusters Hadoop. Administradores do GBDS interagem e gerenciam seus clusters através do Ambari.

## Nós

Um cluster GBDS é composto por nós, e cada nó executa os mesmos componentes: HBase, Zookeeper, Ambari, Kafka e o Subsistema de nós do GBDS. Todos os nós podem receber requisições de aplicações-cliente externas, e todos os nós podem enviar notificações assíncronas para aplicações-cliente externas.

O diagrama abaixo mostra a estrutura geral de um cluster GBDS, que é uma coleção de nós GBDS:

![](/files/iJuomnle0q21Isks780X)

O GBDS usa dois bancos de dados distintos: MYSQL e HBase. Templates biométricos são armazenados no HBase, e dados são distribuídos em subconjuntos chamados *regiões*. Cada nó é responsável por pelo menos uma região. Dados biométricos são distribuídos em regiões de forma transparente pelo HBase, baseado na capacidade do hardware de cada nó.

O banco de dados MySQL armazena informações de metadados de transações, exceções biométricas, casos criminais, perfis biográficos cadastrados e latentes não resolvidas. A base SQL armazena metadados que referenciam o registro HBase, que por sua vez armazena os dados exigidos para processamento, como imagens e templates.

Um nó atua como *Nó Líder*. Este nó inicializa o cluster e particiona os dados biométricos entre os nós GBDS disponíveis. O Nó Líder é escolhido automaticamente pelo Zookeeper.

O componente Kafka do cluster gerencia *tópicos* (filas) para **tarefas pendentes** (a serem processadas pelo cluster) e **resultados** (a serem entregues assincronamente a clientes ou componentes do GBDS quando tarefas são concluídas). O GBDS tem múltiplos tópicos para tarefas pendentes, um para cada nível de prioridade. Tarefas em tópicos de maior prioridade sempre são consumidas antes das tarefas em tópicos de menos prioridade. O GBDS tem 8 níveis de prioridade: *Lowest, Lower, Low, Default, High, Higher, Highest* and *Maximum* (Baixíssima, Muito Baixa, Baixa, Default, Alta, Muito Alta, Altíssima e Máxima). Aplicações cliente não podem usar a prioridade *Maximum*/*Máxima*, que é reservada para operações internas do GBDS. Neste manual o conjunto de tópicos para tarefas pendentes é representando como uma única entidade.

O diagrama abaixo mostra os componentes executados em cada nó:

![](/files/i3sGQMFjeY0xFxcljKTt)

O subsistema de nós do GBDS é responsável pela lógica do ABIS. Ele atua tanto como produtor e consumidor de tópicos Kafka, e tanto como consumidor de requisições de clientes e produtos de notificações enviadas para clientes.

## Subsistema de Nós do GBDS

O Susbsistema de Nós do GBDS implementa os fluxos específicos para a operação do ABIS. Ele tem 3 módulos internos principais: o **Módulo de API**, o **Módulo Mestre**, e o **Módulo de Notificação**. Cada um destes módulos pode ser iniciado e parado de forma independente em cada nó.

O diagrama abaixo mostra a arquitetura interna do componente GBDS e as interações entre suas partes:

![](/files/dHcByzjqdSbFA9KIFydK)

* Quando uma solicitação de cliente é recebida pelo **Módulo de API**, ela é resolvida localmente ou submetida ao tópico Kafka de Tarefas Pendentes da prioridade adequada.
* O **Módulo Mestre** é responsável por gerenciar a tolerância a falhas, distribuir e carregar dados do banco de dados para a RAM em tempo de boot, e processar tarefas biométricas distribuídas. Ele continuamente consome itens de Tarefas Pendentes que envolvem processamento distribuído.
* Quando uma solicitação de cliente é concluída, os resultados são consolidados por um nó específico, que submete os resultados para o tópico de Resultados no Kafka. O nó de consolidação para cada transação é determinado por uma função de espalhamento (hash function) do identificador único da transação, o que distribui as tarefas de consolidação global de forma uniforme entre os nós do cluster.
* O **Módulo de Notificação** é responsável por consumir itens do tópico de Resultados do Kafka e enviar notificações assíncronas às aplicações-cliente externas. O módulo de notificação é um *singleton* e pode estar ativo em apenas um nó, escolhido pelo administrador do sistema.

### Módulo de API

O Módulo de API tem um componente principal, o **Tratador de API** (API Handler), que recebe requisições HTTP/HTTPS de aplicações-cliente externas e pode 1) processá-las localmente; ou 2) preparar uma transação para processamento distribuído e enfileirá-la em um tópico Kafka de Tarefas Pendentes com prioridade adequada, para que possa ser processada por todo o cluster.

O Tratador de API é responsável por realizar a extração de templates biométricos. Se uma requisição entrante tiver dados biométrico crus (i.e., imagens em vez de templates), este componente lança processos e/ou threads de extração biométrica no nó local para gerar os templates biométricos correspondentes. A escolha de processos ou threads depende da modalidade biométrica.

Transações de *Cadastro* (Enrollment) e *Identificação* (Identification, 1:N) são enfileiradas para um tópico Kafka de Tarefas Pendentes para serem processadas de forma distribuída por todo o cluster.

As demais transações são processadas localmente pelo Tratador de API. Quaisquer templates necessários para estas operações são extraídos localmente ou recuperados do HBase, e as respostas para os clientes são enviadas de forma síncrona: o tópico de *Resultados* do Kafka e o *Módulo de Notificação* não são envolvidos na operação.

Estas transações processadas localmente podem ser:

* **Verificação (1:1)**: O Tratador de API extrai o template biométrico para a consulta (se enviado como imagem), recupera o template de referência do HBase, realiza a comparação biométrica localmente, e responde diretamente para o cliente.
* **Atualização** (Update): O Tratador de API atualiza os dados biográficos e/ou biométricos diretamente no HBase, e enfileira um item de Tarefa Pendente no Kafka na fila de prioridade Máxima para forçar os nós do cluster que têm em RAM o perfil afetado a atualizar seus registros locais antes de começar a processar novas tarefas de prioridade inferior à Máxima.
* **Deletar**: O Tratador de API apaga o registro do HBase, e enfileira um item de Tarefa Pendente no Kafka na fila de prioridade Máxima, forçando os nós do cluster que têm em RAM o perfil afetado a atualizar seus registros locais antes de começar a processar novas tarefas com prioridade inferior à Máxima.
* **Tratamento de Exceção**: O Tratador de API atualiza o registro da exceção no HBase.
* **Tratamento de Qualidade**: O Tratador de API atualiza o registro da transação no HBase.
* **Get**, **List**: Estas são requisições somente-leitura para obter dados de registros ou transações. O Tratador de API recupera os dados solicitados do HBase e responde diretamente para a aplicação cliente.

### Módulo Mestre

Este Módulo é responsável por inicializar (dar boot) o nó GBDS, gerenciar o estado do cluster (por exemplo, redistribuir a carga do cluster quando um nó falha), e por processar transações biométricas.

#### Gerenciador de Nós

Este componente lê arquivos de configuração, inicia outros componentes e monitora ativamente os outros nós do cluster e decide como redistribuir os dados biométricos no cluster quando outros nós falham.

#### Gerenciador de Boot

Este componente é responsável por carregar templates biométricos do HBase para a memória RAM. Batimento biométrico eficiente requer que os templates estejam presentes em RAM. Carregar e indexar os templates em RAM é uma tarefa longa mas, uma vez concluída, garante o processamento rápido de transações.

#### Fluxo de Processamento de Tarefas

Os demais componentes do Módulo Mestre realizam o batimento biométrico distribuído.

O componente **Consumidor de Tarefas** (Task Consumer) consome continuamente itens dos tópicos de Tarefas Pendentes do Kafka. Ele sempre consome uma tarefa do tópico não-vazio de maior prioridade.

O componente **Supervisor de Matchers** (Matcher Supervisor) gerencia os processos e/ou threads de matchers biométricos (a escolha depende da modalidade biométrica) e realiza as operações de comparação biométrica entre templates de consulta (da transação sendo processada) e templates de referência (da base biométrica e carregados na RAM do nó local). O batimento de templates biométricos não é uma operação trivial e envolve algoritmos complexos.

O componente **Supervisor de Consolidação** organiza os resultados gerados pelos matchers e os envia para o Consolidador Global responsável pela transação corrente, que pode estar rodando em outro nó do cluster.

O componente **Consolidador Global** recebe resultados de batimento de todos os nós que contribuíram para o processamento da tarefa/transação e gera resultados consolidados de batimento. Cada tarefa/transação é consolidada em um único nó, escolhido de forma determinística por uma função de espalhamento (hash function) sobre o identificador único da transação/perfil. Esta função de espalhamento distribui as tarefas de consolidação global de forma uniforme entre os nós disponíveis do cluster.

Algumas transações, como buscas de latentes em sistemas forenses, exigem uma operação de batimento adicional para refinar e/ou reordenar os resultados, chamada de **Pós-matching**. O **Supervisor de Pós-Matching** gerencia os processos/threads para tais casos, e também é executado apenas no nó de consolidação global atribuído à transação.

O **Tratador de Commits** (Commit Handler) recebe os resultados finais do Consolidador Global ou do Supervisor de Pós-Matching e aplica de forma definitiva os resultados da transação:

* Todas as mudanças ao estado da base biométrica são aplicados no HBase.
* Se os resultados da transação exigem que quaisquer nós do cluster atualizem seus dados locais em RAM (ex.: uma nova pessoa for adicionada à base como resultado de uma transação de cadastro), um item é enfileirado no tópico do Kafka de Tarefas Pendentes de prioridade Máxima.
* Um item é enfileirado ao tópico de Resultados do Kafka, que será enviado à aplicação cliente pelo *Módulo Notificador*.

### Módulo Notificador

Este módulo tem um componente principal, o **Tratador de Notificações**, que consome continuamente itens do tópico **Resultados** do Kafka e envia notificações HTTP/HTTPS para as aplicações-cliente, informando assíncronamente o status das transações processadas.

O Módulo Notificador é um *singleton*, e fica ativo em apenas um nó do cluster. O nó que roda o Módulo Notificador é escolhido pelo administrador do sistema.

## Fluxos de Transação

Esta seção ilustra como cada tipo de transação é processado pelo GBDS.

### Identificação (1:N)

![](/files/I8iunkXoO1n7DmgEFhuV)

Em uma transação de identificação (busca 1:N), o cliente deseja buscar a base biométrica por casamentos com um dado biométrico de consulta. A base biométrica inteira pode precisar ser percorrida. O Tratador de API recebe a solicitação no nó para o qual ela foi enviada. Se a consulta contém o dado biométrico cru (imagens), seus templates são extraídos pelo Tratador de API neste nó local. A transação é então enfileirada para um tópico de Tarefas Pendentes do Kafka.

Todos os nós do cluster eventualmente consumirão o item do tópico (módulo *Consumidor de Tarefas*), e realizarção sua parte da busca biométrica (módulos *Supervisor de Matchers* e *Supervisor de Consolidação*). Os resultados de cada nó são enviados para o *Consolidador Global* no nó de consolidação global, determinado pelo identificador da transação.

No nó de consolidação global, o módulo de *Consolidação Global* espera até o cluster completar a operação de busca e consolida os resultados finais. Pós-matching é realizado, se necessário (módulo *Supervisor de Pós-Matching*), o e *Tratador de Commits* aplica os resultados no HBase e enfileira um item no tópico de *Resultados* do Kafka.

O Módulo de Notificação singleton, executado no nó de Notificação, eventualmente consome o item associado do tópico de *Resultados* do Kafka e envia uma notificação assíncrona à aplicação cliente, informando a conclusão da transação.

### Cadastro

![](/files/ScuPuISc82fMh4tF00lJ)

Em uma transação de *Cadastro*, o cliente solicita a inserção de uma nova pessoa na base de dados, desde que os dados biométricos não sejam duplicatas de algum registro existente. O fluxo desta transação é bem similar ao da operação de Identificação, já que envolve uma busca 1:N por registros com biometrias duplicadas. Como a transação exige que todos os nós atualizem seus templates em memória (para reconhecer a presença da nova pessoa na base), o *Tratador de Commits* enfileirará um novo item ao tópico de Tarefas Pendentes com prioridade Máxima do Kafka, forçando a atualização de todos os nós. Se a transação gerar uma exceção que requeira revisão manual, permanecerá suspensa até que a exceção seja tratada por outra transação.

Este fluxo também é realizado quando uma transação de Atualização (Update) adiciona novos dados biométricos a um registro existente.

### Verificação (1:1), Get, List

![](/files/ag0ctUlmlNLSP1GAYVve)

Em uma transação de *Verificação*, o cliente deseja verificar se uma dado biométrico de consulta casa com um pessoa específica presente na base de dados. Esta transação é processada pelo *Módulo de API* no mesmo nó que recebe a solicitação. O Módulo de API recupera os templates biométricos da pessoa do HBase, realiza o batimento biométrico localmente e responde para o cliente de forma síncrona.

*Get* e *List* são transações de somente-leitura para recuperar dados e/ou resultados do GBDS. Elas são processadas localmente pelo *Módulo de API*, que recupera os dados do HBase e responde para o cliente de forma síncrona.

### Atualização, Delete

![](/files/DHmhA6Lkw5JETVo3Qylt)

Em uma transação de *Atualização* (Update), o cliente deseja alterar dados biográficos e/ou biométricos de um registro existente. Se novos dados biométricos forem inseridos, a transação segue o fluxo de um *Cadastro*, pois a base precisa ser percorrida em busca de biometrias duplicadas. Senão, o *Módulo de API* realiza quaisquer extrações de templates necessárias, atualiza o HBase, responde para o cliente de forma síncrona e enfileira um item no tópico do Kafka de Tarefas Pendentes com prioridade Máxima para forçar todos o nós do cluster a reconhecer as alterações realizadas.

Em uma transação *Delete*, o cliente deseja remover uma pessoa da base de dados. O *Módulo de API* realiza a remoção do HBase e responde para o cliente de forma síncrona. O módulo também enfileira um item no tópico do Kafka de Tarefas Pendentes com prioridade Máxima para forçar todos o nós do cluster a reconhecer as alterações realizadas.

### Tratamento de Exceção, Tratamento de Qualidade

![](/files/yYV4lJOstZq85HsdLIsd)

O GBDS gerencia itens de Exceção e de Controle de Qualidade. Estes são gerados quando transações de Cadastro encontram suspeitas de duplicata ou transações de Atualização encontram discordâncias entre as biometrias de consulta e as biometrias de referência (Exceções), e quando dados biométricos de baixa qualidade são inseridos (Controle de Qualidade). Estes itens exigem revisão manual, dependendo das configurações do GBDS. Estas transações atualizam o status de itens pendentes de Exceção e Controle de Qualidade. O *Tratador de API* processa estas transações localmente, atualiza seu status no HBase e responde para o cliente de forma síncrona.


# BCC

## Introdução

O **GBS BCC (Biometric Capture Component)** é uma aplicação desenvolvida para o cadastro de perfis civis e de bebês a partir de seus dados biométricos e biográficos, tais como impressões digitais, face, impressões palmares, íris e outros. Os cadastros são guardados no GBDS e podem ser usados em processos de identificação e verificação. Como parte do Griaule Biometric Suite, o processo de cadastro também checa os novos registros quanto a problemas biométricos (como baixa qualidade, duplicatas, não correspondência com o controle de sequência) e possíveis fraudes (biometria duplicada entre perfis de pessoas diferentes).

{% hint style="info" %}
Dependendo do ambiente, configurações e permissões do usuário, algumas funcionalidades e telas podem não estar disponíveis.
{% endhint %}

Este manual abordará todos os processos de captura e identificação civil, captura e checkout de bebês e gerenciamento de configurações.

Esse manual está atualizado para a versão 1.8.0 do BCC.

## Pré-Requisitos

* Sistema Operacional:
  * Windows 7, 8, 10 ou 11.
  * Linux Red Hat 8.
* BCC Services [instalado](/instalacao-do-gbds/bccservicesinstallguide) e [configurado](/configuracao-do-gbds/bccservicesproperties).
* 2 GB disponíveis no disco.
* 8GB de RAM ou mais.
* Intel i3 ou superior.
* Pacote Windows Visual C++ 2008 Redistributable (x86).
* Pacote Windows Visual C++ 2010 Redistributable (x86).

{% hint style="info" %}
Se seu ambiente utiliza uma câmera Canon PowerShot, é necessário instalar o [pacote Zadig](https://support.griaule.com/hc/en-us/articles/30252365476116-How-to-Install-Zadig).
{% endhint %}

## Acesso e Autenticação

Você deve acessar o BCC com um navegador web e recomendamos o Google Chrome. A URL para acesso é específica para cada ambiente.

{% hint style="info" %}
Se necessário, entre em contato com a equipe de suporte da Griaule para obter a URL correta.
{% endhint %}

A autenticação é necessária para acessar o aplicativo. As credenciais necessárias para o BCC são nome de usuário e senha.

![login screen](/files/Gi2Ef1fQb0BFRoT6ANEb)

{% hint style="info" %}
Na parte inferior da tela há a opção de alterar o idioma para o desejado. Esta opção também está disponível na página de [Configurações](#configuracoes) após o login.
{% endhint %}

### Autenticação de dois fatores (2FA)

Quando a autenticação de dois fatores (2FA) estiver ligada, na primeira vez que você fizer login, após entrar seu username e senha, será mostrado um QR Code que deve ser registrado no Google Authenticator.

{% hint style="info" %}
Google Authenticator é um gerador de códigos de autenticação disponível como um aplicativo para smartphones [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\&hl=en\&gl=US) e [iOS](https://apps.apple.com/us/app/google-authenticator/id388497605).
{% endhint %}

![QR Code do Google authenticator para autenticação de dois fatores](/files/dxejXvad9yy2OLnr6zbZ)

Após registrar com sucesso o QR Code no Google Authenticator, insira o código de seis dígitos gerado e clique em Enviar.

Você só precisará registrar o QR Code uma vez. Mas, a cada login subsequente, você precisará inserir o código de seis dígitos gerado pelo Google Authenticator.

![Autenticação de dois fatores](/files/u9Fa0pnBWaIzaXk3jZrU)

Existe um número limitado de tentativas de login sem sucesso que um usuário pode fazer. Sempre que um código incorreto é inserido, uma mensagem de erro será exibida:

![Autenticação de dois fatores - código incorreto](/files/wQIqkYX2W170JhIE2zIZ)

Se você atingir o número máximo de tentativas de login sem sucesso, sua conta será automaticamente bloqueada.

![Autenticação de dois fatores - conta bloqueada](/files/VoRAuZeCCmFvSmSBKeUQ)

{% hint style="warning" %}
Se sua conta for bloqueada, entre em contato com o administrador do sistema.
{% endhint %}

### Logins Simultâneos e Cadastro de Navegador

Apenas uma sessão por usuário é permitida. Não é possível fazer login simultaneamente com um mesmo perfil mais de uma vez na aplicação. Se um usuário já estiver conectado e outro acesso acontecer usando o mesmo nome de usuário e senha, o usuário com a sessão mais antiga será notificado e desconectado na próxima ação.

![](/files/k1ZbJQbuW8pbdYlmbSlk)

Além disso, apenas um navegador pode ser usado de cada vez. Ao tentar fazer login usando um navegador diferente, o usuário será informado que é necessário autenticar o novo navegador. A autenticação de um novo navegador revogará o acesso do navegador anterior.

![](/files/Z3c0Q3g6O20Fx9GJxKdV)

Para autenticar um novo navegador, clique em Autenticar e, em seguida, insira o código de verificação que será enviado para o e-mail vinculado à conta do usuário.

![](/files/1ECSxLa5ZykE3lysDYEH)

Se a autenticação for bem-sucedida, uma notificação aparecerá no canto superior direito da tela após o login.

![](/files/yUodInwDv432OWsngK3E)

### Alterar ou Redefinir Senha

Por motivos de segurança, você pode alterar sua senha ou redefini-la caso a esqueça.

#### Alterar Senha

Para alterar sua senha, após fazer login, clique para abrir o [menu do usuário](#menu-do-usuario), no canto superior direito da tela, e clique em Alterar senha.

![](/files/kkAi0glRmFrWiol38vYz)

Em seguida, insira a senha atual e a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a alteração, clique em Alterar senha.

![](/files/34HV71380cju38TsKeKA)

#### Redefinir Senha

Para redefinir sua senha, na tela de login, clique em Esqueceu sua senha?:

![](/files/W9qyuwdKFuehQYe7NEyu)

Em seguida, insira o nome de usuário do perfil e clique em Enviar.

![](/files/lwojjdQ5G524uOgQEVzu)

Um e-mail contendo um código de verificação será enviado para o endereço de e-mail vinculado a esse perfil. Insira o código de verificação e clique em Enviar código.

![](/files/Dpdyb9fKmI4Dvsfk8JxI)

Se o código estiver correto, você poderá criar uma nova senha. Insira a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a redefinição, clique em Redefinir senha.

![](/files/yU58IXGzHAJ2tzFPSIfC)

## Interface do Usuário

Ao fazer login, a página principal será exibida. Dependendo do seu ambiente e das permissões do usuário, a página principal pode não ter a aparência apresentada na imagem abaixo. Este manual assumirá que todas as permissões estão disponíveis para o usuário.

![main page](/files/VPy54rzWMW5u7hqFUQUA)

A página principal é dividida nas seções [Captura Civil](#captura-civil) e [Captura de Bebê](#captura-de-bebe). Você também pode acessar essas funções através da barra superior. Há algumas opções na extremidade direita da barra superior, elas estão listadas no capítulo [Configurações e Atalhos](#configuracoes-e-atalhos).

## Captura Civil

A captura civil é um processo de cadastro de uma pessoa no banco de dados através da obtenção de suas informações biométricas e biográficas. Os dados biométricos que o BCC pode capturar são:

* Impressões digitais
* Impressões palmares
* Íris
* Face
* Assinatura

E os dados biográficos são os previamente configurados na página de [Campos](#campos).

Para iniciar uma captura civil, clique em Novo perfil.

### Novo Perfil

Ao abrir a página do Novo Perfil, você terá a opção de continuar a partir de um perfil incompleto pelo menu lateral ou clicar no botão Iniciar cadastro\` para iniciar um novo cadastro.

![new profile page](/files/UmnA7mFFJQPfLw3QGCUc)

Clicar em Iniciar cadastro levará você a uma página para inserir os dados biográficos da pessoa. Você pode configurar os dados a serem coletados na página de [Campos](#campos).

{% hint style="warning" %}
As informações biográficas serão sempre as primeiras a serem preenchidas em um novo perfil. No entanto, a ordem e quais biometrias estarão presentes podem variar dependendo do seu ambiente.
{% endhint %}

![biographical data page](/files/Sbh3AEC5YaI75isaiijs)

Após fornecer as informações biográficas necessárias, clique no botão Próximo. Ele o levará a uma das páginas de coleta biométrica. As páginas de captura biométrica serão descritas abaixo.

#### Captura Facial

Para capturar uma face, certifique-se de que uma câmera já esteja conectada ao computador. Se não houver câmera ou o sistema não a reconhecer, ocorrerá um erro:

![No connected/recognized camera error](/files/4WpdWvQRNb0pNZCel9xn)

O BCC Services abrirá automaticamente a janela de captura se a câmera estiver conectada.

![Capture Face Window](/files/bKHd2tGdX1SPvKZCwpvd)

Dependendo das configurações do seu ambiente, a captura pode iniciar automaticamente. Caso contrário, clique no botão Clique para capturar. Em seguida, aguarde a captura automática ou clique no botão Capturar.

Você pode corrigir o brilho, contraste e zoom da imagem através dos sliders do lado esquerdo durante o processo de captura.

Após a captura, o BCC tentará recortar a imagem para os padrões ICAO, e caso o padrão não seja atendido, aparecerá uma mensagem de erro conforme mostrado na imagem. Após a primeira captura você também pode fazer upload de uma imagem clicando no ícone de importar acima do botão de Ok.

{% hint style="info" %}
Algumas opções podem não aparecer para você se você não tiver permissão do usuário para acessá-las.
{% endhint %}

![Face Capture Error notification](/files/LpcmIt7qcfq9KSt9FkYz)

O BCC também tentará corrigir o brilho e o contraste após a captura. Você também pode modificar isso através dos sliders.

![Capture Face Window after a capture](/files/FkRTqOPVegi2Ut67UB8Z)

Você também pode verificar se o BCC obteve as posições corretas para olhos e boca marcando a caixa **Recursos**. Ele colocará um marcador com formato de `+` nos olhos e na boca. Você pode corrigir a posição do marcador clicando no botão Ajustar.

Após clicar no botão Ajustar, selecione o olho desejado e corrija as posições. Depois de corrigir os dois olhos, clique no botão Reprocessar e clique em Ok.

Em seguida, clique no botão Próximo para prosseguir para a captura subsequente.

#### Controle de Sequência

O BCC oferece dois métodos de captura para controle de sequência: 4-4-2 e 2-2-1. Quando você estiver na página, a captura deverá iniciar automaticamente. Caso contrário, clique no botão Clique para capturar.

Na Tela de Captura, você pode ver algumas informações sobre a coleta:

* Janela de captura ao vivo
* Propriedades de qualidade da captura (qualidade do NFIQ, do template e e do contraste)
* Quais dedos devem ser capturados, destacados em vermelho e escritos na parte superior
* Dedos já capturados, destacados em verde
* Dedos com exceção, destacados em amarelo
* Informações do sensor
* Caixa de seleção `Mostrar Características`
* Tipo de captura
* Informações de log
* Menu para Exceções

![Sequence Control Capture Window](/files/ceFBNt9X7xjUlCOdCFN2)

Se houver uma exceção que impeça a captura, você pode marcá-la no menu no lado esquerdo da janela de captura. As exceções estão listadas em Exceções de Palmar e Digital. Após selecionar uma das opções de exceção, o botão Próximo mudará para o botão Aceitar. Pressione esse botão para continuar a captura.

{% hint style="warning" %}
Marcar uma exceção na captura de controle de sequência marcará TODOS os dedos destacados com a exceção.
{% endhint %}

Além disso, você pode marcar a caixa de seleção `Mostrar características` e mostrar as minúcias extraídas das impressões digitais na tela de captura. Se você tiver permissão, também poderá importar as impressões digitais clicando no botão importar.

{% hint style="info" %}
Se você optar por importar o controle de sequência, será necessário importar uma imagem contendo todos os dedos destacados.
{% endhint %}

Você precisará recoletar a etapa do controle de sequência se qualquer dedo não atender aos critérios de qualidade configurados. Após a conclusão da captura, você poderá ver a qualidade dela na parte inferior de cada impressão digital. Você também pode marcar a caixa de seleção `Mostrar características`. Ela mostrará as minúcias extraídas das impressões digitais na tela de captura.

![Sequence Control Fingers Captured with Quality label](/files/kOewPFibUKhjQDkDlmyc)

Passe o mouse sobre a impressão digital desejada para removê-la ou recoletá-la.

![Hovering fingerprint remove and recollect buttons](/files/zu5U4Ivqx2MjDwNxWW1g)

{% hint style="warning" %}
Você só pode remover ou recoletar as impressões digitais do controle de sequência se nenhum dos dedos da captura principal estiver coletado. Se a recoleta for necessária, remova todas as digitais da captura principal.
{% endhint %}

{% hint style="warning" %}
Se você precisar recoletar alguma captura de controle de sequência, **TODAS** as etapas de captura de controle de sequência devem ser recoletadas. Por exemplo, após uma captura bem-sucedida, se você clicar para recoletar os polegares, precisará recoletar todas as capturas 4-4-2 ou 2-2-1.
{% endhint %}

Em seguida, clique no botão Próximo para prosseguir para a captura subsequente.

#### Captura de Digital

O BCC oferece a possibilidade de realizar capturas roladas e pousadas. Quando você chegar à tela de Captura de Digitais, a janela de captura abrirá automaticamente. Esta janela mostrará algumas informações:

* Janela de captura ao vivo
* Propriedades de qualidade da captura (qualidade do NFIQ, do template e e do contraste)
* Quais dedos devem ser capturados, destacados em vermelho e escritos na parte superior
* Informações do sensor
* Checkbox de `Mostrar Características`
* Tipo de captura
* Informações de log
* Menu para Exceções

![Fingerprint Capture window](/files/3rIgapsMZnCA61OOTZvC)

Após realizar uma captura, o BCC calculará a qualidade da extração. Se alguma captura não atender aos critérios de qualidade configurados ou não corresponder ao controle de sequência (quando capturado), será necessário recoletar a digital. Você também pode importar uma imagem de digital por meio do botão importar, próximo ao botão `Próximo`, se tiver a permissão adequada.

Se houver uma exceção que impeça a captura, você pode marcá-la no menu no lado esquerdo da janela de captura. As exceções estão listadas em Exceções de Palmar e Digital. Após selecionar uma das opções de exceção, o botão Próximo mudará para o botão Aceitar. Pressione esse botão para continuar a captura.

Durante a coleta, você pode marcar a caixa de seleção `Mostrar características`. Ela mostrará as minúcias extraídas da digital na tela de captura.

Para remover ou recoletar uma impressão digital, passe o mouse sobre a impressão digital desejada. Uma opção para remover ou recoletar a digital aparecerá.

![Hovering fingerprint remove and recollect buttons](/files/JIA8L4Qd2QDoafvi6i7i)

Quando todas as impressões digitais forem coletadas ou classificadas com exceções, clique no botão Próximo para prosseguir com a revisão ou outras coletas.

#### Captura de Palmar

Você pode capturar impressões palmares com o BCC. Quando você chegar à página de captura de palmares, a janela de captura abrirá automaticamente. Esta janela mostrará algumas informações:

* Janela de captura ao vivo
* Propriedades de qualidade da captura
* Impressão palmar que precisa ser capturada, destacados em vermelho e escritos na parte superior
* Informações do sensor
* Tipo de captura
* Informações de log
* Menu para Exceções

![Palmprint Capture window](/files/dU3AKmtoNLFjxRIjkNqv)

{% hint style="info" %}
Sua instalação pode alterar as áreas da palma que necessitam ser capturadas.
{% endhint %}

Executar a captura mostrará a qualidade do template. Se desejar, você pode fazer o upload de uma impressão palmar através do botão de importar ao lado do botão `Próximo`, se tiver a devida permissão.

Se houver uma exceção que impeça a captura, você pode marcá-la no menu no lado esquerdo da janela de captura. As exceções estão listadas em Exceções de Palmar e Digital.

Passe o mouse sobre a impressão palmar desejada para remover ou recoletar a impressão palmar.

![Hovering palmprint remove and recollect buttons](/files/gaBs7rH4BUrCqmyCSCvH)

Quando as capturas terminarem, clique no botão Próximo para prosseguir com a revisão ou outras coletas.

#### Captura de Íris

A janela de captura será aberta automaticamente quando você chegar à página de captura da íris. Se não abrir, clique no botão Clique para capturar. Esta janela mostrará algumas informações:

* Janela de captura ao vivo
* Qual íris está sendo capturado
* Imagem do íris capturado
* Informações de log

![Iris Capture window](/files/9LPPwMXCtVxfC98HCXur)

Na janela de log, clique no botão Adquirir para iniciar a captura. Você também pode cancelar a captura clicando no botão Cancelar.

Você pode importar uma imagem de iris clicando no botão de importar acima do botão `Ok` se você possuir as permissões necessárias. Após a captura, a qualidade dela é mostrada no log, como destacado na imagem abaixo.

![Iris quality verification](/files/Blfg6nwMymCrSjUcp8Wi)

Após terminar as duas capturas, clique em Ok. Se você quiser remover ou recoletar qualquer íris, passe o mouse sobre uma das imagens. Os botões de recoletar e de remover serão exibidos.

{% hint style="warning" %}
Remover ou recoletar qualquer uma das íris afetará as DUAS.
{% endhint %}

![Hovering irises remove and recollect buttons](/files/BYBrCe7EcaswAbDa6NX5)

Quando as capturas terminarem, clique no botão Próximo para prosseguir com a revisão ou outras coletas.

#### Captura de Assinatura

A janela de captura será aberta automaticamente quando você chegar à página de captura de assinatura. Se não abrir, clique no botão Clique para capturar.

Na janela de captura de assinatura, há a área de visualização de assinatura, uma caixa de seleção para "não assina", o botão Limpar, o botão Importar e o botão Ok.

![Signature Capture window](/files/H687v7bw0SiRH1WDo9uK)

Depois de capturar a assinatura, o botão Ok será clicável. Se a assinatura não puder ser obtida, marque o campo "Não assina" e clique no botão Ok.

Para refazer a assinatura, clique no botão Limpar destacado na imagem abaixo.

![Clear button highlighted](/files/PBQn4W8p3xINV1611anI)

Caso você queira remover ou recoletar a assinatura, passe o mouse sobre a imagem. Os botões de recoletar e remover serão exibidos.

![Hovering signature remove and recollect buttons](/files/gedX4TKpPY8VUaLMmVe6)

Quando a captura terminar, clique no botão Próximo para prosseguir com a revisão ou outras coletas.

#### Captura de Imagens Auxiliares

A *Captura de Imagens Auxiliares* é uma etapa em que se pode capturar imagens de cicatrizes, marcas e tatuagens. Essas imagens ficam cadastradas no perfil do indivíduo, mas não são utilizadas para identificação automatizada.

Se a janela de captura não abrir automaticamente, clique em Clique para capturar.

![](/files/ToD115df4hgNHvE9Zr8g)

A janela de captura abrirá.

![](/files/ZizsyJI8MEUK6s4DDRa6)

No lado esquerdo, escolha a localização da característica a ser capturada clicando em uma parte do corpo. A área selecionada será destacada em vermelho. Em seguida, selecione o tipo de característica abrindo o menu suspenso em **Tipo** e escolhendo `Tatuagem`, `Cicatriz`, ou `Marca`. Também é possível adicionar uma descrição.

![](/files/SPGYJ4vg2KueYglvxbvH)

Se a câmera não iniciou automaticamente, clique no botão Iniciar Câmera. Em seguida, ajuste o brilho, contraste e/ou zoom, se desejado. Quando estiver pronto, clique no botão Capturar para tirar a foto.

![](/files/wBYBXLKFcmkD1fLK8yLI)

Depois de revisar a imagem capturada e as informações adicionadas (localização, tipo, descrição), clique em OK.

![](/files/61zqdikzCciYLx6kfiDb)

A imagem será adicionada ao perfil, e o destaque de sua localização no corpo mudará de vermelho para verde.

Finalmente, a janela de captura iniciará uma nova captura. Repita o processo para todas as características a serem capturadas. Quando terminar, feche a janela de captura clicando no `X` no canto superior direito da janela de captura.

Para remover uma imagem capturada, passe o mouse sobre a imagem desejada. O botão de remoção aparecerá. Clique em Remover.

![](/files/OB4fQ8NlyaHATOfNAyl6)

Depois de terminar, clique em Próximo para prosseguir com a revisão.

#### Revisão

Após todas as capturas, o BCC exibirá a página de revisão. Esta página mostra todas as informações biográficas e biométricas que você está prestes a enviar para o banco de dados. Depois de verificar as informações, conclua o cadastro clicando no botão Concluído.

Além disso, você pode exportar todas as informações do perfil para um arquivo `.pdf` clicando no botão Exportar PDF.

![Revision Screen](/files/SQ9hpaIQYf3KC5Fbf01X)

Quando você clica no botão Concluído, a seguinte página será exibida. Você pode iniciar um novo cadastro clicando no botão Novo Perfil, também é possível exportar o perfil para um arquivo `.pdf` clicando no botão Exportar PDF ou visualize o perfil na lista clicando no texto Ver perfil no meio da tela.

![Revision Screen](/files/3spnc3qAHfQvrxngDMI5)

#### Exceções de Palmar e Digital

Algumas condições podem fazer com que a extração do dedo ou da palma da mão não seja possível no momento da captura. Para lidar com essas situações, você pode marcar a captura como uma exceção. O BCC oferece dois módulos de exceção, o `simplificado` e o `técnico`. Observe que apenas um desses módulos estará disponível por vez em seu ambiente.

O módulo simplificado oferece as seguintes exceções:

* Danificado
* Enfaixado
* Ignorado
* Amputado
* Baixa qualidade

Enquanto o módulo técnico oferece essas exceções:

* Adatilia
* Anquilose
* Ectrodactilia
* Hiperfalangia
* Polidatilia
* Microdatilia
* Macrodatilia
* Sindatilia

Ao lidar com uma exceção, selecione a desejada no menu e clique em `Ok`. Lembre-se de que escolher uma exceção para a captura de controle de sequência definirá a exceção para **TODOS** os dedos que seriam capturados nessa etapa de captura.

### Verificação

A ferramenta de verificação é usada para verificar a identidade de uma pessoa por meio de uma de suas biometrias. Esse processo consiste em uma verificação 1:1 em que uma chave (por exemplo, CPF ou número do passaporte) é fornecida juntamente com uma captura biométrica para ser comparado com o perfil registrado com a mesma chave.

Para realizar uma verificação, clique na caixa Verificação na página principal ou clique em Verificação no menu da barra superior. Clicar o levará à página de Verificação. Você terá botões para selecionar a biometria que necessita ser capturada nesta página. As biometrias que podem ser capturadas são:

* Face
* Impressão Digital
* Impressão Palmar
* Íris
* O perfil biométrico inteiro ou parcial da pessoa

![Verify Screen](/files/w444kSxcc9nrrblWDBZm)

A seleção de uma dessas opções abrirá a janela de captura para sua respectiva biometria. A única exceção é a opção de perfil, onde você pode escolher quais e quantas informações biométricas devem ser capturadas para serem comparadas na operação de verificação. A captura de perfil é explicada na seção [Verificação via Perfil](#verificacao-via-perfil).

Se a verificação retornar um casamento, a página do perfil será retornada e a seguinte mensagem com as informações do perfil que ocorreu o casamento será exibida. Clique no botão Ver perfil para abrir o perfil.

![Verify successful match](/files/gTyBkgzeZwhbK7M11lKg)

Se não houver casamento, a seguinte mensagem será exibida.

![Verify failed match](/files/bwwklKfIHqBD0jztc6hh)

Existe a possibilidade de que a chave pesquisada não esteja presente no banco de dados. Neste caso, aparecerá um erro.

![Verify done with non-present in database key message](/files/rr80IlVd43YDKBaFYKHL)

#### Verificação via Perfil

A verificação via perfil é uma operação onde você pode coletar mais de uma biometria para ser comparada com a pessoa desejada. Ao clicar na opção de perfil, uma nova janela será aberta.

![Profile capture window](/files/Y7Z94aR5DNp9mzC3KOr7)

Haverá opções para coletar todos os dados biométricos neste modo, exceto o controle de sequência e captura de assinatura. A janela de perfil oferece algumas possibilidades para capturar dados biométricos. Esses são:

* Clique nos botões no canto inferior direito da janela
* Clique com o botão direito do mouse na biometria que deseja e clique no botão Capturar.
* Acesse a opção Perfil > Capturar na barra de menu superior, conforme mostrado abaixo

![Profile capture option by top menu](/files/LaheqxLlSMmf6NSOTMNe)

Há um requisito mínimo de biometrias que você deve capturar para realizar uma verificação de perfil. Ele é diferente em cada ambiente e pode ser configurado individualmente. Após capturar as biometrias necessárias e desejadas, clique no botão Salvar para realizar a verificação.

{% hint style="warning" %}
Se **QUALQUER** uma das biometrias corresponder ao perfil, será considerada um casamento.
{% endhint %}

Para remover uma biometria já coletada, clique com o botão direito e clique no botão Limpar. Você também pode acessar o menu Perfil>Limpar e selecionar uma das opções para limpar todos os dados biométricos do tipo desejado de uma só vez.

Você também pode importar a biometria do perfil se tiver as permissões adequadas. Para fazer isso, clique em Perfil>Importar>Opção de importação. Duas opções estão disponíveis:

* Importar da pasta

  > Todos os seus arquivos na pasta devem ser nomeados corretamente de acordo com o padrão:
  >
  > ```html
  > <index>_<BIOMETRIC>-<Type>
  > ```
  >
  > exemplo:
  >
  > ```default
  > 0-LEFT_INDEX-ROLLED.tpt
  > 1-LEFT_RING-FLAT.wsq
  > (...)
  > 10-FACE-FRONTAL.jpg
  > 13-FACE-LEFT_IRIS.png
  > ```
* Importar do arquivo EBTS ou ANSI/NIST-ITL 2011

Para cancelar a verificação, clique no botão `Cancelar` ou no `x`.

### Identificação

A ferramenta de identificação é utilizada para buscar a identidade de uma pessoa por meio de uma de suas biometrias. Este processo consiste em uma busca 1:N onde nenhuma chave é fornecida. A biometria coletada será comparada com todos os perfis do banco de dados e retornará uma lista de pontuação com os possíveis casamentos.

Para realizar uma identificação, clique na caixa Identificação na página principal ou clique em Identificação no menu da barra superior. Clicar o levará à página de Identificação. Esta página terá botões para selecionar a biometria desejada que você deseja que seja capturada. As biometrias que podem ser capturadas são:

* Face
* Impressão Digital
* Impressão Palmar
* Íris
* O perfil biométrico inteiro ou parcial da pessoa

![Identify Screen](/files/qHfCphGVpObpHLvwTqrh)

A seleção de uma dessas opções abrirá a janela de captura para sua respectiva biometria. A única exceção é a opção de perfil, onde você pode escolher quais e quantas informações biométricas devem ser capturadas para serem comparadas na operação de identificação. A captura de perfil é explicada na seção [Identificação via Perfil](#identificacao-via-perfil).

Se a identificação retornar um casamento, a página do perfil será retornada e a seguinte mensagem com as informações do perfil que ocorreu o casamento será exibida. Clique no botão Ver perfil para abrir o perfil.

Caso retorne mais de um casamento, será exibida uma lista com os casamentos e suas pontuações. Clicar em um dos casamentos abrirá o perfil.

![Identify successful one match](/files/5BPHuEIFOgbrgsrCbJJz) ![Identify successful many matches](/files/8fskEWhr4qW9xq4578F6)

Se não houver casamentos, a seguinte mensagem será exibida.

![Identify failed match](/files/8i9AWGMYwqP26zhuONgX)

#### Identificação via Perfil

A identificação via perfil é uma operação onde você pode coletar mais de uma biometria para ser comparada com a pessoa desejada. Ao clicar na opção de perfil, uma nova janela será aberta.

![Profile capture window](/files/lpoCY23xGzFcYCRzwe91)

Haverá opções para coletar todos os dados biométricos neste modo, exceto o controle de sequência e captura de assinatura. A janela de perfil oferece algumas possibilidades para capturar dados biométricos. Esses são:

* Clique nos botões no canto inferior direito da janela
* Clique com o botão direito do mouse na biometria que deseja e clique no botão Capturar.
* Acesse a opção Perfil > Capturar na barra de menu superior, conforme mostrado abaixo

![Profile capture option by top menu](/files/rUp39fuN2MPOXqe0mKSN)

Há um requisito mínimo de biometrias que você deve capturar para realizar uma verificação de perfil. Ele é diferente em cada ambiente e pode ser configurado individualmente. Após capturar as biometrias necessárias e desejadas, clique no botão Salvar para realizar a verificação.

{% hint style="warning" %}
Se **QUALQUER** biometria corresponder a **QUALQUER** perfil, a operação considerará um casamento e retornará o perfil ou a lista de perfis.
{% endhint %}

Para remover uma biometria já coletada, clique com o botão direito e clique no botão Limpar. Você também pode acessar o menu Perfil > Limpar e selecionar uma das opções para limpar todos os dados biométricos do tipo desejado de uma só vez.

Você também pode importar a biometria do perfil se tiver as permissões adequadas. Para fazer isso, clique em Perfil > Importar > Opção de importação. Duas opções estão disponíveis:

* Importar da pasta

  > Todos os seus arquivos na pasta devem ser nomeados corretamente de acordo com o padrão:
  >
  > ```html
  > <index>_<BIOMETRIC>-<Type>
  > ```
  >
  > exemplo:
  >
  > ```default
  > 0-LEFT_INDEX-ROLLED.tpt
  > 1-LEFT_RING-FLAT.wsq
  > (...)
  > 10-FACE-FRONTAL.jpg
  > 13-FACE-LEFT_IRIS.png
  > ```
* Importar do arquivo EBTS ou ANSI/NIST-ITL 2011

Para cancelar a identificação, clique no botão `Cancelar` ou no `x`.

## Captura de Bebê

A captura de bebês é um processo de cadastro de um recém-nascido no banco de dados, obtendo suas informações biométricas e biográficas. Para realizar uma captura de bebê, clique na caixa `Novo bebê` na página principal ou na opção `Novo bebê` no menu superior. Esta página será exibida.

![New Baby page](/files/Ft7Rr2ourVjg1AtMHHf1)

Perfis de bebês incompletos serão listados no menu lateral. Na mesma página, você pode ver os campos necessários para iniciar o cadastro de um recém-nascido:

* Uma caixa de seleção para escolher o responsável, onde o selecionado é destacado em verde
* Um campo para inserir a chave do responsável
* Um campo para inserir a chave do bebê

Após preencher as informações, clique no botão Iniciar cadastro. Algumas possibilidades diferentes podem acontecer a partir de agora:

* O responsável não está cadastrado no banco de dados, levando ao cadastro do responsável primeiro.
* O responsável está cadastrado, e o bebê não está cadastrado, levando ao cadastro do bebê.
* O bebê já está cadastrado e vinculado a um responsável, interrompendo a operação.

Essas possibilidades serão explicadas a seguir.

### Responsável não cadastrado

Caso o responsável não esteja cadastrado, aparecerá uma mensagem informando que o responsável não foi encontrado. Será exibida uma opção para iniciar o cadastro responsável. Para iniciar o cadastro, clique em Cadastrar Responsável.

O cadastro de um responsável segue o mesmo processo descrito de cadastro de [Novo Perfil](#novo-perfil) de captura civil, onde os dados biográficos podem diferir dependendo da configuração dos seus [Campos](#campos).

Há apenas uma diferença entre este cadastro e o cadastro civil. A tela de revisão terá mais um botão, levando à revisão do responsável do fluxo [Bebê não cadastrado](#bebe-nao-cadastrado), pulando a operação de identificação do responsável.

### Bebê já cadastrado

Se o bebê já está cadastrado, não importa se o responsável está cadastrado ou não. Uma notificação mostrará que um bebê foi encontrado com a chave informada. Você pode ver o perfil do bebê clicando no botão Ver perfil ou fechar a notificação clicando no botão Alterar valor.

![New Baby page](/files/P5MSkAT0U2FsfnJiOrtF)

### Bebê não cadastrado

Se o responsável já estiver cadastrado e o bebê não, clicar em Iniciar cadastro exibirá uma notificação com um botão para Verificar responsável. Você precisa autenticar o responsável com a captura de qualquer dedo. Depois disso, a página de revisão de responsável será exibida.

![Responsible Revision page](/files/NLwsFNPpLiQJOybTMS8v)

Se todas as informações estiverem corretas, você pode continuar clicando no botão Próximo. Isso levará aos dados biográficos do bebê. Preencha todos os dados biográficos necessários e clique no botão Próximo.

![Baby Biographics page](/files/YXo8Cibeneg7ICowRp8A)

{% hint style="info" %}
Note que a chave do bebê fornecida antes de iniciar o cadastro já estará preenchida.
{% endhint %}

O próximo passo é a captura de face. A janela de Captura de Face será iniciada automaticamente. Capture o rosto do bebê ou carregue uma imagem se você tiver as permissões adequadas e clique em Ok.

![Baby Face Capture Window](/files/bbUExYPDpd532opEiX5B)

Você pode remover ou recoletar a imagem passando o mouse sobre ela e clicando no botão desejado.

Prosseguindo você chegará à captura da palma da mão do bebê. As janelas de captura abrirão automaticamente.

![Baby Palm Capture Window](/files/U4q9wzVi0mMhKjHcsuZb)

Na janela de captura, você pode ver:

* A palma que precisa ser capturada, destacada em azul e no texto na parte superior da janela.
* O número de captura, pois cada palma do bebê precisa ser capturada **DUAS** vezes.
* O menu de exceção. A lista de exceções pode ser vista em [Exceções de Palmar e Digital](#excecoes-de-palmar-e-digital)
* O botão de Capturar para forçar a captura da palma do bebê e não esperar pela captura automática.
* O botão de Cancelar para fechar a janela e cancelar a captura.
* O botão de Confirmar para aprovar as capturas após ambas capturas de ambas as palmas terem sido feitas.

Como mencionado, as impressões palmares do bebê precisam ser capturadas duas vezes. Existem algumas indicações na tela de captura de qual captura você está:

* No título da captura será mostrado (1/2) ou (2/2)
* Os pontos acima da impressão palmar (verde para capturada, azul para captura)

A imagem abaixo mostra esses exemplos:

![Baby Palm Capture Window](/files/8QZ8oTPNel7ZcqAqxTyM)

Após as capturas serem feitas, clique em Confirmar para fechar as janelas. Se alguma captura precisar ser recoletada, passe o mouse sobre a imagem da impressão digital e selecione uma das opções de Remover ou Recoletar. Para prosseguir para a revisão, clique em Próximo.

Na revisão você pode revisitar as informações e biometria do bebê e do responsável. Verifique as informações exibidas. Nesta tela, você pode concluir o cadastro clicando em Concluído e exportar todas as informações do bebê e do responsável para um arquivo `.pdf` clicando em Exportar PDF.

![Baby Palm Capture Window](/files/vY1UaLsp7HZpNzrCZfRj)

Após clicar em Concluído, uma página exibindo a mensagem "Perfil criado com sucesso" será exibida. Nesta página, você pode Exportar PDF do perfil, ver o perfil do bebê clicando em Ver perfil no meio da página ou criar um Novo perfil de um bebê.

![Baby Palm Capture Window](/files/iYGizrX2pq0V4xfemo3h)

## Verificar saída do bebê

O checkout do bebê é uma operação de verificação dupla. O perfil do bebê está vinculado ao perfil do responsável e a operação de checkout do bebê garante que o bebê esteja acompanhado de seu responsável.

{% hint style="info" %}
Esta operação não altera nenhum perfil no banco de dados, seja o perfil bebê ou o do responsável.
{% endhint %}

Para realizar a operação de checkout do bebê, clique na caixa `Verificar saída do bebê` na página principal ou clique em `Verificar saída do bebê` na barra de menu superior.

![Baby checkout page](/files/39wXPEvLl0hP9b2CMUSJ)

Escolha a chave do bebê e insira o valor. A inserção de uma chave que não existe no banco de dados retornará um erro. Após inserir o valor correto, clique no botão Verificar bebê. Ele abrirá a captura de impressão palmar do bebê.

![Baby palm capture](/files/G2BWcClwvkn3IaqptUJd)

Depois da captura palmar retornar um sucesso, a seguinte mensagem será exibida. Clique no botão Verificar responsável para continuar o checkout.

![Baby profile verified](/files/WD7DPGpsuMPqysdREu3x)

Isso abrirá a página de captura de impressão digital. Capture um dedo responsável para prosseguir.

![Responsible finger capture](/files/6sZWp6uvB2Phpvnjz2wt)

Após a captura, clique em Ok. Se não for um casamento, uma mensagem de falha será exibida e você precisará reiniciar o processo de checkout. Se for um casamento, uma mensagem mostrando o sucesso e as informações do perfil responsável serão exibidos.

![Responsible not match](/files/XcF9cd6siCsDzk2ngPIQ) ![Responsible match](/files/I4uG0BcV5pX3EvgdhSYG)

Após verificar o responsável, o processo de checkout está completo. Você pode clicar em Ver perfil para acessar o perfil do responsável.

## Perfis

Para acessar a página de perfil, clique na caixa `Perfis` na página principal ou clique no botão `Lista de perfis` na barra de menu superior. O acesso pela caixa de perfis localizada na área de captura de bebês filtrará apenas os bebês.

Na página da lista de perfis você pode visualizar e pesquisar por perfis presentes no GBDS e no banco de dados local. Você verá a listagem de perfis, contagem, uma chave e um biográfico identificando o perfil, um menu para selecionar filtros, a área de filtros aplicados e o status da transação. Clicar em um perfil levará você à página de perfil.

![Profile list page](/files/pHB46sIJjgQYNTeL4lmv)

Os perfis que você vê nesta página podem ter três status possíveis:

* GBDS OK, marcado com um ponto verde.
* Análise no ETR, marcado com um ponto laranja. Isso acontece quando um perfil tem alguma exceção não tratada.
* Disponível para o GBDS, marcado com um ponto azul.
* Enviado para o GBDS, marcado com um ponto verde. Esse status de transição acontece depois que um perfil é enviado e ainda não foi removido da listagem local.
* Falha no GBDS, marcado com um ponto vermelho. Isso acontece quando ocorre algum erro ao enviar um perfil para o GBDS.

Para restringir sua pesquisa, você pode filtrar os perfis. As opções para filtrar os perfis são:

* Data - Restringe a lista a um intervalo de data. Há também atalhos para um dia (hoje), semana passada e mês passado.
* Chave ou biográfico - Restringe a lista a um dos campos de perfil pré-configurados que você pode selecionar no menu.
* Incluir relacionados - Este campo só está disponível ao filtrar por chave ou biografia. Quando selecionado, trará o perfil filtrado pela chave ou biográfico e todos os bebês pelos quais esse perfil é responsável.
* Listar apenas bebês - Restringe a lista aos perfis cadastrados como bebês.
* Incluir exceções - Inclua os perfis que estão em exceção no ETR.
* Listagem local - Altera a lista de perfis do GBDS para a lista do banco de dados local.

Depois de clicar em um perfil na lista, você entrará na página de perfil.

![Profile page](/files/RaOC7gycBd0HrOQq7Z5m)

Nesta página, você pode ver o perfil completo da pessoa. É possível passar o mouse sobre qualquer informação biográfica e clicar para copiá-la. Você também pode clicar em um campo biométrico para expandi-lo.

Além disso, também é possível exportar o perfil para um arquivo `.pdf` clicando em Exportar PDF. E, se você tiver as permissões adequadas, exportar as imagens originais do perfil e os metadados em um arquivo `.zip` clicando em Exportar imagens.

### Editando Perfis GBDS OK

Quando um perfil está no GBDS, ele é marcado como o status `GBDS OK`. Você pode editar as informações biográficas e biométricas nesses perfis se tiver as permissões adequadas. Além disso, a página de perfil terá dois botões adicionais: Editar e Enviar para o GBDS.

![](/files/Fv4QkOiETscXOG45rLyM)

Para editar as informações biográficas, clique no botão Editar no canto superior direito da página.

![](/files/qiAwiCPi3lXwX6gbkij8)

Você também pode recoletar ou remover um campo biométrico. Passe o mouse sobre a biometria, e as opções devem aparecer no canto conforme destacado na imagem abaixo. Clicar na opção de recoleta abrirá a janela de captura da biometria desejada.

![](/files/UvARkm24fpfiGtQmmv20)

Após modificar o perfil, clique no botão Enviar para o GBDS para reenviar o perfil para GBDS. Uma janela de confirmação será aberta. A confirmação enviará o perfil para o GBDS. Depois disso, o BCC exibirá uma notificação indicando sucesso.

![Send to GBDS Confirmation Window](/files/XrW8EvdroNLbjZ5STuzb) ![Successful sent notification](/files/k5QnVdQhZQPvuxISAWye)

## Configurações e Atalhos

No canto superior direito da tela, há três ícones que dão acesso a:

* [Campos](#campos)
* [Configurações](#configuracoes)
* [Aplicações](#aplicacoes)
* [Menu do usuário](#menu-do-usuario)

### Campos

Para acessar a página de campos, clique no ícone de lista:

![](/files/vGW0dpYUQmsa1tZwaKqM)

Ao entrar na página de campos, você verá um menu piscando amarelo. Este menu permitirá que você acesse os campos para bebês, responsáveis e perfis.

![Fields page](/files/PphcL9OkeN9jkGDg7KCP)

Clicar em uma das opções de perfis o levará à página do campo de perfis. Você verá os nomes dos campos, descrições, tipos de entrada, tipos, tamanho do campo, tamanho do contêiner, se obrigatório, e opções para ver os detalhes, editar ou remover o campo. Além disso, um botão Pré-Visualizar, Reordenar Campos e Novo Campo estarão presentes na parte inferior da página.

![Fields page](/files/IwkzZ7veDNL9T3y3C9JE)

Para adicionar um novo campo, clique no botão Novo Campo. Isso abrirá um novo painel sobre a página. Neste painel, você pode inserir as seguintes informações:

* `Conjunto` - Define qual perfil receberá o novo campo (Bebê, responsável ou perfil civil).
* `Id` - Define o nome que o campo terá no banco de dados.
* `Nome` - Define o nome que ficará visível para o usuário.
* `Tipo de Entrada` - Define o tipo de entrada. Data, lista e lista vinculada têm um comportamento exclusivo, explicado abaixo.
  * **Data** é um tipo de entrada DD/MM/YYYY. Ao fornecer essas informações no cadastro, aparecerá um calendário para selecionar a data. Você pode escrever a data em vez de escolher no calendário.
  * **Lista** é o tipo onde você pode inserir sua lista para ser exibida em um menu suspenso no cadastro do perfil.
  * A **lista vinculada** aceita arquivos `.csv`. Esse `.csv` precisa seguir um modelo, como mostrado no exemplo:

    > ```csv
    > id;State;City
    > 001;California;Los Angeles
    > 002;California;San Diego
    > 003;California;San Jose
    > 004;Florida;Jacksonville
    > 005;Florida;Miami
    > 006;Florida;Tampa
    > ```
    >
    > Essa lista vinculada criará dois campos complementares, um para selecionar o estado e outro para escolher uma cidade correspondente no estado. Observe que você pode alterá-lo para qualquer tipo lista, por exemplo, incluindo um país primeiro, para que ele gere três campos e tenha sua própria lista vinculada.
* `Tipo de campo` - Define o tipo do campo.
* `Tamanho do container` - Define o espaço que o campo irá ocupar na tela. Você pode vê-lo como a linha pontilhada ao redor do campo ao visualizar os campos.
* `Tamanho do campo` - É o tamanho do campo na tela, o tamanho da área onde você preenche as informações cadastrais.
* `Obrigatório` - Define se é necessário fornecer as informações para o cadastro do perfil.

![New field notification](/files/3k4B1JkwSNNoKXTmkmnN)

Você também pode reordenar os campos. Clique no botão Reordenar campos e arraste e solte o campo que deseja reordenar. Depois disso, salve suas alterações clicando em Salvar ordenação. Se você quiser reverter sua ordenação, clique no botão Descartar ordenação.

![reorderFields](/files/d5EnwPdj7bAv3ILwTsiK)

Para visualizar como os campos ficarão na página de cadastro, clique no botão Pré-Visualizar. Clicar nele abrirá uma tela mostrando a disposição dos campos por ordem de numeração. Você pode alterar a disposição reordenando os campos. O contêiner (definido pelo tamanho do contêiner) é destacado em amarelo na imagem a seguir. Em contraste, o campo (definido pelo tamanho do campo) é destacado em verde.

![Fields preview](/files/pX3isltZCsLGjU8xfJke)

### Configurações

Para acessar as configurações, clique no ícone de engrenagem:

![](/files/fJOUxyof4dzMhEmCZ34y)

Esta seção permite ao usuário alterar alguns aspectos da interface:

![](/files/X0jo4mb9wlVnGtCGA58V)

* Tema: **Claro** ou **Escuro**;
* Idioma: **Português**, **Inglês** ou **Espanhol**;
* Formato de Data: **dd/mm/yyyy**, **mm/dd/yyyy**, ou **yyyy/mm/dd**;
* Formato de Hora: relógio de **12 horas (AM/PM)** ou de **24 horas**.

### Aplicações

Para acessar os atalhos para as outras aplicações GBS, clique em:

![](/files/jNVhmJPHgGvHhRsgxVNf)

Em seguida, clique no ícone da aplicação que deseja acessar:

![](/files/ZMMzcC6ePEr8jrhTVM1v)

{% hint style="info" %}
Somente serão exibidos os ícones das aplicações para as quais o usuário tem permissão de acesso.
{% endhint %}

### Menu do usuário

Para acessar o menu do usuário, clique no ícone do usuário:

![](/files/f6ummZvFBrah966JVKyr)

Um menu será exibido com o nome de usuário, email e opções adicionais:

![](/files/RI2Jqq9FENxIYmW6epmT)

## Dispositivos Suportados

Esta é a lista completa de dispositivos suportados pelo BCC.

### Leitores de Impressão Digital e Palmar

|                                   |
| --------------------------------- |
| Cogent Cs500e                     |
| Crossmatch EF200 / Watson         |
| Crossmatch LSCAN Guardian         |
| Crossmatch Verifier 320 LC        |
| Digent Izzix FD1000               |
| Digital Persona U.are.U 4000      |
| Digital Persona U.are.U 4500      |
| Digital Persona U.are.U 5100      |
| Futronic FS52                     |
| Futronic FS64                     |
| Futronic FS80                     |
| Futronic FS80H                    |
| Futronic FS81H                    |
| Futronic FS88                     |
| Futronic FS88H                    |
| Greenbit Multiscan 527            |
| Lumidigm M301                     |
| Lumidigm V302                     |
| Lumidigm V311                     |
| Lumidigm V371                     |
| IDTech Biomag IDT-4012-DP         |
| IDTech Biomag IDT-4033-NG         |
| Integrated Biometrics Sherlock    |
| Integrated Biometrics Watson Mini |
| Integrated Biometrics Kojak       |
| Nitgen eNBioScan-D                |
| Nitgen Hamster DX                 |
| Nitgen Hamster II                 |
| Nitgen Hamster II DX / III        |
| Secugen Hamster IV                |
| Secugen Hamster Plus              |
| Secugen Hamster Pro 20            |
| Suprema BioMini                   |
| Suprema BioMini Plus              |
| Suprema BioMini Slim              |
| Suprema RealScan-D                |
| Suprema RealScan-G10              |
| Suprema RealScan S60              |
| Suprema SFU-S20                   |
| TechMag Biopass                   |
| UPEK Eikon                        |
| UPEK Eikon Touch                  |
| Virdi FOH02                       |
| Virdi FOH04                       |
| Zvetco Verifi P5000               |
| Zvetco Verifi P6000-B             |

{% hint style="info" %}
A captura de impressões digitais e palmares utiliza o Griaule Fingerprint SDK. Para mais informações, veja o [Manual do Fingerprint SDK 2014](/sdks/en).
{% endhint %}

### Leitores de Íris

|                                                     |
| --------------------------------------------------- |
| Crossmatch I Scan 2                                 |
| IriTech IriShield-USB                               |
| Unique Biometrics Hummingbird USB Dual Iris Scanner |

### Câmeras

|                                                                        |
| ---------------------------------------------------------------------- |
| Canon EOS 40D / 50D / 5D Mark II / 5D Mark III / 7D / 60D / 60Da / 70D |
| Canon EOS Rebel T1i / 500D                                             |
| Canon EOS Rebel T2i / 550D                                             |
| Canon EOS Rebel T3 / 1100D                                             |
| Canon EOS Rebel T3i / 600D                                             |
| Canon EOS Rebel T4i / 650D                                             |
| Canon EOS Rebel T5 / 1200D / Hi(\*)                                    |
| Canon EOS Rebel T5i / 700D, EOS Rebel SL1 / 100D                       |
| Canon EOS Rebel T6                                                     |
| Canon EOS Rebel T7                                                     |
| Canon EOS Rebel XS / 1000D                                             |
| Canon EOS Rebel XSi / 450D                                             |
| Canon EOS-1D C / EOS 6D / EOS M / EOS M2(\*)                           |
| Canon EOS-1D X / 1D Mark III / 1Ds Mark III / 1D Mark IV               |
| Canon PowerShot SX 160 IS                                              |
| Canon PowerShot SX 170                                                 |
| Canon PowerShot SX 200 IS                                              |
| Canon PowerShot SX 510 HS                                              |
| Canon PowerShot SX 520 HS                                              |
| Canon PowerShot SX110 IS                                               |
| Windows 7 (or superior) compatible webcams                             |
| Akiyama AkysCam-Plus                                                   |

### Pads de Assinatura

|                             |
| --------------------------- |
| MIP MSP-4300                |
| Topaz SigGem Color 5.7      |
| Topaz SignatureGem1X5       |
| Topaz SignatureGem4X5       |
| Topaz SignatureGemLCD       |
| Topaz SignatureGemLCD4X3New |
| Topaz SignatureGemLCD4X5    |
| Wacom STU-300               |
| Wacom STU-520               |
| Wacom STU-530               |
| Wacom STU-540               |
| Signotec Gamma              |
| Akiyama AK-560              |


# BCC Services

## Introdução

Esse documento descreve a configuração dos parâmetros, opções e valores padrão do BCC Services

## Localização do Arquivo

Em uma instalação padrão, o arquivo de configuração (`bcc-services.properties`) estará localizado em `C:\Griaule\BCC\conf`.

## Propriedades do Arquivo

O arquivo de configuração deve atender a alguns requisitos para ser interpretado corretamente. Esses requisitos são:

1. O nome e o local do arquivo devem ser exatamente como mencionados neste manual;

   > Parâmetros de configuração inválidos serão desconsiderados e um valor padrão será usado.
2. Deve haver exatamente um parâmetro de configuração por linha;
3. Cada parâmetro de configuração deve estar no formato `{parameter}={value}`, sem quebras de linha;

## Parâmetros de configuração <a href="#configuration-parameters" id="configuration-parameters"></a>

Esta seção descreve os parâmetros de configuração de `bcc-services.properties` que podem ser listados no arquivo de configuração e como eles afetam a operação do sistema.

### useFingerprintQualityLib <a href="#usefingerprintqualitylib" id="usefingerprintqualitylib"></a>

Este parâmetro define se a biblioteca de qualidade de impressão digital deve ser usada em capturas roladas.

**Valores possíveis:**

> * `true`
> * `false`

### useFingerprintSDKAsService <a href="#usefingerprintsdkasservice" id="usefingerprintsdkasservice"></a>

Este parâmetro define se a impressão digital é um serviço separado.

**Valores possíveis:**

> * `true`
> * `false`

{% hint style="warning" %}
Este parâmetro se aplica somente à versão de 32 bits.
{% endhint %}

### resetSDKOnCapture <a href="#reinitializesdkoncapture" id="reinitializesdkoncapture"></a>

Este parâmetro define se o aplicativo reinicializará o SDK de impressão digital em cada captura.

**Valores possíveis:**

> * `true`
> * `false`

### useChecksum <a href="#usechecksum" id="usechecksum"></a>

Este parâmetro define se a soma de verificação deve ser usada para importar e exportar arquivos.

**Valores possíveis:**

> * `true`
> * `false`

### useCryptography <a href="#usecryptography" id="usecryptography"></a>

Este parâmetro define se a criptografia deve ser usada para importar e exportar arquivos.

**Valores possíveis:**

> * `true`
> * `false`

### distance.crop.face

Este parâmetro define a resolução da largura x altura do rosto recortado.

**Valores possíveis:**

> * `CROP_480X640`
> * `CROP_1200X1600`

### templateFormat

Este parâmetro define o formato em que os modelos devem ser exportados.

**Valores possíveis:**

> * `ANSI`
> * `ISO`
> * `CLASSIC`
> * `DEFAULT`
> * `FORENSIC`
> * `GR001`
> * `GR002`
> * `GR003`
> * `GR006`
> * `GR007`

### useLabels <a href="#uselabels" id="uselabels"></a>

Este parâmetro define se os rótulos serão enviados ao GBDS.

**Valores possíveis:**

> * `true`
> * `false`

### enroll.labels

Este parâmetro define quais rótulos serão enviados ao GBDS quando `useLabels`definido como verdadeiro. É possível definir no máximo seis rótulos, que devem ser separados por vírgulas.

**Exemplo:**

> `enroll.labels=label1,label2,label3,label4,label5,label6`

### report.folder.path

Este parâmetro define o caminho da pasta para salvar relatórios automaticamente.

### ebts.exporting.enabled <a href="#ebts.exporting.enabled" id="ebts.exporting.enabled"></a>

Este parâmetro define se a exportação de EBTS será habilitada para BCC.

**Valores possíveis:**

> * `true`
> * `false`

### ebts.exporting.path

Este parâmetro define o caminho onde serão localizados os arquivos EBTS exportados.

### ebts.ori <a href="#ebts.ori" id="ebts.ori"></a>

Este parâmetro define o código do emissor do arquivo EBTS.

### gbds.keyStore.path <a href="#gbds.keystore.path" id="gbds.keystore.path"></a>

Caminho para o arquivo keystore. Este parâmetro é necessário se o aplicativo estiver se comunicando com o GBDS via SSL.

### gbds.keyStore.password <a href="#gbds.keystore.password" id="gbds.keystore.password"></a>

Arquivo de senhas criptografado do keystore. Este parâmetro é necessário se o aplicativo estiver se comunicando com o GBDS via SSL.

### gbds.trustStore.path <a href="#gbds.truststore.path" id="gbds.truststore.path"></a>

Caminho para o arquivo truststore. Este parâmetro é necessário se o aplicativo estiver se comunicando com o GBDS via SSL.

### gbds.trustStore.password <a href="#gbds.truststore.password" id="gbds.truststore.password"></a>

Arquivo de senha criptografado do truststore. Este parâmetro é necessário se o aplicativo estiver se comunicando com o GBDS via SSL.

### config.generalTabOnly <a href="#config.generaltabonly" id="config.generaltabonly"></a>

Este parâmetro, quando definido como verdadeiro, listará apenas a `General`guia nas guias de configurações no BCC, ocultando as outras.

**Valores possíveis:**

> * `true`
> * `false`

### responsible.fytech.quality

Este parâmetro define o limite mínimo de qualidade das capturas de impressões digitais do bebê responsável ao utilizar o sensor Fytech.

### baby.palm.fytech.quality <a href="#baby.palm.fytech.quality" id="baby.palm.fytech.quality"></a>

Este parâmetro define o limite mínimo de qualidade das capturas de impressões palmares do bebê ao utilizar o sensor Fytech.

**Valor padrão:**

> `65`

### capture.baby.fingerprints

Este parâmetro define se a impressão digital do bebê deve ser capturada.

**Valores possíveis:**

> * `true`
> * `false`

### baby.finger.fytech.quality

Este parâmetro define o limite mínimo de qualidade das capturas de impressões digitais do bebê ao utilizar o sensor Fytech.

### fytech.timeout

Este parâmetro define o tempo limite ao utilizar o sensor Fytech.

**Valor padrão:**

> `20`

### save.baby.palms.as.png

Este parâmetro define se as impressões das palmas das mãos do bebê devem ser salvas no formato .png.

**Valores possíveis:**

> * `true`
> * `false`

### bodyImageShapes

Este parâmetro define como será a seleção de partes do corpo para imagens auxiliares. Há dois valores possíveis: simplificado e completo. Simplificado selecionará uma área inteira (por exemplo, braço), enquanto completo dará ao usuário a possibilidade de selecionar uma área com nome anatômico mais específico.

**Valores possíveis:**

> * `true`
> * `false`

### minimun.biometrics

Este parâmetro define o número mínimo de dados biométricos necessários para realizar uma inscrição.

### minimum.real.captured.fingers

Este parâmetro define o número mínimo de dedos sem anomalia necessários para realizar um registro.

### maximum.anomalies

Este parâmetro define o número máximo de dedos com anomalia aceitos em uma operação de inscrição.

### application.modules

Este parâmetro define quais módulos do aplicativo estão instalados. Este parâmetro pode conter mais de um valor e os valores são delimitados por espaços.

**Valores possíveis:**

> * `FACE`
> * `SIGNATURE`
> * `PALM`
> * `AUXILIARY_IMAGES`
> * `IRISES`

**Exemplo:**

> `application.modules=FACE SIGNATURE PALM`

### match.sequence

Esta captura define se a captura das impressões digitais principais deve ser comparada com a captura de controle de sequência.

**Valores possíveis:**

> * `true`
> * `false`

### face.camera.type

Este parâmetro define qual tipo de câmera o aplicativo usará para capturar o rosto.

**Valores possíveis:**

> * `WEBCAM`
> * `CANON_EOS`
> * `CANON_POWERSHOT`

### face.webcam.device

Este parâmetro define o índice da webcam que será usada na captura de rosto. Se houver apenas uma webcam instalada, este número deve ser `0`.

### face.flash.mode <a href="#face.flash.mode" id="face.flash.mode"></a>

Este parâmetro define se a função flash será ativada ou não para captura de rosto.

**Valores possíveis:**

> * `ON`
> * `OFF`

Este parâmetro só funciona com câmeras Canon Powershot.

### face.camera.rotation

Este parâmetro define a rotação da imagem obtida pelo dispositivo de captura facial.

**Valores possíveis:**

> Qualquer inteiro de `0`até `359`.

### body.camera.type

Este parâmetro define qual tipo de câmera o aplicativo usará para capturar o corpo.

**Valores possíveis:**

> * `WEBCAM`
> * `CANON_EOS`
> * `CANON_POWERSHOT`

### body.webcam.device

Este parâmetro define o índice da webcam que será usada na captura corporal. Se houver apenas uma webcam instalada, este número deve ser `0`.

### body.flash.mode

Este parâmetro define se a função flash será ativada ou não para captura do corpo.

**Valores possíveis:**

> * `ON`
> * `OFF`

{% hint style="warning" %}
Este parâmetro só funciona com câmeras Canon Powershot.
{% endhint %}

### body.camera.rotation

Este parâmetro define a rotação da imagem obtida pelo dispositivo de captura corporal.

**Valores possíveis:**

> Qualquer inteiro de `0`até `359`.

### capture.type

Este parâmetro define o tipo de captura das principais capturas de impressões digitais.

**Valores possíveis:**

> * `FLAT`
> * `ROLLED`

### signature.type

Este parâmetro define qual bloco de assinatura Topaz será usado para capturar assinaturas.

**Valores possíveis:**

> * `SignatureGem1X5`
> * `SignatureGem4X5`
> * `SignatureGemLCD`
> * `SignatureGemLCD4X3New`
> * `SignatureGemLCD4X5`
> * `ClipGem`
> * `ClipGemLGL`

### signature.device

Este parâmetro define qual dispositivo de assinatura será usado.

**Valores possíveis:**

> * `WACOM`
> * `TOPAZ`
> * `MSP`
> * `SIGNOTEC`

### signature.imageType <a href="#signature.imagetype" id="signature.imagetype"></a>

Este parâmetro define em qual formato de imagem a assinatura será salva.

**Valores possíveis:**

> * `JPEG`
> * `TIFF`
> * `PNG`

### iris.device

Este parâmetro define qual dispositivo de íris será usado.

**Valores possíveis:**

> * `CROSSMATCH`
> * `IRITECH`
> * `HUMMINGBIRD`

### advance.mode

Este parâmetro define o avanço após uma captura. Se estiver definido como automático, avançará para a próxima captura após cada captura. Se estiver definido como semiautomático, exibirá uma tela com a captura para o operador, sendo necessário avançar manualmente a captura.

**Valores possíveis:**

> * `AUTOMATIC`
> * `SEMI_AUTOMATIC`

### sequenceControl.type <a href="#sequencecontrol.type" id="sequencecontrol.type"></a>

Este parâmetro define qual tipo de controle de sequência será utilizado. É possível configurar para captura 4-4-2, 2-2-1 e sem controle de sequência.

**Valores possíveis:**

> * `CTRL_221`
> * `CTRL_442`
> * `NONE`

### minQuality

Porcentagem mínima de qualidade do modelo de dedo a ser aceita.

**Valores possíveis:**

> Qualquer inteiro no intervalo de `0`a `100`.

### triesToAccept

Este parâmetro define o número de tentativas para habilitar a aceitação de modelos de dedo de baixa qualidade.

### whiteBalance.mode <a href="#whitebalance.mode" id="whitebalance.mode"></a>

Este parâmetro define a opção do modo de balanço de branco ao usar uma câmera profissional.

**Valores possíveis:**

> * `AUTO`
> * `CUSTOM`

### whiteBalance.blueAmber <a href="#whitebalance.blueamber" id="whitebalance.blueamber"></a>

Este parâmetro define a mudança azul-âmbar do balanço de branco quando o modo personalizado é ativado.

**Valores possíveis:**

> Qualquer inteiro no intervalo de `-9`a `9`.

### whiteBalance.greenMagenta <a href="#whitebalance.greenmagenta" id="whitebalance.greenmagenta"></a>

Este parâmetro define a mudança de verde para magenta do balanço de branco quando o modo personalizado é ativado.

**Valores possíveis:**

> Qualquer inteiro no intervalo de `-9`a `9`.

### processLiveView <a href="#processliveview" id="processliveview"></a>

Este parâmetro define se o brilho, o contraste e o zoom devem ser processados ​​no Live View.

{% hint style="warning" %}
Este parâmetro só funciona com câmeras Canon EOS.
{% endhint %}

**Valores possíveis:**

> * `true`
> * `false`

### nfiq.minimum

Este parâmetro define o valor mínimo de qualidade nfiq para aceitar uma captura.

A qualidade do NFIQ é um número inteiro no intervalo de 1 a 5 e um número baixo representa melhor qualidade.

### nfiq.action <a href="#nfiq.action" id="nfiq.action"></a>

Este parâmetro define a ação que o BCC tomará se a captura estiver acima da qualidade mínima do NFIQ. Manter manterá a captura, removerá a captura.

**Valores possíveis:**

> * `KEEP`
> * `REMOVE`

### nfiq.anomaly <a href="#nfiq.anomaly" id="nfiq.anomaly"></a>

Este parâmetro define como o BCC classificará uma captura que foi mantida quando o NFIQ de captura estava acima do mínimo.

**Valores possíveis:**

> * `NONE`
> * `LOW_QUALITY`
> * `AMPUTED`
> * `SCAR`
> * `MARK`
> * `IGNORED`
> * `DAMAGED`

### theme <a href="#theme" id="theme"></a>

Este parâmetro define o tema BCC.

**Valores possíveis:**

> * `DARK`
> * `LIGHT`

### theme.cor <a href="#theme.color" id="theme.color"></a>

Este parâmetro define a cor do tema BCC.

**Valores possíveis:**

> * `BLUE_GRAY`
> * `BLUE`
> * `BROWN`
> * `CYAN`
> * `DEEP_PURPLE`
> * `GREY`
> * `INDIGO`
> * `LIGHT_GREEN`
> * `ORANGE`
> * `PINK`
> * `RED`
> * `TEAL`

### cropImages

Este parâmetro define se o BCC deve cortar as capturas de impressões digitais e as exportações de imagens. Se falso, a imagem permanecerá como obtida pela captura/do perfil.

**Valores possíveis:**

> * `true`
> * `false`

### jpegQuality

Este parâmetro define a qualidade de todas as imagens .jpeg geradas ou manipuladas.

**Valores possíveis:**

> Qualquer inteiro no intervalo de `0`a `100`.

### signatureBitDepth

Este parâmetro define a profundidade de bits da imagem de assinatura.

**Valores possíveis:**

> * `GREYSCALE`(8 bits)
> * `COLOR`(24 bits)

### anomalySetType

Este parâmetro define o tipo de seleção da anomalia que pode ser classificada pelo usuário no BCC. Há dois valores possíveis: simplificado e técnico.

Simplificado, terá valores mais genéricos como "AMPUTADO, CICATRIZ, MARCA DANIFICADA".

Técnico terá valores mais específicos para a anomalia, permitindo ao usuário selecionar a causa da anomalia.

**Valores possíveis:**

> * `SIMPLIFIED`
> * `TECHNICAL`

### fingerVerifyThresold.\<finger> <a href="#fingerverifythresold.less-than-finger-greater-than" id="fingerverifythresold.less-than-finger-greater-than"></a>

Este parâmetro permite que o usuário defina um limite de verificação para dedos individuais.

Cada dedo pode ter seu limite e para cada dedo, esse parâmetro deve ser repetido com o nome do dedo.

Este parâmetro é válido para o DEDO e será aplicado no dedo de AMBAS AS MÃOS.

**Exemplo:**

`fingerVerifyThresold.little=15`

`fingerVerifyThresold.ring=15`

`fingerVerifyThresold.middle=15`

`fingerVerifyThresold.index=15`

`fingerVerifyThresold.thumb=15`

### fingerVerifyThresold.default <a href="#fingerverifythresold.default" id="fingerverifythresold.default"></a>

Este parâmetro permite que o usuário defina os limites globais de verificação para impressões digitais.

Se nenhum limite individual for usado, o limite padrão será usado.

### faceVerifyThresold.default <a href="#faceverifythresold.default" id="faceverifythresold.default"></a>

Este parâmetro define o limite de verificação facial.

### sequência221 <a href="#sequence221" id="sequence221"></a>

Este parâmetro define a ordem de captura para o controle de sequência 2-2-1. Cada dedo é delimitado por espaço e a captura é delimitada por vírgula.

**Valores possíveis:**

Podem ser utilizados nomes de dedos ou índices dos dedos como valores, conforme mostrado abaixo:

| Nome do dedo  | Índice |
| ------------- | ------ |
| left\_little  | 0      |
| left\_ring    | 1      |
| left\_middle  | 2      |
| left\_index   | 3      |
| left\_thumb   | 4      |
| right\_thumb  | 5      |
| right\_index  | 6      |
| right\_middle | 7      |
| right\_ring   | 8      |
| right\_little | 9      |

**Exemplo**

Para definir a seguinte sequência de captura:

> * Mínimo esquerdo e anelar esquerdo
> * Médio esquerdo e indicador esquerdo
> * Polegar esquerdo
> * Anelar direito e mínimo direito
> * Indicador direito e médio direito
> * Polegar direito

O parâmetro deve ser uma das duas opções:

`sequence221=LEFT_LITTLE,LEFT_RING LEFT_MIDDLE,LEFT_INDEX LEFT_THUMB RIGHT_RING,RIGHT_LITTLE RIGHT_INDEX,RIGHT_MIDDLE RIGHT_THUMB`

`sequence221=0,1 2,3 4 8,9 6,7 5`

### sequência442 <a href="#sequence442" id="sequence442"></a>

Este parâmetro define a ordem de captura para o controle de sequência 4-4-2. Cada dedo é delimitado por espaço e a captura é delimitada por vírgula.

**Valores possíveis:**

Podem ser utilizados nomes de dedos ou índices dos dedos como valores, conforme mostrado abaixo:

| Nome do dedo  | Índice |
| ------------- | ------ |
| left\_little  | 0      |
| left\_ring    | 1      |
| left\_middle  | 2      |
| left\_index   | 3      |
| left\_thumb   | 4      |
| right\_thumb  | 5      |
| right\_index  | 6      |
| right\_middle | 7      |
| right\_ring   | 8      |
| right\_little | 9      |

**Exemplo**

Para definir a seguinte sequência de captura:

> * Mínimo esquerdo e anelar esquerdo, médio esquerdo e indicador esquerdo
> * Anelar direito e mínimo direito, indicador direito e médio direito
> * Polegar esquerdo e polegar direito

O parâmetro deve ser uma das duas opções:

`sequence442=LEFT_LITTLE,LEFT_RING,LEFT_MIDDLE,LEFT_INDEX RIGHT_INDEX,RIGHT_MIDDLE,RIGHT_RING,RIGHT_LITTLE LEFT_THUMB,RIGHT_THUMB`

`sequence442=0,1,2,3 6,7,8,9 4,5`

### sequenceMain

Este parâmetro define a sequência de captura das impressões digitais principais. Cada captura de impressão digital é delimitada por espaço.

**Valores possíveis:**

Podem ser utilizados nomes de dedos ou indicadores dos dedos como valores, conforme mostrado abaixo:

| Nome do dedo  | Índice |
| ------------- | ------ |
| left\_little  | 0      |
| left\_ring    | 1      |
| left\_middle  | 2      |
| left\_index   | 3      |
| left\_thumb   | 4      |
| right\_thumb  | 5      |
| right\_index  | 6      |
| right\_middle | 7      |
| right\_ring   | 8      |
| right\_little | 9      |

**Exemplo**

Para definir uma sequência de captura, insira os nomes dos indicadores ou dedos conforme mostrado abaixo:

`sequenceMain=LEFT_LITTLE LEFT_RING LEFT_MIDDLE LEFT_INDEX LEFT_THUMB RIGHT_THUMB RIGHT_INDEX RIGHT_MIDDLE RIGHT_RING RIGHT_LITTLE`

`sequenceMain=0 1 2 3 4 5 6 7 8 9`

### sequencePalm

Este parâmetro define a sequência de captura para a captura da palma. Cada captura da impressão palmar é delimitada por espaços.

**Valores possíveis:**

| Área da Palma       | Índice |
| ------------------- | ------ |
| left\_interdigital  | 31     |
| left\_thenar        | 32     |
| left\_hypothenar    | 33     |
| right\_interdigital | 34     |
| right\_thenar       | 35     |
| right\_hypothenar   | 36     |
| left\_full          | 40     |
| left\_writer        | 41     |
| right\_full         | 45     |
| right\_writer       | 46     |

**Exemplo**

Para definir a seguinte sequência de captura:

> * Interdigital esquerdo
> * Tenar esquerdo
> * Interdigital direito
> * Tenar direito

O parâmetro deve ser uma das duas opções:

`sequencePalm=LEFT_INTERDIGITAL LEFT_THENAR RIGHT_INTERDIGITAL RIGHT_THENAR`

`sequencePalm=31 32 34 35`

### babySequencePalm <a href="#babysequencepalm" id="babysequencepalm"></a>

Este parâmetro define a sequência de captura para a captura da palma da mão do bebê. Cada captura de impressão palmar é delimitada por espaço.

O BCC permite realizar duas capturas da mesma palma. A melhor será enviada como captura principal e a outra como imagem auxiliar.

| Área de Palmar | Índice |
| -------------- | ------ |
| left\_palm     | 200    |
| left\_palm\_2  | 201    |
| right\_palm    | 210    |
| right\_palm\_2 | 211    |

**Valores possíveis:**

> * `LEFT_PALM`
> * `LEFT_PALM2`
> * `RIGHT_PALM`
> * `RIGHT_PALM2`

### minutiaOrientation

Este parâmetro define de que forma o BCC mostrará o indicador de ângulo de minúcias.

**Valores possíveis:**

> * `DEFAULT`
> * `ISO`


# ETR

## Introdução

O **GBS ETR (Exception Treatment)** é uma aplicação web para especialistas em biometria que auxilia no processo de tratamento de exceções geradas pelo GBDS. Este software permite que perfis em exceção sejam comparados em uma interface limpa e intuitiva.

Esse manual está atualizado para a versão 3.1.4 do ETR.

{% hint style="warning" %}
Se você está utilizando a versão **4.0.0** ou superior do ETR, consulte o manual: [GBS ETR 4.0.0](/aplicacoes/etr_4_0_0).
{% endhint %}

### Acesso e Autenticação

O GBS ETR deve ser acessado com um navegador web, e o Google Chrome é a opção recomendada. A URL para acesso é específica a cada instalação. Se necessário, entre em contato com o suporte da Griaule para obter a URL correta.

Para acessar a aplicação é necessário se autenticar. As credenciais exigidas pelo ETR são usuário e senha.

![Tela de login](/files/at5eyBcNSbB2Bw0cKxWQ)

### Autenticação de dois fatores (2FA)

Quando a autenticação de dois fatores (2FA) estiver ligada, na primeira vez que você fizer login, após entrar seu username e senha, será mostrado um QR Code que deve ser registrado no Google Authenticator.

{% hint style="info" %}
Google Authenticator é um gerador de códigos de autenticação disponível como um aplicativo para smartphones [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\&hl=en\&gl=US) e [iOS](https://apps.apple.com/us/app/google-authenticator/id388497605).
{% endhint %}

![QR Code do Google authenticator para autenticação de dois fatores](/files/d7oTx9pIqHjGc1BQozRs)

Após registrar com sucesso o QR Code no Google Authenticator, insira o código de seis dígitos gerado e clique em Enviar.

Você só precisará registrar o QR Code uma vez. Mas, a cada login subsequente, você precisará inserir o código de seis dígitos gerado pelo Google Authenticator.

![Autenticação de dois fatores](/files/p1dOcshMKtGNA46xJvvv)

Existe um número limitado de tentativas de login sem sucesso que um usuário pode fazer. Sempre que um código incorreto é inserido, uma mensagem de erro será exibida:

![Autenticação de dois fatores - código incorreto](/files/AlvvQ4M3ZU7roQDh0g76)

Se você atingir o número máximo de tentativas de login sem sucesso, sua conta será automaticamente bloqueada.

![Autenticação de dois fatores - conta bloqueada](/files/MrBni4BpB7qdKOXEMMgV)

{% hint style="warning" %}
Se sua conta for bloqueada, entre em contato com o administrador do sistema.
{% endhint %}

### Logins Simultâneos e Cadastro de Navegador

Apenas uma sessão por usuário é permitida. Não é possível fazer login simultaneamente com um mesmo perfil mais de uma vez na aplicação. Se um usuário já estiver conectado e outro acesso acontecer usando o mesmo nome de usuário e senha, o usuário com a sessão mais antiga será notificado e desconectado na próxima ação.

![](/files/G8RG3Geun4Cj0UwBDwHk)

Além disso, apenas um navegador pode ser usado de cada vez. Ao tentar fazer login usando um navegador diferente, o usuário será informado que é necessário autenticar o novo navegador. A autenticação de um novo navegador revogará o acesso do navegador anterior.

![](/files/9hGArbrxLBVqu8CMtLWV)

Para autenticar um novo navegador, clique em Autenticar e, em seguida, insira o código de verificação que será enviado para o e-mail vinculado à conta do usuário.

![](/files/kXUn2FcBPVTF1i3JLz62)

Se a autenticação for bem-sucedida, uma notificação aparecerá no canto superior direito da tela após o login.

![](/files/dwvLNoUpEn6wvVXjo2Qr)

### Alterar ou Redefinir Senha

Por motivos de segurança, você pode alterar sua senha ou redefini-la caso a esqueça.

#### Alterar Senha

Para alterar sua senha, após fazer login, passe o mouse sobre seu nome de usuário no canto superior direito da tela e clique em Alterar senha.

![](/files/ao5sR5RItLGvIlfvUZMo)

Em seguida, insira a senha atual e a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a alteração, clique em Alterar senha.

![](/files/8Hg10QnYXiQSdQOCpC42)

#### Redefinir Senha

Para redefinir sua senha, na tela de login, clique em Esqueceu sua senha?:

![](/files/SgxGVMMgIYjDTG00FZEU)

Em seguida, insira o nome de usuário do perfil e clique em Enviar.

![](/files/SKyV3BdEaCFMhAZX6sh4)

Um e-mail contendo um código de verificação será enviado para o endereço de e-mail vinculado a esse perfil. Insira o código de verificação e clique em Enviar código.

![](/files/xkeAIvE593TT7k72q3s9)

Se o código estiver correto, você poderá criar uma nova senha. Insira a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a redefinição, clique em Redefinir senha.

![](/files/CYysD04WJkoVZ246WQWw)

## Interface do Usuário

### Lista de Exceções

A lista de exceções, por padrão, lista todas as exceções pendentes, o que inclui os status `Análise`, `Revisão` e `Divergente`. Os dois últimos estão disponíveis apenas quando o recurso *Duplo-Cego* está habilitado (mais informações em [Duplo-Cego](#duplo-cego)). O status `Tratado` também pode ser exibido se for selecionado nos filtros.

Para cada status possível, as exceções são ordenadas crescentemente por data.

![Lista de Exceções](/files/M221SSkgI9clvVNJk9oc)

#### Filtros

Na barra superior há diversos tipos de filtros:

* Período;
* Tipo de Exceção: `Todos`, `Cadastro`, `Atualização`;
* Status: `Todos`, `Pendentes`, `Análise`, `Revisão`, `Divergente`, `Tratado`;
* Texto de busca, para restringir por chave, campo biográfico ou label; Esse filtro ignore os filtros de status e tipo de exceção;
* TGUID: quando aplicado, anula os demais filtros;
* Responsável: filtra por usuário responsável pela exceção;
* external: filtra por uma chave externa.

{% hint style="info" %}
O filtro **external** pode não aparecer ou pode ter um nome diferente em seu ambiente.
{% endhint %}

![filters](/files/eUwO6GGZCSfESxxA7Q6D)

Quando um ou mais filtros são aplicados, eles são mostrados no topo da lista. É possível remover rapidamente cada filtro individualmente, ou todos de uma vez.

![remove filters buttons](/files/jH3uUGnfQbXX2cS3j9i3)

**Status:**

* Análise:

  > Exceções que ainda não foram analisadas (pendentes, sem decisão de tratamento).
* Tratado:

  > Exceções que foram analisadas e tiveram uma decisão de tratamento. Perfis no GBDS podem ser afetados pela decisão.
* Revisão:

  > Presente apenas quando duplo-cego está ativo. Exceções neste estado já foram analisadas por um especialista, mas ainda exigem análise de outro especialista.
* Divergente:

  > Presente apenas quando duplo-cego está ativo. Exceções com decisões de tratamento divergentes são listadas como **Divergente**. Um especialista supervisor precisa decidir o tratamento adequado.

**Grupos de Status:**

* Pendente:

  > Todas as exceções que exigem algum tipo de análise. Inclui Análise, Revisão e Divergente.
* Todos:

  > Todos os os possíveis valores de status descritos acima.

#### Item de Exceção

Cada item na lista é clicável e associado a uma exceção.

![Item de exceção](/files/ZN593AoXC1tbFELhJ6gK)

Quando uma exceção nunca foi acessada por um usuário, aparecerá o símbolo com fundo transparente. Depois de acessada, **Exceções de Atualização** terão fundo azul e **Exceções de Cadastro**, fundo verde. O usuário também pode identificar o tipo de exceção pelo símbolo de `atualizar` nas **Exceções de Atualização** e um símbolo de soma nas **Exceções de Cadastro**.

A data e hora reportados indicam quando a exceção foi gerada, se estiver pendente. Para exceções com status `Tratado`, a data e hora indicam o momento em que o tratamento foi efetivado.

A informação `Original` é associada ao perfil pré-existente que casou com o novo perfil. `Exceção` é o perfil entrante cuja tentativa de cadastro ou atualização gerou a exceção. Os campos exibidos são configuráveis. Se nenhum campo estiver disponível, o PGUID indica a informação do perfil original e o TGUID indica o perfil de exceção.

Por fim, à direita é exibido o status da exceção, que pode ser um dos seguintes:

* Análise (Amarelo)
* Revisão (Laranja)
* Divergente (Vermelho)
* Tratado (Verde)

#### Menu

O menu pode ser aberto passando o mouse em cima no nome do usuário no canto superior direito da tela.

As opções disponíveis são:

* Configurações
* Manual
* Mudar Senha
* Sair

![menu](/files/qvOp71yCXtYoK6aXBl7C)

### Detalhes da Exceção

Quando uma exceção é clicada na lista de exceções, ou quando um link direto para uma exceção é clicado, a aplicação exibe a tela de detalhes da exceção. Esta tela exibe **toda informação necessária** para o tratamento da exceção e oferece **todas as ações possíveis** para tratamento.

![Detalhe da Exceção](/files/CxckncLm7ZNzOAOHWIBB)

Esta tela pode ser dividida nas seguintes seções:

#### Informação Geral

Este painel mostra dados gerais sobre a exceções, como:

* **Tipo de Exceção**

  > * Cadastro
  > * Atualização
* **Informação da Exceção**

  > * Data da criação (ou resolução)
  > * Perito
* **Status da Exceção**

  > * Análise
  > * Revisão
  > * Divergente
  > * Tratado
* **Botão de Ação**

  > * Botão de voltar para a lista de exceções.

![Informação Geral](/files/flgUyfYBJRX9THGGEYJR)

#### Fichas de Perfis

Esta tela sempre exibirá dois painéis lado a lado, um para cada perfil. O painel *esquerdo* representa o **Perfil Original** (pré-existente na base de dados) e o *direito* representa o **Perfil de Exceção** (cuja submissão gerou a exceção, também chamado de perfil entrante).

![Fichas de Perfis](/files/Pk7Ud0Gujxpcg9Chagbj)

O *painel do perfil* pode ser dividido em duas partes:

**Dados Biográficos:**

Esta seção exibe todas as *chaves* e *dados biográficos* do perfil e é exibida no *topo* do painel. A seção também pode ter *labels* do perfil, se estiverem configuradas. Nesta seção, a foto facial do perfil pode ser exibida à esquerda, dependendo da configuração.

**Biometrias:**

Esta seção contem todas as *imagens biométricas* do perfil e é exibida na parte *de baixo* do painel. Cada aba representa um tipo de biometria, entre **digitais**, **palmares**, **íris** e **assinatura**. O ambiente deve ter pelo menos um tipo de biometria configurado. Esta seção também inclui uma guia para imagens auxiliares, como *mugshots*, cicatrizes, marcas e tatuagens, se disponíveis.

Os detalhes das imagens biométricas já carregadas podem ser exibidos com um clique sobre cada imagem. Também é possível arrastar e soltar uma biometria sobre outra de um perfil distinto. Esta ação abrirá uma nova tela que permitirá a comparação lado a lado das duas biometrias. Este recurso é descrito em maiores detalhes na seção [Comparação Biométrica](#comparacao-biometrica).

Eventualmente, podem ocorrer erros ao carregar imagens biométricas. Isto indica que o perfil tem a biometria cadastrada, mas a imagem não pode ser carregada por algum erro no servidor.

Neste caso, serão exibidos sobre as imagens afetadas uma mensagem de erro e um botão para tentar novamente o carregamento. Em caso de sucesso, as imagens serão exibidas corretamente. Se os erros persistirem, entre em contato com o suporte da Griaule.

{% hint style="warning" %}
Nesta tela, os dados que apresentam inconsistência entre os perfis são destacados com uma **borda vermelha**. Este destaque indica que a comparação entre as informações dos perfis **difere do que era esperado** e deve ser interpretado de acordo com o tipo de exceção:

**Exceção de Cadastro**: indica que as informações do perfil de exceção **correspondem** às do perfil original, mas o esperado é que não correspondessem, isto é, que o perfil sendo cadastrado fosse diferente de todos os outros que já estão na base de dados.

**Exceção de Atualização**: indica que as informações do perfil de exceção **não correspondem** às do perfil original, mas o esperado é que correspondessem, isto é, que o perfil entrante apresentasse match positivo com o perfil sendo atualizado.
{% endhint %}

#### Ações Possíveis

As ações possíveis para a exceção são exibidas em um painel na parte inferior da tela, com botões para realizar o tratamento, como:

* Tratar como Biometrias diferentes;
* Tratar como Cadastro incorreto;
* Tratar como Recoletar;
* Tratar como Mesmas biometrias;
* Tratar como Unificar perfis.

![possible actions buttons](/files/OeD0QbuvYlYKLeIiPkR4)

As ações possíveis podem gerar os seguintes resultados:

* Manter perfis (destaque verde)
* Rejeitar um perfil e aceitar outro (o perfil rejeitado terá destaque vermelho)
* Mesclar dados de perfil (destaque verde)
* Resultado `Desconhecido`. O perfil de exceção será **rejeitado** e ações adicionais serão necessárias. (Destaque amarelo)

Em alguns casos, as opções Aprovar e Rejeitar podem estar disponíveis. Estas opções podem ser configuradas para ações diferentes. O destaque do perfil irá indicar quando um perfil será mantido ou descartado.

{% hint style="info" %}
Verifique suas regras de negócio para entender os procedimentos corretos para o tratamento.
{% endhint %}

#### Seleção de Biometrias

Quando **Exceções de Cadastro** são tratadas com Unificar perfis ou **Exceções de Atualização**, com Mesmas biometrias, é possível escolher as biometrias que serão mantidas e usadas pelo GBDS como referências para match com aquele perfil (as outras biometrias serão descartadas).

![select biometrics pop-up menu](/files/0UVSINIEiMJRSoMACM3c) ![select biometrics pop-up menu](/files/eQFsQpwgxSeeVGdd5TPN)

{% hint style="info" %}
Essa opção só estará disponível se habilitada nos arquivos de configuração. Entre em contato com seu administrador de sistema para verificar a disponibilidade no seu ambiente.
{% endhint %}

Depois de selecionar uma biometria, para navegar para outras biometrias que precisam ser selecionadas, use as setas de `esquerda` e `direita` no teclado ou clique nos botões Anterior e Próximo na parte inferior da tela.

No lado esquerdo da tela, as cores os ícones das biometrias indicam seu estado de seleção:

* Branco: nenhuma biometria foi selecionada, aguardando decisão.
* Cinza: biometrias sendo mostradas na tela neste momento.
* Verde: biometria selecionada, uma decisão foi tomada.

![select biometrics status](/files/gjGsHFYWvJSGOXgPUmdj)

Se um dos perfis não contiver alguma das biometrias, as biometrias (se disponíveis) do outro perfil serão automaticamente selecionadas:

![automatic selection when missing traits](/files/WSjhbIfRGVF87EceELEl) ![automatic selection when missing traits](/files/U8Nxxde6E2zFWjc9zX3B)

Note que, para cada par de biometrias mostradas, existem diversas opções de visualização, como zoom, deslocamento e rotação, além de opções para mostrar minúcias e singularidades. Mais informações sobre essas opções podem ser encontradas na seção [Visualizando Imagens](#visualizando-imagens).

#### Exceção Relacionada

Alguns perfis podem ter mais de uma exceção associada. Quando isso acontecer, uma nova barra lateral será adicionada ao lado esquerdo da tela.

![menu](/files/UtFlTsyaBO03t6eTcQQe) ![menu](/files/REkClCkxrbQO33rOsF0W)

Você pode navegar pelas exceções clicando no número ou expandindo a barra lateral clicando no botão >>.

Você também pode exportar todas as exceções relacionadas clicando em Exportar PDF -> Todas as exceções.

{% hint style="warning" %}
Ao exportar mais de uma exceção, o ETR tentará abrir tantas páginas do navegador quantos os perfis de exceção que você tiver. Essa ação às vezes é bloqueada pelo navegador e você deve permitir que a página do ETR abra os pop-ups para usar corretamente essa funcionalidade.
{% endhint %}

Exceções relacionadas podem ocorrer em transações de atualização quando o sistema utiliza múltiplas chaves únicas. Neste cenário, as opções de tratamento serão reduzidas para Aprovar, Rejeitar e Recoletar.

Se uma exceção relacionada de atualização for aprovada, as outras devem, **obrigatoriamente**, ser rejeitadas, enquanto recoletar deve ser aplicado a todas as exceções relacionadas.

{% hint style="info" %}
Todos os tratamentos escolhidos para exceções relacionadas são salvos durante o fluxo de trabalho. No entanto, **os tratamentos só são aplicados às transações após todas as exceções relacionadas no grupo receberem um tratamento**.
{% endhint %}

### Comparação Biométrica

Ao clicar uma das biometrias (face, digital, palmar, íris ou assinatura), uma janela modal será exibida comparando lado a lado a biometria do perfil original (à esquerda) com a biometria correspondente do perfil que gerou a exceção (à direita).

Se um dos perfis não tiver a biometria correspondente, será apresentado um campo vazio.

![comparação biométrica](/files/hu1rkVCNfXYw786ZWXW1)

É possível trocar a biometria selecionando um novo item no menu dropdown.

#### Visualizando Imagens

Há diversas opções para personalizar a visualização de imagens:

![image viewing options](/files/wgriVfazfRVbBSjOm1AX)

* Ampliação (Zoom)

  > Por padrão, as imagens são ajustadas automaticamente para ocuparem todo o espaço disponível na janela de visualização. O usuário pode alterar a ampliação (zoom) usando a roda do mouse.
* Deslocamento (Pan)

  > Quando a opção `Mover imagem` estiver selecionada, o usuário pode arrastar as imagens com o botão **esquerdo** do mouse para deslocar a região visível (pan). Essa operação só é possível quando o tamanho da imagem é superior ao tamanho da janela de visualização. Se a opção `Rotacionar imagem` estiver selecionada, é possível deslocar a imagem utilizando o botão **direito** do mouse.
* Rotação

  > O usuário pode rotacionar a imagem selecionando a opção `Rotacionar imagem` e clicando e arrastando a imagem com o botão **direito** do mouse.
* Mostrar/esconder minúcias

  > Se essa opção for selecionada, as duas imagens mostrarão todas as minúcias detectadas. Cada minúcia é destacada com uma cor de acordo com seu score de qualidade (azul para boa qualidade, amarelo para média e vermelho para baixa qualidade).
* Mostrar/esconder núcleos e deltas

  > Se essa opção for selecionada, as duas imagens mostrarão os núcleos e/ou deltas detectados.
* Sincronizar zoom e deslocamento

  > Se esta opção estiver ativada, as duas imagens sempre terão a mesma ampliação e posicionamento.
* Quantidade de matches mostrados

  > Se essa opção for selecionada, as duas imagens mostrarão os matches (minúcias coincidentes) destacados em verde. A quantidade de minúcias mostradas pode ser selecionada arrastando o controle deslizante.

  ![show matching minutiae](/files/kwUVtlnHRBCeQ420A2pp)

#### Qualidade

Abaixo de cada imagem, quando disponível, um valor de qualidade na faixa de 0% a 100% será exibido. A qualidade é classificada nas seguintes faixas:

* **0 - 20%**: Muito Baixa (Laranja)
* **21% - 40%**: Baixa (Amarelo)
* **41% - 60%**: Média (Azul)
* **61% - 80%**: Boa (Verde Claro)
* **81% - 100%**: Muito Boa (Verde Escuro)

### Remover uma Biometria

**Tendo as permissões apropriadas**, é possível remover uma biometria de um perfil antes de tratar a exceção. Para isso, passe o mouse sobre a biometria e clique no ícone de lixeira no canto superior direito da biometria. Em seguida, confirme a ação clicando em Remover.

![remove biometric trait](/files/HM0vNv5c59tAbLwVnj4b)

Após a remoção, o texto "Biometria removida" aparecerá no lugar da biometria removida. É possível reverter a ação restaurando a biometria. Para isso, passe o mouse sobre a biometria removida e, no canto superior direito, clique no botão de restaurar. Em seguida, confirme a ação clicando em Restaurar.

![restore biometric trait](/files/pUfwau4zDMHbI5w7DE0u)

### Configurações

Esta tela permite a configuração de quatro opções pelo usuário:

* Tema: **claro** ou **escuro**;
* Idioma;
* Formato de Data: **dd/mm/aaaa**, **mm/dd/aaaa** ou **aaaa/mm/dd**;
* Formato de Hora: **12-horas (AM/PM)** ou **24-horas**;
* Cor de destaque do casamento.

Além de mostrar as versões do GBS ETR e GBS Common Server.

![Configurações](/files/2ptJBl5XvTLff5OhK2eY)

## Fluxos

### Fluxo Padrão

O fluxo padrão para tratar uma exceção é mostrado abaixo:

1. Fazer login na aplicação
2. Abrir exceção pendente
3. Comparar as imagens de cada perfil
4. Adicionar comentário (se desejado)
5. Exportar para PDF (se desejado)
6. Decidir como tratar a exceção (*Mesmas biometrias*, *Biometrias diferentes*, *Cadastro Incorreto*, *Recoletar* ou *Unificar*)

{% hint style="info" %}
Em alguns casos, *Aprovar* e *Rejeitar* também podem ser opções para tratar uma exceção.
{% endhint %}

A próxima seção descreve os tipos de tratamento permitidos.

### Tratar Exceção

Finalmente, o perito pode escolher como tratar a exceção.

Há 5 tratamentos possíveis, dependendo da resolução desejada para a exceção, descritos na tabela abaixo:

<table><thead><tr><th width="180">Tratamento</th><th>Transação de Cadastro</th><th>Transação de Atualização</th></tr></thead><tbody><tr><td><strong>Biometrias diferentes</strong></td><td>Indica que o cadastro entrante possui biometrias diferentes daquelas do perfil já presente na base (falso positivo).</td><td>Não aceita os dados biométricos da nova transação.</td></tr><tr><td><strong>Cadastro Incorreto</strong></td><td>Não recomendável.</td><td>O cadastro original é cancelado e o novo cadastro é aceito.</td></tr><tr><td><strong>Recoletar</strong></td><td>Descarta a transação que gerou a exceção.</td><td>Descarta a transação que gerou a exceção.</td></tr><tr><td><strong>Mesmas Biometrias</strong></td><td>Indica que o cadastro entrante possui biometrias que casam com o perfil já presente na base.</td><td>Aceita os dados biométricos da nova transação.</td></tr><tr><td><strong>Unificar</strong></td><td>Unifica a transação original com a nova, adicionando os dados biográficos e biométricos da nova transação ao cadastro existente.</td><td>Não recomendável.</td></tr></tbody></table>

{% hint style="info" %}
Em alguns casos, *Aprovar* e *Rejeitar* também podem ser opções para tratar uma exceção.
{% endhint %}

**Transação Original:**

> A transação que que já estava cadastrada na base de dados.

**Transação Nova:**

> A transação que gerou a exceção e está aguardando tratamento no ETR.

## Duplo-Cego

### GBS ETR Server

O recurso duplo-cego requer que o GBS ETR Server esteja instalado e em operação. Entre em contato com o suporte da Griaule se precisar de ajuda para instalar este componente.

### Fluxos com GBS ETR Server

O GBS ETR Server atualizará frequentemente a base com as exceções listadas no GBDS, após assumir a revisão das exceções para ele mesmo.

Ao listar exceções, o GBS ETR Server exibirá:

1. Exceções que não têm decisões.
2. Exceções com apenas uma decisão, feita por um usuário diferente do atual (status `Revisão`)
3. Exceções com duas decisões divergentes, se o usuário atual for um supervisor (status `Divergente`)

Para cada exceção recebida pelo GBS ETR Server, o seguinte pode ocorrer após o usuário aplicar uma decisão de tratamento:

* Se a decisão foi a primeira daquela exceção, a exceção ainda será exibida para outros usuários.
* Se a decisão foi a segunda daquela exceção, e o tratamento é o mesmo da primeira, a decisão é final e a exceção será marcada como tratada.
* Se a decisão foi a segunda daquela exceção, e o tratamento é diferente da primeira, a decisão não é final e a exceção será exibida apenas para usuários supervisores.
* Se a decisão foi a terceira daquela exceção, tomada por um supervisor, a decisão é final e a exceção será marcada como tratada.


# ETR 4.0.0

## Introdução

O **GBS ETR (Exception Treatment)** é uma aplicação web para especialistas em biometria que auxilia no processo de tratamento de exceções geradas pelo GBDS. Este software permite que perfis em exceção sejam comparados em uma interface limpa e intuitiva.

Esse manual está atualizado para a **versão 4.0.0 do ETR**.

### Acesso e Autenticação

O GBS ETR deve ser acessado com um navegador web, e o Google Chrome é a opção recomendada. A URL para acesso é específica a cada instalação. Se necessário, entre em contato com o suporte da Griaule para obter a URL correta.

Para acessar a aplicação é necessário se autenticar. As credenciais exigidas pelo ETR são usuário e senha.

![Tela de login](/files/at5eyBcNSbB2Bw0cKxWQ)

### Autenticação de dois fatores (2FA)

Quando a autenticação de dois fatores (2FA) estiver ligada, na primeira vez que você fizer login, após entrar seu username e senha, será mostrado um QR Code que deve ser registrado no Google Authenticator.

{% hint style="info" %}
Google Authenticator é um gerador de códigos de autenticação disponível como um aplicativo para smartphones [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\&hl=en\&gl=US) e [iOS](https://apps.apple.com/us/app/google-authenticator/id388497605).
{% endhint %}

![QR Code do Google authenticator para autenticação de dois fatores](/files/d7oTx9pIqHjGc1BQozRs)

Após registrar com sucesso o QR Code no Google Authenticator, insira o código de seis dígitos gerado e clique em Enviar.

Você só precisará registrar o QR Code uma vez. Mas, a cada login subsequente, você precisará inserir o código de seis dígitos gerado pelo Google Authenticator.

![Autenticação de dois fatores](/files/p1dOcshMKtGNA46xJvvv)

Existe um número limitado de tentativas de login sem sucesso que um usuário pode fazer. Sempre que um código incorreto é inserido, uma mensagem de erro será exibida:

![Autenticação de dois fatores - código incorreto](/files/AlvvQ4M3ZU7roQDh0g76)

Se você atingir o número máximo de tentativas de login sem sucesso, sua conta será automaticamente bloqueada.

![Autenticação de dois fatores - conta bloqueada](/files/MrBni4BpB7qdKOXEMMgV)

{% hint style="warning" %}
Se sua conta for bloqueada, entre em contato com o administrador do sistema.
{% endhint %}

### Logins Simultâneos e Cadastro de Navegador

Apenas uma sessão por usuário é permitida. Não é possível fazer login simultaneamente com um mesmo perfil mais de uma vez na aplicação. Se um usuário já estiver conectado e outro acesso acontecer usando o mesmo nome de usuário e senha, o usuário com a sessão mais antiga será notificado e desconectado na próxima ação.

![](/files/G8RG3Geun4Cj0UwBDwHk)

Além disso, apenas um navegador pode ser usado de cada vez. Ao tentar fazer login usando um navegador diferente, o usuário será informado que é necessário autenticar o novo navegador. A autenticação de um novo navegador revogará o acesso do navegador anterior.

![](/files/9hGArbrxLBVqu8CMtLWV)

Para autenticar um novo navegador, clique em Autenticar e, em seguida, insira o código de verificação que será enviado para o e-mail vinculado à conta do usuário.

![](/files/kXUn2FcBPVTF1i3JLz62)

Se a autenticação for bem-sucedida, uma notificação aparecerá no canto superior direito da tela após o login.

![](/files/dwvLNoUpEn6wvVXjo2Qr)

### Alterar ou Redefinir Senha

Por motivos de segurança, você pode alterar sua senha ou redefini-la caso a esqueça.

#### Alterar Senha

Para alterar sua senha, após fazer login, passe o mouse sobre seu nome de usuário no canto superior direito da tela e clique em Alterar senha.

![](/files/ao5sR5RItLGvIlfvUZMo)

Em seguida, insira a senha atual e a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a alteração, clique em Alterar senha.

![](/files/8Hg10QnYXiQSdQOCpC42)

#### Redefinir Senha

Para redefinir sua senha, na tela de login, clique em Esqueceu sua senha?:

![](/files/SgxGVMMgIYjDTG00FZEU)

Em seguida, insira o nome de usuário do perfil e clique em Enviar.

![](/files/SKyV3BdEaCFMhAZX6sh4)

Um e-mail contendo um código de verificação será enviado para o endereço de e-mail vinculado a esse perfil. Insira o código de verificação e clique em Enviar código.

![](/files/xkeAIvE593TT7k72q3s9)

Se o código estiver correto, você poderá criar uma nova senha. Insira a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a redefinição, clique em Redefinir senha.

![](/files/CYysD04WJkoVZ246WQWw)

## Interface do Usuário

### Lista de Exceções

A lista de exceções, por padrão, lista todas as exceções pendentes.

As exceções são ordenadas crescentemente por data.

![Lista de Exceções](/files/M221SSkgI9clvVNJk9oc)

#### Filtros

Na barra superior há diversos tipos de filtros:

* **Período** (escolha as datas de início e fim);
* **Tipo de Exceção**: `Biométrica`, `Biográfica`, `Ambas`;
* **Categoria**: `Atualização`, `Cadastro`, `Todos`;
* **Status biográfico**: `Análise`, `Tratado`, `Todos`;
* **Status** (biométrico): `Análise`, `Tratado`, `Todos`;
* **Chave, biográfico ou label** (esse filtro anula os filtros de status e tipo de exceção);
* **TGUID** (quando aplicado, anula os demais filtros);
* **Responsável**: filtra por usuário responsável pela exceção;
* **External**: filtra por uma chave externa.

{% hint style="info" %}
O filtro **External** pode não aparecer ou pode ter um nome diferente dependendo do seu ambiente.
{% endhint %}

![filters](/files/eUwO6GGZCSfESxxA7Q6D)

Quando um ou mais filtros são aplicados, eles são mostrados no topo da lista. É possível remover cada filtro individualmente, ou todos de uma vez.

![remove filters buttons](/files/jH3uUGnfQbXX2cS3j9i3)

**Status:**

* Análise (amarelo):

  > Exceções que ainda não foram analisadas (pendentes, sem decisão de tratamento).
* Tratado (verde):

  > Exceções que foram analisadas e tiveram uma decisão de tratamento. Perfis no GBDS podem ser afetados pela decisão.

{% hint style="info" %}

* Exceções do tipo **Biométrica** terão, por padrão, inicialmente o Status Biográfico *Tratado* e o Status Biométrico *Análise*.
* Exceções do tipo **Biográfica** terão, por padrão, inicialmente o Status Biográfico *Análise* e o Status Biométrico *Tratado*.
  {% endhint %}

#### Item de Exceção

Cada item na lista é clicável e está associado a uma exceção ou grupo de exceções.

![Item de exceção](/files/ZN593AoXC1tbFELhJ6gK)

Na extremidade esquerda de cada item, um ícone indica o tipo de exceção e se ela já foi acessada.

![](/files/15hcLNIr4pECiFpvm4zQ)

Quando uma exceção nunca foi acessada por um usuário, o ícone aparecerá com fundo transparente (indicado por 1, 3 e 5 na imagem acima).

Depois de acessadas, **Exceções Biométricas de Cadastro** terão fundo verde (2), **Exceções Biométricas de Atualização** terão fundo azul (4) e **Exceções Biográficas** terão fundo azul (6).

O usuário também pode identificar o tipo de exceção pelo ícone de `soma` nas **Exceções Biométricas de Cadastro** (1, 2), `atualizar` nas **Exceções Biométricas de Atualização** (3, 4) e `folha de papel` nas **Exceções Biográficas** (5, 6).

A data exibida indica quando a exceção foi gerada, se estiver com análise pendente. Para exceções com status `Tratado`, a data indica o momento em que o tratamento foi efetivado.

As colunas seguintes indicam o nome da pessoa em exceção, o tipo da exceção, o número de exceções naquele grupo, o tipo de biometria (somente para exceções biométricas de cadastro) e o status biográfico e biométrico da exceção.

Quando um item de exceção é clicado, a aplicação exibe a tela de detalhes da exceção. As diferenças entre os tipos de exceção são descritas nas seções [Detalhes da Exceção Biométrica](#detalhes-da-excecao-biometrica) e [Detalhes da Exceção Biográfica](#detalhes-da-excecao-biografica).

#### Menu

O menu pode ser aberto passando o mouse em cima no nome do usuário no canto superior direito da tela.

![Menu](/files/qvOp71yCXtYoK6aXBl7C)

As opções disponíveis são:

* [Configurações](#configuracoes)
* Manual
* Mudar senha
* Sair

### Detalhes da Exceção Biométrica

Quando uma exceção biométrica é clicada na lista de exceções, ou quando um link direto para uma exceção é clicado, a aplicação exibe a tela de detalhes da exceção biométrica. Esta tela exibe toda informação necessária para o tratamento da exceção e oferece todas as ações possíveis para tratamento.

![Detalhe da Exceção](/files/CxckncLm7ZNzOAOHWIBB)

Esta tela pode ser dividida nas seguintes seções:

* [Informação Geral](#informacao-geral)
* [Fichas de Perfis](#fichas-de-perfis)
* [Ações Possíveis](#acoes-possiveis)
* [Exceção Relacionada](#excecao-relacionada)

#### Informação Geral

Este painel mostra dados gerais sobre a exceções.

![Informação Geral](/files/flgUyfYBJRX9THGGEYJR)

Ele contém as seguintes informações:

* **Tipo de Exceção Biométrica**

  > * Cadastro
  > * Atualização
* **Informação da Exceção**

  > * Data da criação (ou resolução, se já tratada)
  > * Perito
* **Status da Exceção**

  > * Análise
  > * Tratado
* **Botão de Ação**

  > * Botão de voltar para a lista de exceções.

#### Fichas de Perfis

Esta tela sempre exibirá dois painéis lado a lado, um para cada perfil. O painel *esquerdo* representa o **Perfil Original** (pré-existente na base de dados) e o *direito* representa o **Perfil de Exceção** (cuja submissão gerou a exceção, também chamado de perfil entrante).

![Fichas de Perfis](/files/Pk7Ud0Gujxpcg9Chagbj)

O *painel do perfil* pode ser dividido em duas partes:

**Dados Biográficos:**

Esta seção exibe todas as *chaves* e *dados biográficos* do perfil e é exibida no *topo* do painel. A seção também pode ter *labels* do perfil, se estiverem configuradas. Nesta seção, a foto facial do perfil pode ser exibida à esquerda, dependendo da configuração.

**Biometrias:**

Esta seção contem todas as *imagens biométricas* do perfil e é exibida na parte *de baixo* do painel. Cada aba representa um tipo de biometria, entre **digitais**, **palmares**, **íris** e **assinatura**. O ambiente deve ter pelo menos um tipo de biometria configurado. Esta seção também inclui uma guia para imagens auxiliares, como *mugshots*, cicatrizes, marcas e tatuagens, se disponíveis.

Os detalhes das imagens biométricas já carregadas podem ser exibidos com um clique sobre cada imagem. Também é possível arrastar e soltar uma biometria sobre outra de um perfil distinto. Esta ação abrirá uma nova tela que permitirá a comparação lado a lado das duas biometrias. Este recurso é descrito em maiores detalhes na seção [Comparação Biométrica](#comparacao-biometrica).

Eventualmente, podem ocorrer erros ao carregar imagens biométricas. Isto indica que o perfil tem a biometria cadastrada, mas a imagem não pode ser carregada por algum erro no servidor.

Neste caso, serão exibidos sobre as imagens afetadas uma mensagem de erro e um botão para tentar novamente o carregamento. Em caso de sucesso, as imagens serão exibidas corretamente. Se os erros persistirem, entre em contato com o suporte da Griaule.

{% hint style="warning" %}
Nesta tela, os dados que apresentam inconsistência entre os perfis são destacados com uma **borda vermelha**. Este destaque indica que a comparação entre as informações dos perfis **difere do que era esperado** e deve ser interpretado de acordo com o tipo de exceção:

**Exceção de Cadastro**: indica que as informações do perfil de exceção **correspondem** às do perfil original, mas o esperado é que não correspondessem, isto é, que o perfil sendo cadastrado fosse diferente de todos os outros que já estão na base de dados.

**Exceção de Atualização**: indica que as informações do perfil de exceção **não correspondem** às do perfil original, mas o esperado é que correspondessem, isto é, que o perfil entrante apresentasse match positivo com o perfil sendo atualizado.
{% endhint %}

#### Ações Possíveis

As ações possíveis para a exceção são exibidas em um painel na parte inferior da tela, com botões para realizar o tratamento, como:

* Tratar como Biometrias diferentes;
* Tratar como Cadastro incorreto;
* Tratar como Recoletar;
* Tratar como Mesmas biometrias;
* Tratar como Unificar.

![possible actions buttons](/files/OeD0QbuvYlYKLeIiPkR4)

As ações possíveis podem gerar os seguintes resultados (ou uma combinação deles):

* **Manter** um perfil (destaque verde): o perfil original é mantido na base de dados.
* **Cadastrar** um perfil (destaque verde): o perfil é cadastrado na base de dados.
* **Descartar** um perfil (destaque vermelho): o perfil é rejeitado e seus dados são descartados.
* **Unificar** dados de perfis (destaque verde): os dados dos dois perfis são mesclados.
* Resultado `desconhecido` (destaque amarelo). O perfil de exceção será **descartado** e ações adicionais serão necessárias.

Em alguns casos, as opções Aprovar e Rejeitar podem estar disponíveis. Estas opções podem ser configuradas para terem resultados diferentes. O destaque do perfil irá indicar quando um perfil será mantido ou descartado.

Antes de tratar uma exceção, se necessário, é possível remover uma biometria. Para mais informações, consulte a seção [Remover uma Biometria](#remover-uma-biometria).

{% hint style="info" %}
Verifique suas regras de negócio para entender os procedimentos corretos para tratamento. Para mais informações sobre a forma como os tratamentos afetam os perfis no GBDS, consulte a seção [Tratamento de Exceção Biométrica](#tratamento-de-excecao-biometrica-fluxo-padrao), no capítulo de [Fluxos](#fluxos).
{% endhint %}

#### Seleção de Biometrias

Quando **Exceções Biométricas de Cadastro** são tratadas com Unificar perfis ou **Exceções Biométricas de Atualização**, com Mesmas biometrias, é possível escolher as biometrias que serão mantidas e usadas pelo GBDS como referências para match com aquele perfil (as outras biometrias serão descartadas).

![select biometrics pop-up menu](/files/0UVSINIEiMJRSoMACM3c) ![select biometrics pop-up menu](/files/eQFsQpwgxSeeVGdd5TPN)

{% hint style="info" %}
Esta opção só estará disponível se habilitada nos arquivos de configuração. Entre em contato com seu administrador de sistema para verificar a disponibilidade em seu ambiente.
{% endhint %}

Depois de selecionar uma biometria, para navegar para outras biometrias que precisam ser selecionadas, clique nos botões Anterior e Próximo na parte inferior da tela ou use as setas de `esquerda` e `direita` no teclado.

No lado esquerdo da tela, as cores os ícones das biometrias indicam seu estado de seleção:

* **Branco**: nenhuma biometria foi selecionada, aguardando decisão.
* **Cinza**: biometrias sendo mostradas na tela neste momento.
* **Verde**: biometria selecionada, uma decisão foi tomada.

![select biometrics status](/files/gjGsHFYWvJSGOXgPUmdj)

Se um dos perfis não contiver alguma das biometrias, as biometrias do outro perfil (se disponíveis) serão automaticamente selecionadas:

![automatic selection when missing traits](/files/WSjhbIfRGVF87EceELEl) ![automatic selection when missing traits](/files/U8Nxxde6E2zFWjc9zX3B)

Note que, para cada par de biometrias mostradas, existem diversas opções de visualização, como zoom, deslocamento e rotação, além de opções para mostrar minúcias e singularidades. Mais informações sobre essas opções podem ser encontradas na seção [Visualizando Imagens](#visualizando-imagens).

#### Exceção Relacionada

Alguns perfis podem ter mais de uma exceção associada. Quando isso acontecer, uma nova barra lateral será adicionada ao lado esquerdo da tela. As exceções associadas podem ser do tipo [biométrica](#detalhes-da-excecao-biometrica) ou [biográfica](#detalhes-da-excecao-biografica).

![menu](/files/FBxyVO5OEGjJ6RJAGKqW) ![menu](/files/REkClCkxrbQO33rOsF0W)

Você pode navegar pelas exceções clicando no número ou expandindo a barra lateral clicando no botão >>, localizado na parte inferior da barra lateral.

Você também pode exportar todas as exceções relacionadas clicando em Exportar PDF -> Todas as exceções.

{% hint style="warning" %}
Ao exportar mais de uma exceção, o ETR tentará abrir tantas páginas do navegador quanto os perfis de exceção que você tiver. Essa ação às vezes é bloqueada pelo navegador e você deve permitir que a página do ETR abra os pop-ups para usar corretamente essa funcionalidade.
{% endhint %}

Exceções relacionadas podem ocorrer em transações de atualização quando o sistema utiliza múltiplas chaves únicas. Neste cenário, as opções de tratamento serão reduzidas para Aprovar, Rejeitar e Recoletar.

* Se uma exceção relacionada de atualização com múltiplas chaves for *aprovada*, **todas** as outras devem, **obrigatoriamente**, ser *rejeitadas*.
* Se uma exceção relacionada de atualização com múltiplas chaves for tratada com *recoletar*, **todas** as outras devem, **obrigatoriamente**, ser tratadas com *recoletar*.

{% hint style="info" %}
Todos os tratamentos escolhidos para exceções relacionadas são salvos durante o fluxo de trabalho. No entanto, **os tratamentos só são aplicados às transações após todas as exceções relacionadas no grupo receberem um tratamento**.
{% endhint %}

### Detalhes da Exceção Biográfica

Quando uma exceção biográfica é clicada na lista de exceções, ou quando um link direto para uma exceção é acessado, a tela de detalhes da exceção biográfica será mostrada. Esta tela exibe toda informação necessária para o tratamento da exceção e oferece todas as ações possíveis para tratamento.

![](/files/qj3cDX2LuIutDvDEL3LQ)

Esta tela, assim como a de [detalhes da exceção biométrica](#detalhes-da-excecao-biometrica) pode ser dividida em informações gerais, fichas de perfis, ações possíveis e exceção relacionada.

As informações gerais são as mesmas, adicionando-se somente o motivo da exceção biográfica, que foi inserido no momento de submeter o perfil ao servidor. As fichas de perfis também possuem as mesmas informações, contudo, somente um painel é exibido, pois a exceção biográfica não compara dois perfis, há somente o perfil de exceção. Além disso, as exceções relacionadas também possuem a mesma disposição de informações na tela, podendo uma exceção biográfica estar relacionada com uma exceção biométrica.

As [ações possíveis](#acoes-possiveis-1) de tratamento de uma exceção biográfica diferem daquelas para exceções biométricas e são descritas na seção seguinte.

#### Ações Possíveis

As ações possíveis para tratamento de exceções biográficas são:

* [Rejeitar Biográficos](#rejeitar-biograficos)
* [Aprovar Biográficos](#aprovar-biograficos)
* [Editar e Aprovar Biográficos](#editar-e-aprovar-biograficos)

{% hint style="info" %}
Verifique suas regras de negócio para entender os procedimentos corretos para tratamento. Para mais informações sobre a forma como os tratamentos afetam os perfis no GBDS, consulte a seção [Tratamento de Exceção Biográfica](#tratamento-de-excecao-biografica-fluxo-padrao), no capítulo de [Fluxos](#fluxos).
{% endhint %}

{% stepper %}
{% step %}

#### Rejeitar Biográficos

Para rejeitar uma exceção biográfica, clique no botão Rejeitar biográficos, localizado na parte inferior da tela. Em seguida, insira um comentário, se necessário, e clique em Rejeitar biográficos para confirmar a ação.

![](/files/X5eRRkEczFtXoPkq9f6r)
{% endstep %}

{% step %}

#### Aprovar Biográficos

Para aprovar uma exceção biográfica sem realizar alterações, clique no botão Aprovar biográficos, localizado na parte inferior da tela. Em seguida, insira um comentário, se necessário, e clique em Aprovar biográficos para confirmar a ação.

![](/files/UuWvedYDKl1UdWe5S7UL)
{% endstep %}

{% step %}

#### Editar e Aprovar Biográficos

Se for necessário realizar alterações nos biográficos do perfil, clique no botão Editar biográficos, localizado na parte superior esquerda do painel do perfil. Em seguida, uma janela modal aparecerá com os campos disponíveis para edição. Realize as edições necessárias e clique em Atualizar e aceitar biográficos.

![](/files/0Yp5tePvrRVRYrrIyQqO)

Uma janela de confirmação, mostrando os valores antigos e novos, será exibida. Clique em Atualizar e aceitar para confirmar a ação.

![](/files/Rlxwg4R6bfvjeD23nKra)

Após o tratamento, se a operação foi concluída com êxito, uma mensagem de sucesso aparecerá no canto superior direito da tela.

![](/files/taAGxzlJLeEacmEmLlTU)

Além disso, o status da exceção biográfica passará para *Tratado (aprovado)*.

![](/files/ftdyFWxXrP9LfkTB6iT4)
{% endstep %}
{% endstepper %}

### Comparação Biométrica

Ao clicar em uma das biometrias (face, digital, palmar, íris ou assinatura), uma janela modal será exibida comparando lado a lado a biometria do perfil original (à esquerda) com a biometria correspondente do perfil que gerou a exceção (à direita).

Se um dos perfis não tiver a biometria correspondente, será apresentado um campo vazio.

![comparação biométrica](/files/hu1rkVCNfXYw786ZWXW1)

É possível trocar a biometria selecionando um novo item no menu dropdown.

#### Visualizando Imagens

Além disso, há diversas opções para personalizar a visualização de imagens:

![image viewing options](/files/wgriVfazfRVbBSjOm1AX)

* Ampliação (Zoom)

  > Por padrão, as imagens são ajustadas automaticamente para ocuparem todo o espaço disponível na janela de visualização. O usuário pode alterar a ampliação (zoom) usando a roda do mouse.
* Deslocamento (Pan)

  > Quando a opção `Mover imagem` estiver selecionada, o usuário pode arrastar as imagens com o botão **esquerdo** do mouse para deslocar a região visível (pan). Essa operação só é possível quando o tamanho da imagem é superior ao tamanho da janela de visualização. Se a opção `Rotacionar imagem` estiver selecionada, é possível deslocar a imagem utilizando o **botão direito** do mouse.
* Rotação

  > O usuário pode rotacionar a imagem selecionando a opção `Rotacionar imagem` e clicando e arrastando a imagem com o **botão esquerdo** do mouse.
* Mostrar/esconder minúcias

  > Se essa opção for selecionada, as duas imagens mostrarão todas as minúcias detectadas. Cada minúcia é destacada com uma cor de acordo com seu score de qualidade (azul para boa qualidade, amarelo para média e vermelho para baixa qualidade).
* Mostrar/esconder núcleos e deltas

  > Se essa opção for selecionada, as duas imagens mostrarão os núcleos e/ou deltas detectados.
* Sincronizar zoom e deslocamento

  > Se esta opção estiver ativada, as duas imagens sempre terão a mesma ampliação e posicionamento.
* Quantidade de matches mostrados

  > Se essa opção for selecionada, as duas imagens mostrarão os matches (minúcias coincidentes) destacados em verde. A quantidade de minúcias mostradas pode ser selecionada arrastando o controle deslizante.

  ![](/files/kwUVtlnHRBCeQ420A2pp)

#### Qualidade

Abaixo de cada imagem, quando disponível, um valor de qualidade na faixa de 0% a 100% será exibido. A qualidade é classificada nas seguintes faixas:

* **0 - 20%**: Muito Baixa (Laranja)
* **21% - 40%**: Baixa (Amarelo)
* **41% - 60%**: Média (Azul)
* **61% - 80%**: Boa (Verde Claro)
* **81% - 100%**: Muito Boa (Verde Escuro)

### Remover uma Biometria

**Tendo as permissões apropriadas**, é possível remover uma biometria de um perfil antes de tratar a exceção. Para isso, passe o mouse sobre a biometria e clique no ícone de lixeira no canto superior direito da biometria. Em seguida, confirme a ação clicando em Remover.

![remove biometric trait](/files/HM0vNv5c59tAbLwVnj4b)

Após a remoção, o texto "Biometria removida" aparecerá no lugar da biometria removida. É possível reverter a ação restaurando a biometria. Para isso, passe o mouse sobre a biometria removida e, no canto superior direito, clique no botão de restaurar. Em seguida, confirme a ação clicando em Restaurar.

![restore biometric trait](/files/pUfwau4zDMHbI5w7DE0u)

### Configurações

![Configurações](/files/MjFSx65d0eiqegNzXLgI)

Esta tela permite a configuração de quatro opções pelo usuário:

* Tema: **claro** ou **escuro**;
* Idioma: **português**, **inglês** ou **espanhol**;
* Formato de Hora: **12-horas (AM/PM)** ou **24-horas**;
* Formato de Data: **dd/mm/aaaa**, **mm/dd/aaaa** ou **aaaa/mm/dd**;
* Cor de destaque do casamento (minúcias com match).

Além de mostrar as versões do *GBS ETR Web*, *GBS ETR Server*, *GBS Common Server*, *React Griaule UI* e *React Griaule Konva*.

## Fluxos

### Tratamento de Exceção Biométrica (fluxo padrão)

O fluxo padrão para tratar uma exceção biométrica é mostrado abaixo:

1. Fazer login na aplicação;
2. Abrir exceção biométrica pendente;
3. Comparar as imagens de cada perfil;
4. Decidir como tratar a exceção (Mesmas biometrias, Biometrias diferentes, Cadastro Incorreto, Recoletar ou Unificar);
5. Adicionar comentário, se desejado;
6. Exportar para PDF, se desejado (também é possível exportar para PDF antes de realizar o tratamento).

{% hint style="info" %}
Em alguns casos, Aprovar e Rejeitar também podem ser opções para tratar uma exceção. Além disso, dependendo da situação ou do ambiente, algumas opções podem não estar disponíveis.
{% endhint %}

Há 5 tratamentos possíveis, dependendo da resolução desejada para a exceção, descritos na tabela abaixo:

<table><thead><tr><th width="180">Tratamento</th><th>Exceção Biométrica de Cadastro</th><th>Exceção Biométrica de Atualização</th></tr></thead><tbody><tr><td>Biometrias diferentes</td><td>Indica que os perfis possuem biometrias diferentes e houve um falso positivo. <strong>O perfil original será mantido e o perfil de exceção será cadastrado.</strong></td><td>Indica que o perfil de exceção possui biometrias diferentes do perfil que se está tentando atualizar. <strong>O perfil original será mantido e o perfil de exceção será descartado.</strong></td></tr><tr><td>Cadastro incorreto</td><td>(não recomendável)</td><td>Indica que o perfil original estava cadastrado incorretamente. <strong>O perfil original será deletado e o perfil de exceção será cadastrado.</strong></td></tr><tr><td>Recoletar</td><td>Indica erro na coleta biométrica do perfil de exceção. <strong>O perfil original será mantido e o perfil de exceção será descartado.</strong></td><td>Indica erro na coleta biométrica do perfil de exceção. <strong>O perfil original será mantido e o perfil de exceção será descartado.</strong></td></tr><tr><td>Mesmas biometrias</td><td>Indica que as biometrias do perfil de exceção coincidem com as do perfil original. <strong>O perfil original será mantido e o perfil de exceção será descartado.</strong></td><td>Indica que as biometrias do perfil de exceção coincidem com as do perfil original e houve um falso negativo. <strong>Os perfis original e de exceção serão unificados.</strong></td></tr><tr><td>Unificar</td><td>Indica que as biometrias do perfil de exceção coincidem com as do perfil original. <strong>Os perfis original e de exceção serão unificados.</strong></td><td>(não recomendável)</td></tr></tbody></table>

### Tratamento de Exceção Biográfica (fluxo padrão)

O fluxo padrão para tratar uma exceção biográfica é mostrado abaixo:

1. Fazer login na aplicação;
2. Abrir exceção biográfica pendente;
3. Analisar dados biográficos do perfil;
4. Decidir como tratar a exceção (Rejeitar biográficos, Aprovar biográficos, Editar e aprovar biográficos);
5. Adicionar comentário, se desejado;
6. Exportar para PDF, se desejado (também é possível exportar para PDF antes de realizar o tratamento).

Há 3 tratamentos possíveis, dependendo da resolução desejada para a exceção, descritos na tabela abaixo:

<table><thead><tr><th width="180">Tratamento</th><th>Descrição</th></tr></thead><tbody><tr><td>Rejeitar biográficos</td><td>Os dados biográficos do perfil não são aceitáveis e serão descartados. <strong>O perfil não entra na base de dados.</strong></td></tr><tr><td>Aprovar biográficos</td><td>Os dados biográficos do perfil são aceitáveis e serão adicionados à base da dados. <strong>O perfil entra na base da dados.</strong></td></tr><tr><td>Editar e aprovar biográficos</td><td>Os dados biográficos do perfil são editados antes de serem aceitos e adicionados à base de dados. <strong>O perfil com edições entra na base de dados.</strong></td></tr></tbody></table>


# BEST

## Introdução

O **GBS BEST (Biometric Expert Software Tool)** é uma aplicação desenvolvida para auxiliar peritos forenses em investigações criminais e gerenciamento de casos. Ele fornece ferramentas para aprimoramento de qualidade, comparação e identificação automatizada de imagens biométricas em uma interface limpa e intuitiva.

Esse manual está atualizado para a versão 1.6.4 do BEST.

### Acesso e Autenticação

Você deve acessar o BEST com um navegador e recomendamos o Google Chrome, Microsoft Edge, Firefox e Safari. A URL para acesso é específica para cada ambiente.

{% hint style="info" %}
Se necessário, entre em contato com a equipe de suporte da Griaule para obter a URL correta.
{% endhint %}

A autenticação é necessária para acessar a aplicação. As credenciais necessárias ao BEST são nome de usuário e senha.

![](/files/UQUkfatryqxgHRrmxdn4)

{% hint style="info" %}
Na parte inferior da tela há uma opção para alterar o idioma da interface do usuário. Esta opção também está disponível nas configurações após o login.
{% endhint %}

### Autenticação de dois fatores (2FA)

Quando a autenticação de dois fatores (2FA) estiver ligada, na primeira vez que você fizer login, após entrar seu username e senha, será mostrado um QR Code que deve ser registrado no Google Authenticator.

{% hint style="info" %}
Google Authenticator é um gerador de códigos de autenticação disponível como um aplicativo para smartphones [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\&hl=en\&gl=US) e [iOS](https://apps.apple.com/us/app/google-authenticator/id388497605).
{% endhint %}

![QR Code do Google authenticator para autenticação de dois fatores](/files/KpJ0nYk7I4ymtFbVEASU)

Após registrar com sucesso o QR Code no Google Authenticator, insira o código de seis dígitos gerado e clique em Enviar.

Você só precisará registrar o QR Code uma vez. Mas, a cada login subsequente, você precisará inserir o código de seis dígitos gerado pelo Google Authenticator.

![Autenticação de dois fatores](/files/niGQFhylVGdlJKOT3DWe)

Existe um número limitado de tentativas de login sem sucesso que um usuário pode fazer. Sempre que um código incorreto é inserido, uma mensagem de erro será exibida:

![Autenticação de dois fatores - código incorreto](/files/cNs1dQMjTM6QvEgpDnqt)

Se você atingir o número máximo de tentativas de login sem sucesso, sua conta será automaticamente bloqueada.

![Autenticação de dois fatores - conta bloqueada](/files/oMg5nTBRcOonkdAWjk5q)

{% hint style="warning" %}
Se sua conta for bloqueada, entre em contato com o administrador do sistema.
{% endhint %}

### Logins Simultâneos e Cadastro de Navegador

Apenas uma sessão por usuário é permitida. Não é possível fazer login simultaneamente com um mesmo perfil mais de uma vez na aplicação. Se um usuário já estiver conectado e outro acesso acontecer usando o mesmo nome de usuário e senha, o usuário com a sessão mais antiga será notificado e desconectado na próxima ação.

![](/files/aecgWPZ19Sq9J87Kcfa3)

Além disso, apenas um navegador pode ser usado de cada vez. Ao tentar fazer login usando um navegador diferente, o usuário será informado que é necessário autenticar o novo navegador. A autenticação de um novo navegador revogará o acesso do navegador anterior.

![](/files/HZdOYUKwFC2XJE3g5Mb0)

Para autenticar um novo navegador, clique em Autenticar e, em seguida, insira o código de verificação que será enviado para o e-mail vinculado à conta do usuário.

![](/files/qhvzLZ5HNGT7pPfPBRuZ)

Se a autenticação for bem-sucedida, uma notificação aparecerá no canto superior direito da tela após o login.

![](/files/JLPWzNC2wArU4Mh2F3q3)

### Alterar ou Redefinir Senha

Por motivos de segurança, você pode alterar sua senha ou redefini-la caso a esqueça.

#### Alterar Senha

Para alterar sua senha, após fazer login, passe o mouse sobre seu nome de usuário no canto superior direito da tela e clique em Alterar senha.

![](/files/Q7axKeimdnjNYsM1NrWI)

Em seguida, insira a senha atual e a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a alteração, clique em Alterar senha.

![](/files/OU2jqItAkyfaIj8PCTIO)

#### Redefinir Senha

Para redefinir sua senha, na tela de login, clique em Esqueceu sua senha?:

![](/files/SpQtClVfx4RoZtjnNKhi)

Em seguida, insira o nome de usuário do perfil e clique em Enviar.

![](/files/mZUu6TmSEbgx59hvT9lp)

Um e-mail contendo um código de verificação será enviado para o endereço de e-mail vinculado a esse perfil. Insira o código de verificação e clique em Enviar código.

![](/files/inM9RU5hPZmaKUU1JLVF)

Se o código estiver correto, você poderá criar uma nova senha. Insira a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a redefinição, clique em Redefinir senha.

![](/files/SuzYGtXv2aZnipLVaf8J)

## Interface do Usuário

Ao efetuar login, a lista de casos é exibida.

![](/files/lOT01BMRyvJsRPVflHDg)

O BEST mostra os casos mais recentes primeiro. Você pode selecionar o número de casos exibidos por página e navegar por eles com os controles na parte inferior da tela.

O menu superior permite que você escolha se deseja listar os novos `Casos`, casos `Pendentes` de revisão, `Matches de UL`, ou `Pesquisas`.

### Tutorial

Se for sua primeira vez efetuando o login no BEST, será mostrado um tutorial para apresentar algumas funções e guiá-lo pela ferramenta.

![](/files/2I0tINPq65aIeHS85EBo) ![](/files/DsAMzhJoK8VtIFWPuekQ)

Você pode usar as setas do teclado para navegar para o *anterior* e o *próximo* e pode cancelar o Tutorial apertando a tecla Escape (ESC). Esse recurso está disponível nas seguinte páginas:

* Lista de casos
* Casos
* Vestígios
* Fragmentos
* Comparação de Pesquisa
* Relatório
* Edição do Relatório

Se você deseja acessar novamente esse recurso, clique no símbolo de ajuda no canto superior direito da página para iniciar o Tutorial dessa página.

![](/files/KQsFOwXVEqLt7GJjEmM2)

### Opções de Filtro

Você pode filtrar os resultados listados em qualquer guia por meio das opções de filtragem. Cada guia tem suas próprias propriedades de filtro, conforme mostrado abaixo:

Após aplicar os filtros desejados, eles serão exibidos no lado direito. Para desfazer a filtragem, clique em `Limpar filtros`.

#### Filtros da Lista de Casos

* Data – Restringe a lista a um intervalo de data. Há também atalhos para um dia (hoje), semana passada e mês passado.
* Status – Status da transação. Restringe a lista em casos abertos, resolvidos ou cancelados.
  * Casos `Abertos` são identificados por um ponto azul.
  * Casos `Resolvidos` são identificados por um ponto verde.
  * Casos `Cancelados` são identificados por um ponto vermelho.
* Responsável – Restringe a lista de acordo com a responsabilidade no caso:
  * `Meus` - Casos criados pelo usuário.
  * `Participantes` - Casos em que o usuário é um participante.
  * `Todos` - Todos os casos criados.
* Número do Caso
* Título do Caso
* Número da Ocorrência

#### Filtros da Lista de Casos Pendentes

* Data – Restringe a lista a um intervalo de data. Há também atalhos para um dia (hoje), semana passada e mês passado.
* Tipo de Busca – Restringe a lista para um dos seguintes tipos de operação de busca:
  * `LT TP` - Latente contra o base de dados decadactilares (Tenprints).
  * `LT UL` - Latente contra a base de dados de Latentes não-resolvidas (UL).
  * `TP UL` - Decadactilares (Tenprints) contra a base de dados de latentes não-resolvidas (UL).
* Código do caso, do vestígio ou do fragmento.

{% hint style="info" %}
A aba de Pendentes pode não aparecer se o [Double Blind](#pendentes---double-blind) não estiver habilitado.
{% endhint %}

#### Filtros da Lista de Matches de UL

* Data – Restringe a lista a um intervalo de data. Há também atalhos para um dia (hoje), semana passada e mês passado.
* Código do caso ou fragmento.
* Número da ocorrência.
* Tipo de delito.
* Pontuação do casamento biométrico.

#### Filtros da Lista de Pesquisas

* Data – Restringe a lista a um intervalo de data. Há também atalhos para um dia (hoje), semana passada e mês passado.
* Casos – Restringe a lista de acordo com a responsabilidade no caso:
  * `Meus` - Casos criados pelo usuário.
  * `Participantes` - Casos em que o usuário é um participante.
  * `Todos` - Todos os casos criados.
* Código do caso, do vestígio ou do fragmento.
* Status – Status da pesquisa do fragmento. HIT, NO HIT ou Em pesquisa.
  * `HIT` - Um examinador marcou a pesquisa como um HIT (identificado por um ponto verde).
  * `NO HIT` - Um examinador marcou a pesquisa como um NO HIT (identificado por um ponto vermelho).
  * `Em pesquisa` - A pesquisa ainda está em progresso, ou os resultados da pesquisa ainda não foram avaliados por um examinador (identificado por um ponto azul).

## Criando um Caso

Para criar um novo caso, vá para a tela de *casos* e clique no botão `Novo caso`. Uma janela aparecerá, permitindo a inserção de informações sobre o caso.

![](/files/C7fv2owiaTpD5jCddJfE)

Após adicionar as informações necessárias, clique em `Criar caso`.

## Casos

Você pode visualizar qualquer caso clicando nele na lista de *Casos*. Isso mostrará os vestígios, fragmentos e laudos do caso selecionado.

![](/files/7kiEbY6REOCfGv75ulDJ)

Você também pode expandir as informações detalhadas do caso através do botão Mostrar detalhes.

![](/files/PZNhu2va6GzHsW719deR)

Ao visualizar os detalhes do caso, a lista de *Casos* será mantida na barra lateral para navegação. Nessa página, os filtros da lista podem ser acessados através do botão Filtros acima da barra lateral.

Você pode ocultar a barra lateral clicando no botão << Esconder barra lateral.

### Adicionando Peritos

Inicialmente o único perito participante é o usuário que criou o caso. É possível adicionar outros usuários como peritos participantes usando a sessão de Peritos no menu do Caso.

Na tela de Casos, clicar em Adicionar perito abrirá a janela de Adicionar perito.

![](/files/IU8T3JksKYktLBfzmhiL)

Preencha o nome do perito e clique no botão de Filtrar para listar os peritos correspondentes. Selecione os peritos desejados marcando as caixas na coluna `Selecionar` e clique no botão Adicionar peritos selecionados.

Os peritos selecionados aparecerão no painel Peritos e todos serão adicionados com a função de perfil *Leitor*. Leitor é a função padrão atribuída a qualquer perito participante. Para alterar a função selecione o perito e clique no botão Mudar para editor. Você pode usar o mesmo procedimento para modificar uma função de Editor de volta à Leitor. Se um perito atribuído como Editor for selecionado, o botão Mudar para editor se tornará Mudar para leitor.

![](/files/qZ4UfRu0us90UU21FmMV)

Para remover um perito, passe o mouse sobre o perito desejado, clique no x e confirme a ação.

### Adicionando Pessoas de Interesse

Você pode adicionar pessoas de interesse (POI) através do painel de Pessoas de Interesse na tela de Caso clicando no botão Adicionar POI. Isso abrirá a janela de Adicionar POI.

Para adicionar um POI, selecione o campo e preencha o valor usado na pesquisa, então clique no botão Filtrar. Então, escolha as pessoas desejadas marcando as caixas na coluna Selecionar. Você pode, opcionalmente, adicionar uma descrição para a pessoa escolhida. Após selecionar as pessoas, clique no botão Adicionar POIs selecionados

{% hint style="warning" %}
A seleção atual será apagada se os parâmetros de pesquisa forem alterados.
{% endhint %}

![](/files/hTUHgOuOo8v5vMgjOhxD)

As Pessoas de Interesse selecionadas aparecerão no painel. Para remover uma pessoa de interesse, passe o mouse sobre a pessoa desejada, clique no x e confirme a ação.

![](/files/4wwmqhzQ8EGiJxcUh5ki)

{% hint style="warning" %}
Quando Pessoas de Interesse (POI) são adicionadas a casos que possuem vestígios de vídeo, o BEST Video realizará a busca de fragmentos extraídos de vídeos considerando apenas as POIs, não toda a base de dados.
{% endhint %}

### Adicionando Arquivos Adicionais

Você também pode adicionar outros arquivos ao caso. Os tipos de arquivo suportados são:

* PDF
* DOC
* DOCX
* XLS
* XLSX
* Extensões de imagem (.png, .jpeg, .tiff, entre outros)

Para fazer upload de arquivos adicionais, clique no botão de upload. Um painel aparecerá onde você pode fazer upload dos arquivos.

![](/files/cO2D76OEIr8L0YFOFiMQ)

Depois de adicionado, clique no botão Adicionar arquivos adicionais para concluir a operação. Os arquivos serão exibidos na tela do caso.

![](/files/62d81xGO7EXAJeObnGzW)

## Vestígios

Um vestígio pode ser qualquer imagem de evidência ou vídeo relacionado ao caso, contendo fragmentos ou não.

{% hint style="info" %}
O BEST possui total conformidade com a Cadeia de Custódia. Ele registra, de forma completa e detalhada, todas as operações relacionadas às informações inseridas no sistema, garantindo plena rastreabilidade ao longo de todo o ciclo de vida da informação.
{% endhint %}

O BEST aceita imagens nos seguintes formatos:

* .jpeg
* .png
* .bmp
* .wsq

Os formatos de vídeo suportados são:

* .avi
* .mp4
* .mpeg
* .ogv
* .ts
* .webm
* .3gp
* .3g2
* .movi

{% hint style="info" %}
O suporte a vídeo pode estar desligado no seu ambiente. Confira com o seu administrador de sistemas se esta funcionalidade está disponível ou não.
{% endhint %}

{% hint style="info" %}
As buscas de vídeo no BEST seguem um fluxo de trabalho diferente e não necessitam de marcação manual dos fragmentos. **A busca de vídeos só está disponível para fragmentos de face**.

Para mais informações sobre a busca de vídeos, veja a seção de [Buscas de Vídeo](#buscas-de-video).
{% endhint %}

Você pode inserir vestígios clicando no botão Adicionar vestígio na tela de Casos e selecionando o tipo de vestígio: `imagem` ou `vídeo`.

![](/files/3j0igiuiFKDRWW4mJqF7)

Para adicionar novos vestígios arraste as imagens para a área designada ou clique no painel para enviar as imagens, em seguida, clique no botão Adicionar vestígios.

![](/files/czPmHsYWTbGyeiv6UyZz)

Passe o mouse sobre um vestígio e clique em Inspecionar, ou dê um duplo clique, para abrir a tela de edição de vestígios, onde você poderá inserir informações sobre o vestígio, extrair fragmentos e editar a imagem.

![](/files/RrKFQPabNTIUQiyJ0pdb)

Esta tela exibirá o vestígio selecionado, as ferramentas de edição e os detalhes do vestígio.

![](/files/aNzoqLZSYAtyx3StTJIv)

{% hint style="warning" %}
Na primeira vez que você tentar extrair um fragmento de impressão digital ou palmar de um vestígio, uma mensagem aparecerá indicando que a resolução da imagem não está calibrada e o indicador de resolução abaixo da imagem ficará piscando. É de extrema importância executar a calibração correta ao extrair um fragmento de impressão digital ou palmar.

Para saber como calibrar a resolução, consulte a seção [Ferramenta de Definir Resolução](#ferramenta-de-definir-resolucao).
{% endhint %}

### Modificando detalhes de Vestígios

Clique no botão de mostrar detalhes no canto superior direito da tela de edição de vestígios e você poderá inserir as seguintes informações:

* Nome – Rótulo atribuído ao material especificamente para esse caso. É possível que um vestígio esteja presente em diferentes casos com nomes diferentes.
* Material – Descrição do material da superfície da qual a imagem latente foi coletada (como metal, papel, vidro, por exemplo).
* Superfície – Descrição da superfície da qual a imagem latente foi coletada (como lisa, enrugada, absorvente, por exemplo).
* Comentários – Quaisquer comentários adicionais dos peritos.
* Descrição – Notas que ajudam a identificar o vestígio no contexto do caso.

![](/files/cN9jDcB6TxBCGOREGwkZ)

Após preencher os campos, clique no botão Salvar alterações.

### Ferramentas de Extração

Quando um vestígio é selecionado, você terá acesso a diversas ferramentas para extrair os fragmentos desse vestígio. As ferramentas estão localizadas no menu à direita, como mostrado na imagem abaixo. Observe que algumas ferramentas ficam bloqueadas até que você ajuste a resolução da imagem.

![](/files/ysxSEtD6e5uZZlWo9tSL)

Um fragmento é uma parte de um vestígio que contem os dados biométricos que serão usados para pesquisa no banco de dados. Definir a resolução correta antes de extrair o fragmento é mandatório, pois irá afetar os resultados de pesquisas de casamento.

Para saber como calibrar a resolução, consulte a seção [Ferramenta de Definir Resolução](#ferramenta-de-definir-resolucao).

#### Ferramenta de Selecionar Fragmento

Você pode usar essa ferramenta para selecionar um fragmento já extraído. Quando um fragmento é selecionado, botões de inspecionar ou remover são exibidos na parte superior.

Inspecionar um fragmento levará você à tela de edição de [Fragmentos](#fragmentos).

{% hint style="warning" %}
Você não pode remover um fragmento enquanto ele está sendo pesquisado ou se ele foi marcado como HIT ou NO HIT.
{% endhint %}

#### Ferramenta de Definir Resolução

Para calibrar a resolução, selecione o ícone da régua no menu à direita e defina a medida de referência (polegadas, milímetros ou centímetros) que será utilizada para ajustar a resolução.

Vestígios que contêm fragmentos geralmente apresentam uma régua real para ajudar na identificação do tamanho de um fragmento. Esta régua pode ser usada como referência para definir a resolução clicando e arrastando sobre ela até que a linha desenhada tenha o tamanho que você definiu como medida de referência. Se não houver uma régua real na imagem, você pode usar qualquer outra medida conhecida para definir a resolução pelo mesmo método.

Após a medição o BEST calculará automaticamente a resolução e a apresentará sob a imagem. Você também pode definir manualmente a resolução clicando no indicador Resolução.

{% hint style="danger" %}
Definir a resolução correta para um vestígio é um processo **obrigatório** antes de extrair fragmentos e pode **afetar muito os resultados correspondentes**.
{% endhint %}

![](/files/rWkBOx6jII5JtmHmg3dU)

Se você já realizou uma busca por algum fragmento extraído do vestígio, uma janela de aviso será exibida ao tentar editar a resolução do vestígio.

![](/files/sY2poxUz6Olyn73suWpu)

#### Ferramentas de Extração de Fragmento

Para criar um fragmento, selecione uma das ferramentas de recorte com base na forma e na modalidade biométrica: Extrair Biometria Retangular ou Extrair Biometria Poligonal. Essas ferramentas têm modos diferentes para impressão digital, impressão palmar, íris ou face. Passar o mouse sobre o ícone da ferramenta no menu direito mostrará as diferentes opções para a forma selecionada.

{% hint style="warning" %}
A modalidade biométrica selecionada define o banco de dados de referência usado para comparação.
{% endhint %}

![](/files/ClvjZ9vcDL4NCcIqtFmx)

O processo de extração de fragmentos é semelhante para todas as modalidades, com a ferramenta de extração de retângulo ou polígono. Após selecionar a ferramenta, você deve delinear a área do fragmento.

![](/files/uznb3LH8tOjTygLw2xXY)

A borda do fragmento aparecerá com diferentes cores de acordo com seu status de pesquisa.

* Azul (Fragment #1) – Pesquisa em progresso
* Cinza (Fragment #2) – Sem pesquisas
* Verde (Fragment #3) – HIT
* Vermelho (Fragment #4) – NO HIT

#### Ferramenta de Reconhecimento Facial

Você pode usar a ferramenta de reconhecimento facial para permitir que o BEST extraia automaticamente imagens de face de um vestígio. Existem duas maneiras de extrair um face, pelas [Ferramentas de Extração de Fragmento](#ferramentas-de-extracao-de-fragmento) ou fazendo a extração automática com a ferramenta Reconhecimento Facial. O fragmento de face tem apenas as seguintes ferramentas:

* [Selecionar](#selecionar)
* [Rotacionar imagem](#rotacionar-imagem)
* [Filtros](#filtros)

O processo de pesquisa é o mesmo descrito na seção [Realizando Pesquisas em Fragmentos](#realizando-pesquisas-em-fragmentos), retornando uma pontuação percentual de similaridade em vez de um valor inteiro.

### Exportar vestígios

Você pode exportar o arquivo do vestígio passando o mouse no menu drop-down e clicando no botão Exportar Vestígio, como indicado na imagem. Fazê-lo iniciará o download do arquivo de vestígio.

![](/files/hwDagx2237B4CrtSxmSF)

## Fragmentos

### Editando Fragmentos

Para editar um fragmento, dê um duplo clique sobre o vestígio ou, utilizando a Ferramenta de Selecionar Fragmento, clique no fragmento e no botão Inspecionar.

A página do fragmento aparecerá e iniciará o processo de extração automática de minúcias. Quando terminar, o BEST exibirá o nível de confiança das minúcias extraídas (em uma escala de 0-100%) indicado por um código de cores:

* Vermelho - Minúcia com confiança abaixo de 30%.
* Amarelo - Minúcia com confiança entre 30% e 60%.
* Azul - Minúcia com confiança maior que 60%.

{% hint style="info" %}
A extração automática pode ser desabilitada por padrão. Se você deseja forçar a extração automática, verifique a seção [Extrair Minúcias Automaticamente](#extrair-minucias-automaticamente).
{% endhint %}

As seções a seguir descrevem as ferramentas disponíveis para edição de fragmentos.

#### Selecionar

A ferramenta de Selecionar permite que você mova e dê zoom na imagem.

#### Mover Minúcias

A ferramenta de Mover Minúcias permite ao usuário mover qualquer minúcia ou singularidade. Quando esta ferramenta é selecionada, é possível mover a minúcia clicando, segurando e arrastando para a posição desejada antes de soltá-la.

A ferramenta também permite que o usuário altere a orientação de uma minúcia clicando na seta de orientação e arrastando para a posição desejada.

#### Rotacionar Imagem

Selecione a ferramenta Rotacionar imagem para girar o fragmento, clique na imagem e arraste-a na direção de rotação desejada. Ao rotacionar, um indicador com o ângulo rotacionado aparecerá no canto inferior direito da imagem.

![](/files/noTVrD1FxPubvtSmRXmh)

#### Criar Minúcia

Existem três ferramentas para criar minúcias e singularidades. A primeira ferramenta, representada pelo ícone hexagonal, cria minúcias Neutras, Terminações e Bifurcações. A segunda, representado pelo ícone de círculo, cria núcleos. A terceira, representada pelo ícone do triângulo, cria deltas.

{% hint style="info" %}
As minúcias neutras não têm tipo definido e podem representar tanto uma bifurcação ou uma terminação.
{% endhint %}

![](/files/XPHQRY8E0bJs2dFZRSmL)

Para adicionar um núcleo ou um delta, selecione a ferramenta apropriada e clique com o botão esquerdo do mouse na posição desejada para criar a singularidade. Você pode mover as singularidades usando a ferramenta de [Mover Minúcias](#mover-minucias).

Para criar uma minúcia neutra, de terminação ou de bifurcação, selecione o tipo desejado no menu, clique na posição desejada e segure e arraste o cursor para definir sua orientação. Solte o botão do mouse para criar a minúcia.

![](/files/ql5j0yQamykPR6Es5f72)

#### Apagar Minúcias

Existem duas maneiras de apagar as minúcias no BEST. Selecionando individualmente quais minúcias você deseja remover ou removendo todas as minúcias diretamente. As ferramentas são mostradas na figura abaixo. A primeira é a ferramenta *Apagar todas as minúcias* e a segunda é a ferramenta *Apagar minúcias*.

![](/files/uZU1GZ78B16ISmN004sk)

Selecionar a ferramenta Apagar minúcias mudará o modo para o de remoção, indicado pela forma do cursor se transformando em uma borracha. Nesse modo, clicar em qualquer minúcia a removerá do fragmento.

Também é possível apagar múltiplas minúcias clicando e arrastando o cursor sobre as minúcias a serem removidas.

Sempre que criar ou excluir minúcias, você pode desfazer sua última ação pressionando `CTRL+Z`.

Para apagar todas as minúcias, selecione a ferramenta *Apagar todas as minúcias*. Quando selecionado, um pop-up de confirmação será exibido. Todas as minúcias e singularidades, tanto extraídas automaticamente quanto adicionadas pelo usuário, serão apagadas se confirmadas.

![](/files/xVQyXcn27AGRJYddbyFW)

{% hint style="info" %}
Caso queira refazer a extração automática, verifique a seção [Extrair Minúcias Automaticamente](#extrair-minucias-automaticamente).
{% endhint %}

#### Extrair Minúcias Automaticamente

Depois de selecionar um fragmento e entrar na tela de edição de fragmentos pela primeira vez, o sistema extrairá automaticamente as minúcias. Essa ferramenta permite realizar outra extração automática, se necessário. Uma caixa de diálogo será aberta ao reextrair minúcias, perguntando se o BEST deve manter as minúcias inseridas manualmente ou editadas junto com aquelas extraídas automaticamente pelo sistema.

![](/files/0aVFVSw2IUAQeG9ILR1s)

{% hint style="info" %}
A nova extração leva em consideração os filtros aplicados à imagem ao detectar minúcias.
{% endhint %}

#### Mostrar/esconder Minúcias

Você pode usar esta ferramenta para alternar a visibilidade das minúcias. O modo padrão desta ferramenta é `ativo`. Para alterar o modo de exibição, clique no ícone. Um pequeno número será exibido no canto inferior esquerdo indicando a quantidade de minúcias no fragmento.

{% hint style="success" %}
Passar o mouse sobre a ferramenta exibirá uma caixa com um controle deslizante para selecionar a quantidade de minúcias mostradas. As minúcias serão escondidas a partir das de menor confiança até as de maior confiança.
{% endhint %}

![](/files/PEXize8OsgJ2CyzIqpx0)

#### Mostrar/esconder Núcleos e Deltas

Você pode usar essa ferramenta para alternar a visibilidade de núcleos e deltas. O modo padrão desta ferramenta é `ativo`. Para alterar o modo de exibição, clique no ícone.

![](/files/PhDT7WwB5Cv9yhsMEfjE)

#### Imagem auxiliar: Binarizado

Você pode usar a ferramenta de binarização de imagem para aprimorar as cristas e os vales do fragmento e ajudá-lo a identificar as minúcias sobre a imagem. Ao aplicar a ferramenta de binarização, as cristas detectadas ficarão enegrecidas e os vales ou áreas onde nenhuma impressão for encontrada ficarão completamente brancas. Uma comparação entre uma imagem e sua versão binária é mostrada abaixo.

![](/files/8geef99mO2zHqLinKXFq) ![](/files/gFevDkVr4SvLtjCMjLlX)

#### Imagem auxiliar: Linhas de Crista

Linhas de Crista é uma ferramenta auxiliar que irá sobrepor uma fina linha colorida sobre a extensão da crista. Cada crista detectada terá um esquema de cores diferente para ajudar a distinguir uma crista da outra. Como mostrado nas imagens abaixo:

![](/files/8geef99mO2zHqLinKXFq) ![](/files/65Ewvj1199wqAsj5lW0Q)

#### Mostrar/esconder régua

Esta ferramenta alterna a exibição de uma régua nos lados superior e esquerdo da janela do fragmento. Uma linha pontilhada será mostrada quando você passar o cursor na área da régua. A linha será vertical ao passar o mouse na régua superior e horizontal ao passar o mouse na régua esquerda. Você pode criar uma marca clicando em um ponto na barra de régua. Desativar essa ferramenta limpará as marcas.

![](/files/7erUqCk3Hm0xFI2iWfX9)

#### Filtros

Selecionar a ferramenta de filtros abrirá um painel com várias opções. Os três botões na parte superior são usados para definir a área a ser filtrada: Filtrar Imagem Toda, Filtrar Região Retangular e Filtrar Região Poligonal. Você pode usá-los para determinar a área onde os filtros serão aplicados.

![](/files/S0DNVxZI4cUS6ytR3z69)

Os filtros disponíveis e alguns controles deslizantes para ajustar as propriedades de edição da imagem são apresentados sob dos botões de seleção de região. A imagem abaixo mostra um exemplo de uma região selecionada com a ferramenta de seleção retangular em que filtros de contraste e nitidez foram aplicados.

![](/files/JJAIyWF7VF9YDvEbdSNs)

{% hint style="warning" %}
Sempre que utilizar múltiplos filtros, a ordem de seleção afetará diretamente o resultado da edição da imagem. Cada novo filtro será aplicado na imagem já filtrada pelos anteriores.
{% endhint %}

Os resultados do filtro só serão salvos na imagem se você clicar no botão Aplicar filtros. Os botões Desfazer e Refazer também estarão disponíveis para navegar pelo histórico de edição do fragmento.

### Opções do menu drop-down

O menu drop-down fica no menu superior do painel do fragmento e consta com algumas opções como clonar, exportar e descartar o fragmento. Essas opções são descritas abaixo.

![](/files/IEfNPzxuXKdYDJ8DReHT)

#### Exportar Fragmento

A opção Exportar fragmento gerará uma imagem do fragmento da mesma maneira que o perito está vendo. Isso é, a imagem gerada terá a mesma quantidade de minúcias mostradas, os mesmos filtros e a mesma rotação que o perito está vendo no momento que clicar no botão.

#### Exportar template

A opção Exportar template gerará um arquivo `.tpt` do fragmento.

{% hint style="info" %}
Essa opção só está disponível para impressões digitais e palmares.
{% endhint %}

#### Importar template

A opção Importar template abrirá uma janela onde o usuário poderá selecionar importar um arquivo `.tpt`.

{% hint style="info" %}
Essa opção só está disponível para impressões digitais e palmares.
{% endhint %}

#### Clonar Fragmento

Há três opções de clonagem de fragmento. Elas são: Clonar fragmento, Clonar como palmar e Clonar como digital. A opção de *Clonar fragmento* criará um novo fragmento com as mesmas modificações do fragmento atual.

A opção *Clonar como digital* cria um fragmento de uma digital a partir de um fragmento de palmar. Inversamente, a opção *Clonar como palmar* cria um fragmento de uma impressão palmar a partir de uma impressão digital.

Quando selecionados, um pop-up aparecerá perguntando que ação o perito quer fazer, manter-se no fragmento atual ou ver o fragmento clonado.

![](/files/J3qh36tZKnpTNPDm8hEu)

#### Redefinir Fragmento

A opção Redefinir Fragmento descartará todas as modificações feitas no fragmento e o voltará para o estado de como foi extraído do vestígio.

![](/files/oxN8O9I4xvBXI4E6zEjS)

#### Descartar Fragmento

É possível descartar um fragmento. Fazê-lo vai marcar o fragmento como `Rejeitado`. Para isso, na tela do fragmento, clique no botão Descartar. Uma janela de confirmação será aberta. Confirme a operação para descartar o fragmento.

![](/files/qsd6fnEMuNB4CiqpxFcZ)

{% hint style="warning" %}
Você não pode descartar um fragmento com o status de `HIT` ou `NO HIT`.
{% endhint %}

Se um fragmento tiver o status `Em pesquisa`, não haverá opção para descartar o fragmento. Ainda assim, embora o fragmento não tenha um status de conclusão (HIT ou NO HIT), o status Em pesquisa pode ser revertido fazendo qualquer edição no fragmento atual, como girar, criar novas minúcias, aplicar filtros ou extrair novamente as minúcias por meio da ferramenta de extração automática . Depois que qualquer edição for feita, o botão de descarte será liberado novamente.

{% hint style="success" %}
Para retirar um fragmento do status `Em pesquisa` sem modificá-lo, clique nos filtros e confirme no botão Proceder com edição, então feche a caixa de filtros.
{% endhint %}

## Realizando Pesquisas em Fragmentos

Após extrair as minúcias do fragmento, é possível submeter uma busca ao GBDS. O GBDS pesquisará todos os indivíduos no banco de dados biométrico e retornará uma lista de candidatos de acordo com a pontuação correspondente. O número de candidatos retornados de cada pesquisa é configurável.

A operação de pesquisa é realizada como uma tarefa assíncrona, portanto, é possível continuar usando o BEST enquanto a pesquisa estiver em andamento.

{% hint style="info" %}
O BEST foi concebido com compatibilidade nativa à metodologia ACE-V, incorporando em seu design as etapas de Análise, Comparação, Avaliação e Verificação. A aplicação apresenta esse fluxo de forma intuitiva e amigável na interface, permitindo que o especialista acompanhe cada fase do processo com clareza e total aderência às melhores práticas internacionais.
{% endhint %}

Para realizar uma pesquisa, clique no botão Nova pesquisa na parte inferior da tela do fragmento.

![](/files/nWfRdeOz9qC9GR5fJowv)

### Configurações de busca

Antes de realizar uma operação de pesquisa, você pode configurar alguns parâmetros de busca. Para abrir a guia de configuração de busca, clique no símbolo de engrenagem ao lado do botão Nova pesquisa. A seguinte janela será aberta:

![](/files/64a12ThxZv1l9cYX041v)

Nesta janela, você pode:

* Limitar os dedos que o GBDS comparará o fragmento clicando no dedo.

  > O fragmento só será comparado aos dedos destacados em vermelho.
* Definir o limite de pontuação na busca.

  > Somente comparações com a pontuação maior ou igual ao valor definido retornarão como candidatos.
* Selecionar o tamanho máximo da lista de candidatos.

  > Define o número máximo de candidatos retornados pelas pesquisas de TP (Decadactilar) e UL (Latentes não-resolvidas).
* Restringir a lista por labels.

  > Restringe a lista para candidatos com a label selecionada. Você pode selecionar mais de uma label.
  >
  > Ao selecionar mais de uma label, o BEST irá restringir a listagem com a operação `ou`, isso é: label\_1 OU label\_2 OU …. OU label\_n.
* Definir se a pesquisa é orientada ou não.

  > Se este parâmetro for selecionado, o GBDS considerará apenas casamentos com rotação de no máximo 60° em qualquer direção. Se não for selecionado, o ângulo de rotação máximo será considerado 180° em qualquer direção.
* Selecionar se deseja limitar a pesquisa às Pessoas de interesse.
* Priorizar a pesquisa, enviando a pesquisa para uma fila de prioridade mais alta.

### Submetendo a Pesquisa

Ao enviar a pesquisa, aparecerá um pop-up confirmando o início da pesquisa e apresentando opções para ir aos resultados ou retornar ao caso.

![](/files/Z5BF34OLzOEL7p1CcyqG)

{% hint style="warning" %}
Observe que a operação de pesquisa é executada como uma operação assíncrona no GBDS. Dessa forma, todas as pesquisas são enfileiradas de acordo com a ordem de envio e podem levar algum tempo para serem processadas. Após enviar a pesquisa, você pode continuar usando o BEST e, uma vez finalizada a pesquisa, poderá acessar os resultados através do botão Ir para pesquisa.
{% endhint %}

Você pode verificar o status do resultado na aba de [Pesquisas](#pesquisas).

### Marcando Hit ou No Hit

Ao visualizar o resultado da pesquisa, o fragmento será apresentado à esquerda e o candidato de referência à direita. A lista de candidatos será mostrada abaixo da imagem de referência e você pode navegar pelos candidatos clicando na lista. Você também pode verificar os possíveis candidatos UL (Latentes não-resolvidas) através da aba UL.

{% hint style="success" %}
Você pode fazer a transição entre os candidatos usando as setas do teclado para cima e para baixo.
{% endhint %}

![](/files/XFIispPheMPzBTxXRldi)

Após analisar as imagens, caso haja casamento biométrico, é possível estabelecer uma correlação entre o fragmento e a biometria de referência. Esta operação é chamada de HIT. Um veredito NO HIT é dado quando nenhum dos candidatos retornados pode ser considerado um casamento biométrico.

As operações HIT e NO HIT só podem ser executadas uma vez para cada banco de dados e devem ser realizadas individualmente para TP e UL. Clicar em HIT ou NO HIT abrirá uma janela de confirmação.

![](/files/024pb1JB0hyVUtEm1en9) ![](/files/JFMMo24KbLNXBDbtQVVp)

Após uma confirmação de *NO HIT*, se o fragmento for uma impressão digital ou impressão palmar latente, ele se tornará uma UL. Um especialista pode definir um HIT para uma UL a qualquer momento se houver uma correspondência.

### Free Hand

Free Hand é um modo de edição que permite modificar os casamentos e minúcias de ambas as imagens ao visualizar o resultado da pesquisa. Para acessar este modo, clique no botão Free Hand na tela de comparação de pesquisa.

![](/files/kSToFsJqiblDjtyKgcGW)

Você pode usar o modo Free Hand para marcar novas minúcias, excluir minúcias erradas, criar novos casamentos e acessar outras ferramentas para melhorar a confiabilidade da ação de HIT. Após realizar as alterações, você pode marcar o fragmento como HIT nesta janela.

{% hint style="warning" %}
Alterar as minúcias no modo Free Hand não alterará as minúcias do fragmento. No entanto, o laudo gerado por uma decisão de HIT no Free Hand será exibido com as alterações feitas.
{% endhint %}

![](/files/jmEmFZteA85kvZcnzDUW)

{% hint style="warning" %}
Quaisquer alterações no fragmento ou nas imagens de referência feitas pelo modo Free Hand são exclusivas da comparação e não serão mantidas no banco de dados para futuras pesquisas.
{% endhint %}

### Ver Perfil

Ver perfil é uma função que permite ver o perfil completo do candidato. Para acessar este modo, clique no botão Ver perfil na tela de comparação de pesquisa. Uma nova guia será aberta com o perfil do candidato. A impressão digital que ocorreu casamento será destacada, conforme mostrado na imagem.

![](/files/X7pOZ3NbAkTNgpdfoELP)

## Buscas de Vídeo

{% hint style="info" %}
O suporte a vídeo pode estar desligado no seu ambiente. Confira com o seu administrador de sistemas se esta funcionalidade está disponível ou não.
{% endhint %}

Como mencionado anteriormente, é possível realizar buscas por face em arquivos de vídeo usando o BEST. Para fazer isso, você deve, primeiramente, inserir um vídeo como vestígio do caso. (veja a seção [Vestígios](#vestigios) para mais informações).

{% hint style="info" %}
Você pode inserir múltiplos arquivos de vídeo como um único vestígio e as buscas serão realizadas individualmente.
{% endhint %}

Após a criação de um vestígio de vídeo, o mesmo está disponível para inspeção na página do caso.

![](/files/6JLLk1eXc9QZhG9q8DnI)

Ao clicar o botão de Inspecionar, você será redirecionado para a tela de `Vestígios de Vídeo`, onde você pode consultar os vídeos vinculados ao vestígio e submetê-los para busca.

![](/files/TTQqjyC16Z1WVvmk1Y2m)

Para submeter um vídeo para busca, clique em Começar Processo.

![](/files/yoa3uXy8kqXCcy5seNpf)

{% hint style="warning" %}
Quando Pessoas de Interesse (POI) são adicionadas a casos que possuem vestígios de vídeo, o BEST Video realizará a busca de fragmentos extraídos de vídeos considerando apenas as POIs, não toda a base de dados.
{% endhint %}

{% hint style="warning" %}
Todas as buscas de vídeo submetidas ao GBDS entram em uma fila única para processamento. Em sistemas com múltiplos usuários, isso pode acarretar em um longo tempo para processamento das requisições. Você pode acompanhar o status de processamento de um vídeo na tela de `Vestígios de Vídeo` ao observar a barra inferior, na mesma posição do botão de Começar Processo.
{% endhint %}

Quando uma busca de vídeo é finalizada, o botão de Começar Processo na tela de `Vestígios de Vídeo` será alterado para Resultados da Busca. Ao clicar neste botão, você será redirecionado para a página de `Buscas de Vídeo`, onde você poderá ver todos os fragmentos extraídos dos vídeos.

![](/files/WLdSvVjC82Tv45pYLMVN)

Para realizar as buscas de vídeo, o BEST irá extrair as melhores imagens de face de cada pessoa e consolidá-las em uma única identidade. Para ver cada imagem individualmente, você pode desligar a opção Somente Consolidados na barra superior. Você também pode filtrar a lista por data, criador do caso, códigos de caso, vestígio ou fragmento, e status.

![](/files/1flYTAsQ9ZqYdV05zOq7)

Ao clicar em qualquer fragmento listado, você será redirecionado para tela de resultados da busca do respectivo fragmento. Nesta página, você poderá ver as imagens que atingiram o limiar de coincidência ordenadas por índice de similaridade. Os resultados serão apresentados na barra lateral direita da página.

![](/files/DsuKOANrLVjVsHFI4lpw)

A lista de resultados é dividida em duas abas: `Miniaturas` e `Lista`. A aba `Lista` mostra somente os detalhes do perfil e o índice para cada candidato. Você pode navegar as listas clicando nos diferentes candidatos.

![](/files/ncSDOi3Ka8nNq3n0IHdC)

O centro da página irá apresentar a imagem entrante e o candidato lado a lado, permitindo que você controle o zoom de ambas as imagens para melhor visualização. Para conferir os detalhes do perfil de um candidato, basta clicar o botão Ver Perfil. O perfil do candidato irá abrir em uma nova aba do navegador.

![](/files/HMlCVonVmL5S8pD5IfrZ) ![](/files/VfyDG9nIlFWiVMsByBcq)

Na tela de resultados de busca, você poderá marcar um candidato como HIT ou NO HIT da mesma forma descrita na seção [Marcando Hit ou No Hit](#marcando-hit-ou-no-hit).

Após marcar um *HIT*, você será redirecionado à geração do laudo, assim como descrito na próxima seção.

## Laudos

Um laudo é a declaração técnica do perito sobre a comparação entre o fragmento e os dados biométricos de referência do candidato. Para cada fragmento marcado como HIT, é gerado um laudo. Os laudos trazem informações sobre o caso, o candidato e uma comparação lado a lado do fragmento e da imagem de referência biométrica.

Você pode acessar os laudos de caso por meio do painel laudos da tela do Caso.

O acesso a um laudo permite visualizar todas as informações do laudo de *HIT* e editar a apresentação dos dados biométricos antes de exportar o arquivo do laudo.

O laudo completo conterá as seguintes informações:

* Número de registro do caso
* Tipo de crime
* Descrição
* Observações
* Número de ocorrência
* Lugar
* Datas de criação e atualização do caso
* Peritos presentes no caso e suas funções
* Pessoas de interesse
* Código de vestígios e informações
* Datas de criação e atualização de vestígios
* Código e status do fragmento
* Datas de criação e atualização do fragmento
* Índice biométrico da imagem de referência e pontuação do casamento
* Imagens do par que gerou um *HIT* com as minúcias e casamentos
* Perfil do candidato que gerou o *HIT*

![](/files/pc0bpE3J3jZSJnwi32xC)

### Editar Laudo

Você pode acessar a tela de edição de laudos clicando no botão Editar laudo.

![](/files/BXKGi9IGglqhqdWLfe03)

A tela de Edição de Laudos permite a você editar as informações e apresentação do laudo.

![](/files/yvIIe3hiXFJ6CS5W7TBz)

Algumas ferramentas disponíveis são as mesmas presentes na janela Edição de Fragmentos, e estão referenciadas à sua respectiva seção para melhor explicação de suas operações. As ferramentas disponíveis para edição de relatórios são:

* [Selecionar](#selecionar)
* [Mover Minúcias](#mover-minucias)
* [Criar Minúcia](#criar-minucia)
* [Apagar Minúcias](#apagar-minucias)
* [Mostrar/esconder Régua](#mostraresconder-regua)
* [Mostrar/esconder Minúcias](#mostraresconder-minucias)
* [Mostrar/esconder Núcleos e Deltas](#mostraresconder-nucleos-e-deltas)

{% hint style="warning" %}
Quaisquer alterações feitas no relatório não afetam o fragmento ou as imagens de referência.
{% endhint %}

E algumas ferramentas estão presentes apenas na janela do relatório:

* Criar casamentos

  > Esta ferramenta permite criar casamentos entre minúcias que não são geradas pelo sistema. Para usá-la, clique na ferramenta, depois clique na minúcia do fragmento e na minúcia correspondente na outra imagem.
* Apagar todas as minúcias

  > Esta ferramenta permite apagar todas as minúcias do fragmento ou do candidato. Para usá-la, passe o mouse sobre a ferramenta e clique na opção desejada. Uma janela de confirmação será exibida antes que a operação seja realizada.
* Sincronizar zoom e deslocamento

  > Esta ferramenta sincroniza o movimento e o zoom do fragmento e da imagem de referência.
* Quantidade de matches mostrados

  > Esta ferramenta é um controle deslizante que define o número de casamentos mostrados em ambas as imagens.
* Cortar

  > Esta ferramenta corta automaticamente ambas as imagens para mostrar apenas a área com minúcias correspondentes.
* Distribuir matches

  > Esta ferramenta irá mover os marcadores dos números das minúcias para as bordas da imagem. Os marcadores podem ser ajustados para melhor visibilidade, arrastando o marcador para a posição desejada. Você também pode clicar duas vezes em um marcador para alterar sua notação.

Além disso, uma opção para *Mostrar Círculos* ao redor das minúcias está localizada na parte inferior esquerda da tela. Desativar esta opção desativará o símbolo de minúcias quando não estiver no modo *Distribuir matches* e, quando estiver, removerá o círculo vermelho ao redor das minúcias.

{% hint style="warning" %}
Depois de editar um relatório, você precisa salvá-lo. Para salvar um relatório, clique no botão Salvar Relatório.
{% endhint %}

### Exportando Laudos

Na janela do relatório, é possível exportar o relatório gerado. Para isso, clique no botão Exportar e selecione o formato desejado.

![](/files/CrCnmFQe5i5eFp2kFQB7)

## Finalizando um Caso

Você pode encerrar um caso cancelando-o ou resolvendo-o. Essas opções são mostradas abaixo.

![](/files/yXBYMU5uEeI0Ik5w4APE)

Se todos os fragmentos em um caso tiverem vereditos finais (HIT ou NO HIT), você poderá resolver o caso clicando no botão Resolver caso. Fazê-lo vai abrir uma janela de confirmação. Clique no botão Resolver caso da janela de confirmação para confirmar a operação.

![](/files/ARt7LOn9yNXJpUMg6lCe)

A resolução de um caso o moverá da lista de Casos em aberto para a lista de Casos resolvidos.

Para cancelar um caso, ele não deve possuir vestígios. Se um caso tiver vestígios, você deverá removê-los antes de cancelar o caso. Tentar cancelar um caso com vestígios acionará um aviso:

![](/files/C7xej8Up4UvN6g5UKuQ6)

Um traço não pode ser removido se tiver algum fragmento sendo pesquisado ou com um determinado HIT ou NO HIT. Se o fragmento tiver um status de pesquisa em andamento, você poderá cancelá-lo seguindo as instruções da sessão [Descartar Fragmento](#descartar-fragmento). Quando nenhum fragmento impedir que o vestígio seja removido, você poderá remover o vestígio passando o mouse sobre ele na tela do caso e clicando no botão Remover.

![](/files/r2epWPlKmASbLlSN8OxF)

{% hint style="warning" %}
Se houver vários vestígios, todos os vestígios devem ser removidos individualmente antes de cancelar o caso.
{% endhint %}

{% hint style="warning" %}
Você **NÃO PODE** cancelar um caso com um fragmento em estado final (HIT ou NO HIT).
{% endhint %}

## Pendentes - Double Blind

Esta aba só está disponível quando a análise de Double Blind está habilitada. Você pode acessá-la pela tela principal, essa aba mostra os fragmentos pendentes de validação. A análise de Double Blind é utilizada quando há necessidade de cada `HIT:token:` ou \`NO HIT\`\` passar por uma dupla checagem às cegas para confirmar a decisão.

Há dois status possíveis para a análise: Primeira Análise e Segunda Análise. A primeira indica que foi realizada uma análise, a qual necessita de confirmação por meio do Double Blind. Ela estará marcada com um ponto amarelo. A segunda análise indica que a análise duplo-cega resultou em uma conclusão diferente da primeira análise: uma foi considerada `HIT` e a outra foi considerada `NO HIT`, o que significa que o veredito final do supervisor é necessário. Esse status é indicado com um ponto laranja.

{% hint style="info" %}
Você precisa de permissões de supervisor para ver casos que necessitam a segunda análise de Double Blind.
{% endhint %}

![](/files/WowYxEvyGcYNCdSdKz6l)

{% hint style="info" %}
A primeira e a segunda análises de Double Blind são realizadas sobre os mesmos resultados de pesquisa da análise original.
{% endhint %}

{% hint style="warning" %}
O segundo perito - aquele que realiza a primeira análise de Double Blind - não tem informações sobre a primeira decisão proferida para o caso.
{% endhint %}

{% hint style="info" %}
A quantidade de informações disponíveis para o supervisor sobre as análises anteriores pode ser configurada.
{% endhint %}

## Matches de UL

Você pode acessar a lista *Latentes não-resolvidas* clicando em Matches de UL no menu superior da tela principal. A tela mostrará todas as correspondências entre fragmentos UL e candidatos Decadactilares (TP). Também apresentará a pontuação de casamentos, o documento e o nome do candidato, o código do fragmento, o número da ocorrência, o perito responsável e o tipo de crime.

![](/files/LAU9IOLlez1s7a3Dsbyu)

Clicar em um perfil de Candidato da UL irá redirecioná-lo para a tela de edição do fragmento.

## Pesquisas

A aba de Pesquisas lista todas as pesquisas que foram enviadas. Essa aba exibe, para cada pesquisa, seu fragmento, título do caso, número da ocorrência, perito responsável, data de criação da pesquisa, tipo de biometria, status da pesquisa e status da análise para TP e UL. O status da pesquisa pode ser:

* `Pesquisa em Andamento`, marked with a yellow dot. It happens when the search is being processed or enqueued and waiting.
* `Resultado disponível`, marked with a green dot. It happens when the search is finished and the results are available for analysis.

Além disso, o status de TP e UL pode ser:

* `HIT`, identificado por um ponto verde.
* `NO HIT`, identificado por um ponto vermelho.
* `Em pesquisa`, identificado por um ponto azul.
* `Primeira Análise` e `Segunda Análise`, identificado por um ponto amarelo. Isso acontece quando o [Double Blind](#pendentes---double-blind) está ativo.

![](/files/evzmBF7j05SK4vXzCMYS)

## Acompanhamento de Desempenho

O BEST oferece duas ferramentas para acompanhamento de desempenho: o Top Hitters e o Relatório de Atividades. Ambos podem ser acessados a qualquer momento através do menu drop-down no canto superior direito, conforme mostrado na imagem abaixo.

![](/files/nTbFLho9zuXtSvsTpjhN)

A opção de Top Hitters mostrará uma lista dos peritos onde são classificados por HITs e NO HITs realizados dentro de um período de tempo definido.

![](/files/87xu3wvODKKpZy4sWFrG)

O Relatório de Atividades é uma ampla avaliação do uso do BEST, listando as pesquisas realizadas e as ações realizadas por cada perito. A tela Relatório de Atividades apresentará os dados de todos os peritos, conforme imagem abaixo.

![](/files/yI6DAHG0GeVovMTkNyvz)

## Ferramentas

Nesta tela, há opções para os usuários definirem suas preferências de uso:

* Tema: claro ou escuro;
* Linguagem;
* Formato da hora: relógio de 12 horas (AM/PM) ou de 24 horas;
* Formato de data: dd/mm/aaaa, mm/dd/aaaa, ou aaaa/mm/dd;
* Tamanho das minúcias - Define o tamanho das minúcias;
* Preenchimento de minúcias - Define se o contorno de minúcias será fino ou grosso e preenchido;
* Seta de minúcias - Define o comprimento da seta de orientação de minúcias;
* Transparência da minúcia - Define a transparência do indicador de minúcia;
* Cores de qualidade de minúcia;
* Botão Restaurar para o padrão - restaura as cores de minúcia para o padrão.
* Mostrar rótulo de candidatos ignorados - Essa opção ira rotular o candidato como `Ignorado` na lista de candidatos sempre que você escolher outro candidato para visualizar.

A página Configurações também apresenta informações sobre o BEST e suas versões de componentes.

![settings screen](/files/cELT88cTCtjJQCXZ5j8h)

## Atalhos

Esta seção lista os atalhos de teclado de acordo com as telas do BEST.

### Tela de Casos

| Atalho  | Descrição                           |
| ------- | ----------------------------------- |
| Shift+N | Abrir a Janela de criação de casos  |
| Shift+N | Fechar a Janela de criação de casos |

### Tela do Caso

| Atalho  | Descrição          |
| ------- | ------------------ |
| Alt+S   | Sair do caso       |
| Shift+E | Adicionar perito   |
| Shift+P | Adicionar POI      |
| Shift+N | Adicionar Vestígio |

### Tela de Laudo

| Atalho | Descrição                       |
| ------ | ------------------------------- |
| Alt+S  | Retornar para a tela de Laudos  |
| Alt+A  | Abrir a tela de Edição de Laudo |

### Tela de Edição de Laudo

| Atalho  | Descrição                                       |
| ------- | ----------------------------------------------- |
| Alt+C   | Alterna o mostrar círculos ao redor de minúcias |
| Shift+S | Salvar edições de laudos                        |
| Alt+S   | Retornar ao laudo                               |
| 1       | Ferramenta de seleção                           |
| Q       | Ferramenta de criação de minúcia neutra         |
| W       | Ferramenta de criação de minúcia de terminação  |
| E       | Ferramenta de criação de minúcia de bifurcação  |
| R       | Ferramenta de criação de núcleos                |
| T       | Ferramenta de criação de delta                  |
| A       | Ferramenta de criação de casamentos             |
| S       | Ferramenta de apagar minúcias                   |
| D       | Apagar todas as minúcias do fragmento           |
| F       | Apagar todas as minúcias do candidato           |
| G       | Mostrar/esconder régua                          |
| H       | Deslocamento e zoom sincronizado                |
| Z       | Mostrar/esconder minúcia                        |
| X       | Mostrar/esconder cores e deltas                 |
| C       | Alternar a visibilidade de casamentos           |
| V       | Ferramenta de corte                             |
| B       | Distribuir casamentos                           |

### Tela de Fragmento

| Atalho       | Descrição                                      |
| ------------ | ---------------------------------------------- |
| Shift+P      | Realizar uma nova busca                        |
| Shit+Alt+P   | Ir para a janela de busca                      |
| Shift+R      | Editar resolução                               |
| + ou Shift++ | Aumentar zoom                                  |
| - ou Shift+- | Diminuir zoom                                  |
| Alt+A        | Mostrar detalhes                               |
| Alt+S        | Sair da tela de fragmentos                     |
| Ctrl+Shift+Z | Desfazer filtro                                |
| Ctrl+Shift+Y | Refazer filtro                                 |
| Ctrl+Z       | Desfazer                                       |
| Ctrl+Y       | Refazer                                        |
| A            | Ferramenta de apagar todas minúcias            |
| D            | Extrair todas minúcias automaticamente         |
| 1            | Ferramenta de seleção                          |
| 2            | Ferramenta de mover minúcia                    |
| 3            | Ferramenta de rotacionar imagem                |
| Q            | Ferramenta de criação de minúcia neutra        |
| W            | Ferramenta de criação de minúcia de terminação |
| E            | Ferramenta de criação de minúcia de bifurcação |
| R            | Ferramenta de criação de núcleos               |
| T            | Ferramenta de criação de delta                 |
| A            | Ferramenta de apagar minúcia                   |
| S            | Ferramenta de criação de casamentos            |
| D            | Mostrar/esconder régua                         |
| Z            | Mostrar/esconder minúcia                       |
| X            | Mostrar/esconder cores e deltas                |
| C            | Alternar visibilidade de casamentos            |
| V            | Ferramenta de corte                            |
| B            | Distribuir casamentos                          |
| N            | Abrir filtros                                  |

### Tela de Free Hand

| Atalho | Descrição                                      |
| ------ | ---------------------------------------------- |
| D      | Apagar todas minúcias da latente               |
| F      | Apagar todas minúcias do candidato             |
| G      | Extrair automaticamente minúcias da latente    |
| H      | Extrair automaticamente minúcias do candidato  |
| 1      | Ferramenta de seleção                          |
| 2      | Ferramenta de mover minúcia                    |
| Q      | Ferramenta de criação de minúcia neutra        |
| W      | Ferramenta de criação de minúcia de terminação |
| E      | Ferramenta de criação de minúcia de bifurcação |
| R      | Ferramenta de criação de núcleos               |
| T      | Ferramenta de criação de delta                 |
| A      | Ferramenta de criação de casamentos            |
| S      | Ferramenta de apagar minúcia                   |
| J      | Mostrar/esconder régua                         |
| K      | Deslocamento e zoom sincronizado               |
| Z      | Mostrar/esconder minúcia                       |
| X      | Mostrar/esconder cores e deltas                |
| C      | Alternar visibilidade de casamentos            |
| V      | Imagem auxiliar: Binarizado                    |
| B      | Imagem auxiliar: Linhas de crista              |
| N      | Ferramenta de corte                            |
| M      | Distribuir casamentos                          |

### Tela de Busca

| Atalho                               | Descrição                           |
| ------------------------------------ | ----------------------------------- |
| Shift+N+H                            | No Hit                              |
| Shift+H                              | Hit                                 |
| Shift+A                              | Recolher a barra de listagem        |
| Shift+E                              | Abrir o modo Free Hand              |
| Shift+Q                              | Abrir a tela de Fragmentos          |
| Shift+W                              | Abrir perfil                        |
| Shift+P                              | Nova busca                          |
| Shift+C                              | Abrir configurações de busca        |
| Alt+S                                | Sair da tela de busca               |
| Left Arrow++ ou Shift+Left Arrow++   | Aumentar zoom da imagem esquerda    |
| Left Arrow+- ou Shift+Left Arrow+-   | Diminuir zoom da imagem esquerda    |
| Right Arrow++ ou Shift+Right Arrow++ | Aumentar zoom da imagem direita     |
| Right Arrow+- ou Shift+Right Arrow+- | Diminuir zoom da imagem direita     |
| 1                                    | Ferramenta de seleção               |
| A                                    | Mostrar/esconder régua              |
| S                                    | Deslocamento e zoom sincronizado    |
| Z                                    | Mostrar/esconder minúcia            |
| X                                    | Mostrar/esconder cores e deltas     |
| C                                    | Alternar visibilidade de casamentos |
| V                                    | Imagem auxiliar: Binarizado         |
| B                                    | Imagem auxiliar: Linhas de crista   |

### Tela de Edição de Vestígio

| Atalho       | Descrição                                              |
| ------------ | ------------------------------------------------------ |
| + ou Shift++ | Aumentar zoom                                          |
| - ou Shift+- | Diminuir zoom                                          |
| Shift+R      | Definir resolução                                      |
| Alt+A        | Mostrar detalhes                                       |
| Alt+S        | Abrir lista de vestígios                               |
| 1            | Ferramenta de seleção                                  |
| 2            | Ferramenta de definir resolução                        |
| Q            | Ferramenta de extração retangular de impressão digital |
| W            | Ferramenta de extração retangular de impressão palmar  |
| E            | Ferramenta de extração retangular de íris              |
| R            | Ferramenta de extração retangular de face              |
| A            | Ferramenta de extração poligonal de impressão digital  |
| S            | Ferramenta de extração poligonal de impressão palmar   |
| D            | Ferramenta de extração poligonal de íris               |
| F            | Ferramenta de extração poligonal de Face               |
| Z            | Ferramenta de reconhecimento de face                   |

### Tela de Matches de UL

| Atalho    | Descrição                           |
| --------- | ----------------------------------- |
| Shift+Q   | Abrir Free Hand                     |
| Shift+W   | Ver perfil                          |
| Shift+N+H | No Hit                              |
| Shift+H   | Hit                                 |
| 1         | Ferramenta de seleção               |
| A         | Mostrar/esconder régua              |
| S         | Deslocamento e zoom sincronizado    |
| Z         | Mostrar/esconder minúcia            |
| X         | Mostrar/esconder cores e deltas     |
| C         | Alternar visibilidade de casamentos |
| V         | Imagem auxiliar: Binarizado         |
| B         | Imagem auxiliar: Linhas de crista   |


# SmartSense

## Introdução

O **GBS SmartSense** é uma aplicação web para monitorar clusters GBDS, permitindo que o usuário veja relatórios ao vivo do desempenho e integridade do ambiente.

Este manual está atualizado para a versão 1.2.4 do SmartSense.

### Acesso e Autenticação

O GBS SmartSense deve ser acessado com um navegador web e recomendamos o Google Chrome. A URL para acesso é específica para cada ambiente. Se necessário, entre em contato com a equipe de suporte da Griaule para obter a URL correta.

É necessário se autenticar para acessar o aplicativo. As credenciais necessárias para o GBS SmartSense são nome de usuário e senha.

![tela de login](/files/ttXLwAc6S5UGP1Rs70Gt)

{% hint style="info" %}
Na parte inferior da tela há uma opção para alterar o idioma da interface do usuário. Esta opção também está disponível nas configurações após o login.
{% endhint %}

### Autenticação de dois fatores (2FA)

Quando a autenticação de dois fatores (2FA) estiver ligada, na primeira vez que você fizer login, após entrar seu username e senha, será mostrado um QR Code que deve ser registrado no Google Authenticator.

{% hint style="info" %}
Google Authenticator é um gerador de códigos de autenticação disponível como um aplicativo para smartphones [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\&hl=en\&gl=US) e [iOS](https://apps.apple.com/us/app/google-authenticator/id388497605).
{% endhint %}

![QR Code do Google authenticator para autenticação de dois fatores](/files/vZtCvqoPFIf62RBWi5ep)

Após registrar com sucesso o QR Code no Google Authenticator, insira o código de seis dígitos gerado e clique em Enviar.

Você só precisará registrar o QR Code uma vez. Mas, a cada login subsequente, você precisará inserir o código de seis dígitos gerado pelo Google Authenticator.

![Autenticação de dois fatores](/files/mH5imTLiK5jYBSCmqcdb)

Existe um número limitado de tentativas de login sem sucesso que um usuário pode fazer. Sempre que um código incorreto é inserido, uma mensagem de erro será exibida:

![Autenticação de dois fatores - código incorreto](/files/Jkhg2ogkx6Ci7Ld5PtL6)

Se você atingir o número máximo de tentativas de login sem sucesso, sua conta será automaticamente bloqueada.

![Autenticação de dois fatores - conta bloqueada](/files/7yo4d0gRfw4nI8OnyGnj)

{% hint style="warning" %}
Se sua conta for bloqueada, entre em contato com o administrador do sistema.
{% endhint %}

### Logins Simultâneos e Cadastro de Navegador

Apenas uma sessão por usuário é permitida. Não é possível fazer login simultaneamente com um mesmo perfil mais de uma vez na aplicação. Se um usuário já estiver conectado e outro acesso acontecer usando o mesmo nome de usuário e senha, o usuário com a sessão mais antiga será notificado e desconectado na próxima ação.

![](/files/7UiLr4L1IrCKej5o2XXU)

Além disso, apenas um navegador pode ser usado de cada vez. Ao tentar fazer login usando um navegador diferente, o usuário será informado que é necessário autenticar o novo navegador. A autenticação de um novo navegador revogará o acesso do navegador anterior.

![](/files/j611Oae674FCI86chJUJ)

Para autenticar um novo navegador, clique em Autenticar e, em seguida, insira o código de verificação que será enviado para o e-mail vinculado à conta do usuário.

![](/files/Ilv5FvzPPDl4XWjRD5sK)

Se a autenticação for bem-sucedida, uma notificação aparecerá no canto superior direito da tela após o login.

![](/files/wjhgKXQLTd2QoCVox1g3)

### Redefinir Senha

Você pode redefinir sua senha caso a esqueça.

Para redefinir sua senha, na tela de login, clique em Esqueceu sua senha?:

![](/files/hFZxqyaT8hOpKuP7tAli)

Em seguida, insira o nome de usuário do perfil e clique em Enviar.

![](/files/onlhRDbmG2erLfJ1obzY)

Um e-mail contendo um código de verificação será enviado para o endereço de e-mail vinculado a esse perfil. Insira o código de verificação e clique em Enviar código.

![](/files/Ot8dKxSQ14s96fvdglT8)

Se o código estiver correto, você poderá criar uma nova senha. Insira a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a redefinição, clique em Redefinir senha.

![](/files/9Rk4JTv7VQGBIlqeqNcY)

## Interface do Usuário

Há seis telas que podem ser acessadas usando a barra lateral: `Lista de Nós`, `Comparação entre Configurações`, `Port Sweep`, `Histórico de Transações`, `Fila` e `Lista de Transações`.

![barra lateral](/files/vH8Nb98JpwPauDTCBAGz)

### Lista de Nós

A tela de `Lista de Nós` mostra informações sobre espaço de armazenamento disponível, RAM, temperatura, número de matchers e status para cada host/IP.

![tela de lista de nós](/files/EU6y7VBByiNqQaf6dDYU)

Para atualizar as informações mostradas, use o botão de atualização ou recarregue a página pressionando Ctrl/Command + R no teclado.

![botão de atualização](/files/RrRwU9Vrrk1qmkuqYGvQ)

No canto superior direito, é possível filtrar as informações mostradas por hostname ou endereço IP:

![lista de nós filtrada](/files/B02NmIzXNE7LZtL2q1nL)

Para criar um novo nó sem acessar diretamente a base de dados, clique no botão Novo Nó no canto inferior direito. Insira as informações de hostname, IP, e porta. Em seguida, marque se é um nó **Ativo**. Finalmente, clique em Adicionar Nó.

O status **Ativo** significa que o nó será analisado e mostrado no SmartSense.

![popup de novo nó](/files/z1B1i4dcm2dwqy43cHzF)

{% hint style="warning" %}
O **hostname** identifica o nó e deve ser único. Tentar criar um novo nó com o mesmo hostname de um nó já existente sobrescreverá o nó existente.
{% endhint %}

#### Detalhes do Nó

Clique em um item da Lista de Nós para abrir a tela de Detalhes do Nó, que mostra informações detalhadas sobre os serviços rodando naquele nó (aba de `Serviços`) e seus recursos de hardware (aba de `Recursos`). Nas duas abas, é possível atualizar as informações mostradas clicando no botão de atualização localizado no canto superior direito da tela.

**Aba de Serviços:**

A aba de `Serviços` mostra os serviços rodando no nó, com suas respectivas portas e seus status.

![aba de serviços](/files/Yj0ri7Che35ql8iJvEWy)

**Aba de Recursos:**

A aba de `Recursos` mostra informações sobre o hardware do nó, como uso do disco, uso de memória RAM, taxa de transmissão, etc.

![aba de recursos](/files/IpkI8XVSvAloyakbUf0X)

### Comparação entre Configurações

A tela de `Comparação entre Configurações` permite que o usuário selecione um arquivo de configuração e um nó de referência para comparar suas configurações com todos os outros nós. As configurações divergentes são mostradas em vermelho.

![tela de comparação entre configurações](/files/C2QeD4c8ZPuIWEG6Anzi)

Para selecionar um arquivo de configuração, clique no menu *dropdown* e escolha um arquivo da lista.

![menu de seleção de arquivo de configuração](/files/uujOuP0WKZkblT53dlhn)

Em seguida, para selecionar um nó, clique no menu *dropdown* e escolha um nó da lista.

![menu de seleção de nós](/files/cOiNs8Fqrtyu8hYZaRlF)

É possível remover linhas da tabela clicando no `X` localizado no lado esquerdo de cada linha. Essa opção simplesmente remove a linha da visualização, nenhum arquivo de configuração é modificado.

![botão de remover linha da visualização](/files/UTZLBqdCfKQ35IsSDvEq)

Para restaurar a lista original com todas as linhas, marque a opção `Mostrar todas as linhas`.

![restaurar todas as linhas](/files/7vR7LeByyQPQLknxDtUV)

É possível filtrar os resultados e mostrar somente as colunas com nós que possuem configurações diferentes. Para fazer isso, marque a opção `Mostrar somente nós com diferenças`.

### Port Sweep

A tela de `Port Sweep` permite que o usuário selecione um IP e portas específicas para fazer um port sweep em todos os hosts e mostrar os resultados em uma tabela:

![tela de port sweep](/files/afPKmXDzD7UmvbKM7h4O)

Para selecionar um IP, clique no menu *dropdown* e escolha um endereço IP.

![port sweep lista de ips](/files/fLMfzB56crYQwMT2AeOA)

As portas podem ser selecionadas como uma lista de portas separadas por vírgula (ex. `8000, 8080, 8125`); como um intervalo, com os limites superior e inferior separados por um hífen (ex. `8005-8015`); or como uma combinação de ambos (ex. `8005-8015, 8080`).

![port sweep seleção de portas](/files/eZIxcEMgBecVQdX07ylQ)

Depois de selecionar um IP e as portas, clique no botão Filtrar, localizado no canto superior direito da tela para realizar o port sweep.

### Histórico de Transações

A tela de `Histórico de Transações` mostra o uso em gráficos de barras (tipo histograma), criados com Kibana. Há cinco abas: `Identify`, `Identify (Latent)`, `Verify`, `Enroll` e `Update`. Em cada aba, é possível interagir com o gráfico, por exemplo, colocando o cursor sobre uma barra para mostrar o número de operações ou clicando e arrastando o cursor sobre algumas barras para dar zoom naquele intervalo. Na parte superior do gráfico, é possível adicionar filtros para personalizar a forma como as informações são mostradas.

![tela de histórico de transações](/files/6lpBFUCyM11AvDQLTE2Z)

{% hint style="warning" %}
Para essa função, é preciso ter o ELK instalado e configurado corretamente. Além disso, é preciso ter os seguintes parâmetros em `config.properties`:

```properties
linkVerify=<link to Kibana dashboard>
linkIdentify=<link to Kibana dashboard>
linkIdentifyLatent=<link to Kibana dashboard>
linkEnroll=<link to Kibana dashboard>
linkUpdate=<link to Kibana dashboard>
```

{% endhint %}

### Fila

A tela de `Queue` mostra a fila atual de transações listada por prioridade.

![tela de fila](/files/8N0hFW7fhoyWgCsHNie0)

A lista é continuamente atualizada e o tempo de atualização pode ser ajustado usando o menu *dropdown* localizado no canto superior direito da tela:

![tela de fila - seleção de tempo de atualização](/files/vfgfLqV38XvW4xen3Fhp)

É possível exibir a fila para o cluster inteiro ou para um nó referência. Para escolher um nó, clique no menu *dropdown* localizado no canto superior da tela e selecione um nó:

![tela de fila - seleção de nó de referência](/files/MrnhfzPwxjyv8kpJsZFa)

### Lista de Transações

A tela de `Lista de Transações` mostra uma lista de transações processadas em um determinado período de tempo.

Ao abrir a página, serão exibidas as transações realizadas na última hora da data atual.

Para mostrar as transações realizadas em um intervalo de tempo diferente, selecione uma data, um tempo inicial e um tempo final. Em seguida, clique no botão Filtrar.

![tela de lista de transações](/files/r2XuqVk4sjOO9xJ1n4vD)

Também é possível filtrar as transações por PGUID, TGUID, label, chave e biográfico. Para isso, utilize o menu *dropdown* localizado no canto superior direito da tela para selecionar o tipo de filtro, preencha o campo *Valor* e clique no botão Filtrar.

Para obter informações detalhadas sobre uma transação, clique em um item da lista para mostrar a tela `Detalhes da transação`:

![tela de detalhes da transação](/files/FznV8UnwZ4G0N2LpsqUB)

É possível baixar os dados biométricos da transação. Para isso, clique no botão Download, localizado no canto superior direito da tela. O arquivo ZIP para download conterá as imagens das biometrias, bem como os templates.

Para mais informações sobre o status da transação, passe o mouse sobre *Ver detalhes* no lado direito da tela, na seção *Problemas*.

![tela de detalhes de transação - detalhes do status](/files/yf3gds8oNJ8Sm5Ng6Ic5)

### Menu

No canto superior direito da tela, clique sobre o nome de usuário para acessar o menu:

![menu](/files/WRNC1WbVWFZ9UU46FhuS)

As opções disponíveis são:

* Configurações;
* Manual;
* Sair.

#### Configurações

Nesta tela, há opções para os usuários definirem suas preferências de uso:

![opções de configuração](/files/KDy8OpxmvWrlP3w6ukZd)

* Tema: **claro** ou **escuro**;
* Idioma: **Português** ou **Inglês**;
* Formato de Data: **dd/mm/yyyy**, **mm/dd/yyyy**, ou **yyyy/mm/dd**;
* Formato de Hora: relógio de **12 horas (AM/PM)** ou de **24 horas**.

![tema claro ou escuro](/files/de4JRUn19WZzeVIxF5fW)


# Print

## Introdução

O **GBS Print** é uma aplicação web para gerenciar e imprimir documentos de identidade. Ele recebe documentos a serem impressos e os agrupa em lotes. Os lotes são então impressos, digitalizados e inspecionados para garantir que os documentos foram impressos corretamente. Em seguida, ele verifica os documento e os vincula ao código tipográfico único (código de barras) presente na lâmina de documento recebida da gráfica. Finalmente, os lotes de documentos verificados são agrupados em malotes e enviados para os postos para distribuição. O GBS Print também permite ao usuário configurar as impressoras usadas para imprimir os documentos e gerar relatórios sobre os documentos processados.

Este manual está atualizado para a versão 1.0.0 do Print.

### Acesso e Autenticação

Você deve acessar a aplicação com um navegador web (Google Chrome é recomendado). A URL de acesso é específica para cada implantação. Se necessário, entre em contato com a equipe de suporte da Griaule para obter a URL correta.

A autenticação é necessária para acessar a aplicação. As credenciais necessárias são nome de usuário e senha.

![](/files/tn5gugbDNQSVMWaImL41)

{% hint style="info" %}
Na parte inferior da tela há uma opção para alterar o idioma da interface do usuário. Esta opção também está disponível nas configurações após o login.
{% endhint %}

### Autenticação de dois fatores (2FA)

Quando a autenticação de dois fatores (2FA) estiver ligada, na primeira vez que você fizer login, após entrar seu username e senha, será mostrado um QR Code que deve ser registrado no Google Authenticator.

{% hint style="info" %}
Google Authenticator é um gerador de códigos de autenticação disponível como um aplicativo para smartphones [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\&hl=en\&gl=US) e [iOS](https://apps.apple.com/us/app/google-authenticator/id388497605).
{% endhint %}

![](/files/dJuskUrRcw9gP8BPlr4h)

Após registrar com sucesso o QR Code no Google Authenticator, insira o código de seis dígitos gerado e clique em Enviar.

Você só precisará registrar o QR Code uma vez. Mas, a cada login subsequente, você precisará inserir o código de seis dígitos gerado pelo Google Authenticator.

![](/files/xvzlpXzIH2IUY1l6QNMm)

Existe um número limitado de tentativas de login sem sucesso que um usuário pode fazer. Sempre que um código incorreto é inserido, uma mensagem de erro será exibida:

![](/files/OnV8E3HEzETPRTzZoAS7)

Se você atingir o número máximo de tentativas de login sem sucesso, sua conta será automaticamente bloqueada.

![](/files/3LiEG4qD0e0ttfEsZSV8)

{% hint style="warning" %}
Se sua conta for bloqueada, entre em contato com o administrador do sistema.
{% endhint %}

### Logins Simultâneos e Cadastro de Navegador

Apenas uma sessão por usuário é permitida. Não é possível fazer login simultaneamente com um mesmo perfil mais de uma vez na aplicação. Se um usuário já estiver conectado e outro acesso acontecer usando o mesmo nome de usuário e senha, o usuário com a sessão mais antiga será notificado e desconectado na próxima ação.

![](/files/pBHqGNQa6ndRYN6aP7Ev)

Além disso, apenas um navegador pode ser usado de cada vez. Ao tentar fazer login usando um navegador diferente, o usuário será informado que é necessário autenticar o novo navegador. A autenticação de um novo navegador revogará o acesso do navegador anterior.

![](/files/tiqokLmIFnOtfIjxN2os)

Para autenticar um novo navegador, clique em Autenticar e, em seguida, insira o código de verificação que será enviado para o e-mail vinculado à conta do usuário.

![](/files/AYoQadqQ3VbicUjS4nQY)

Se a autenticação for bem-sucedida, uma notificação aparecerá no canto superior direito da tela após o login.

![](/files/MBrdLDPb14KC9PhXvjcC)

### Mudar ou Redefinir Senha

Por motivos de segurança, você pode mudar sua senha ou redefini-la caso a esqueça.

#### Mudar Senha

Para mudar sua senha, após fazer login, passe o mouse sobre seu nome de usuário no canto superior direito da tela e clique em Mudar senha.

![](/files/NJvLPNFDHWc2bH7QwL37)

Em seguida, insira a senha atual e a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a alteração, clique em Mudar senha.

![](/files/GldUb7kQ0Bla6LneaRHb)

#### Redefinir Senha

Para redefinir sua senha, na tela de login, clique em Esqueceu sua senha?:

![](/files/dceb40At9iOwFK2WoV7L)

Em seguida, insira o nome de usuário do perfil e clique em Enviar.

![](/files/ULaSsVFmTV68sWdTIAXt)

Um e-mail contendo um código de verificação será enviado para o endereço de e-mail vinculado a esse perfil. Insira o código de verificação e clique em Enviar código.

![](/files/5LF0pKo1QNoRaMTwlL0h)

Se o código estiver correto, você poderá criar uma nova senha. Insira a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a redefinição, clique em Redefinir senha.

![](/files/w2LsF2XUpN8DrhxN8J1R)

## Interface do Usuário

Após fazer o login, o usuário será direcionado para a tela principal do GBS Print. A interface do usuário é dividida em duas seções principais: a barra superior e a área de conteúdo.

Na barra superior, há 5 abas e um menu suspenso:

![](/files/jLmhOTM1rQyXh2CdTnBQ)

1. [Lotes](#aba-lotes)
2. [Check Print](#aba-check-print)
3. [Malotes](#aba-malotes)
4. [Impressoras](#impressoras)
5. [Relatórios](#relatorios)
6. [Menu no Nome de Usuário](#menu). Passando o mouse sobre o **nome de usuário**, há um [menu suspenso](#menu) com opções adicionais.

### Lotes

A aba `Lotes` exibe a lista de lotes de documentos que foram criados. Um lote é um grupo de documentos que serão impressos juntos. O número de documentos em um lote é configurável. Os lotes são organizados em uma tabela com colunas para o ID do lote, data de criação, layout, prioridade, posto, número de documentos no lote e seu status.

![](/files/1jiKCONfKOh6VE3M4UE4)

Há **oito** possíveis status para um lote:

| Status                    | Cor     | Descrição                                                                              |
| ------------------------- | ------- | -------------------------------------------------------------------------------------- |
| **Gerado**                | Verde   | Status inicial. Documentos estão aguardando impressão.                                 |
| **Pronto para impressão** | Azul    | Comando de impressão foi registrado e documentos estão prontos para serem impressos.   |
| **Imprimindo**            | Amarelo | Documentos estão sendo impressos.                                                      |
| **Impresso**              | Verde   | Todos os documentos no lote foram impressos.                                           |
| **Checando**              | Cinza   | Documentos no lote estão sendo verificados.                                            |
| **Checagem OK**           | Verde   | Todos os documentos no lote foram verificados. O lote pode ser colocado em um malote.  |
| **Em malote**             | Cinza   | Lote foi adicionado a um malote e está aguardando para ser enviado ao posto designado. |
| **Pronto**                | Verde   | Status final. Lote foi enviado para o posto designado.                                 |

O status de um lote evolui à medida que os documentos são processados seguindo o fluxo de trabalho do Print. Para mais detalhes, consulte os **Status de Lotes** na seção de [Lotes](#aba-lotes) dos [Fluxos de Trabalho](#fluxos-de-trabalho).

No canto superior direito da tela, há opções de filtros para ajudar o usuário a encontrar lotes específicos. É possível filtrar por intervalo de datas, protocolo, documento, posto, layout e status. Para aplicar um filtro, selecione os filtros desejados e clique em Filtrar. Em seguida, apenas os lotes que atendem aos critérios selecionados serão exibidos.

![](/files/gCiBQbkMXgs8W3AFkDEi)

Para remover um filtro, clique no botão X ao lado do filtro aplicado, ou clique no botão amarelo Limpar filtros para remover todos os filtros de uma vez.

![](/files/FmCZWDGdyWdPXytJ5KQN)

#### Detalhes do lote

Clicando em um dos lotes da lista, a tela de `Detalhes do lote` será aberta. Esta tela exibe os documentos que fazem parte do lote, incluindo o status de cada documento.

![](/files/8KwfIOuQz2oaSdfzoKIZ)

Há **oito** possíveis status para um documento em um lote:

| Status          | Cor      | Descrição                                                                            |
| --------------- | -------- | ------------------------------------------------------------------------------------ |
| **Imprimir**    | Azul     | Status inicial. Documento foi adicionado ao lote e está aguardando impressão.        |
| **Imprimindo**  | Amarelo  | Documento está sendo impresso.                                                       |
| **Impresso**    | Verde    | Documento impresso com sucesso.                                                      |
| **Falha**       | Vermelho | Impressão do documento falhou.                                                       |
| **Rejeitado**   | Laranja  | Houve um problema com o documento após a impressão e ele foi rejeitado pelo usuário. |
| **Checagem OK** | Verde    | Documento verificado com sucesso.                                                    |
| **Cancelado**   | Cinza    | Documento cancelado pelo usuário.                                                    |
| **Pronto**      | Verde    | Documento foi enviado para o posto designado.                                        |

O status de um documento evolui à medida que ele é processado seguindo o fluxo de trabalho do Print. Para mais detalhes, consulte os **Status de Documentos** na seção de [Lotes](#aba-lotes) dos [Fluxos de Trabalho](#fluxos-de-trabalho).

#### Imprimindo um lote

Para imprimir um lote, clique no botão Imprimir lote, localizado no canto inferior direito da tela, e confirme clicando em Imprimir lote na caixa de diálogo.

![](/files/38qYdf4cEQNqVTwu0Z0P)

Quando a operação de impressão é bem-sucedida, o status do lote e dos documentos mudará para **Impresso**.

A folha de rosto de um lote contém informações sobre o lote e os documentos que ele contém. Para exportar a folha de rosto, clique no botão Exportar folha de rosto. A folha de rosto será baixada em PDF.

![](/files/OcHSRsZq3FCVsa9lJjoE)

#### Rejeitando e Reimprimindo um Documento de um Lote

Após imprimir um lote, se houver problemas, é possível rejeitar ou reimprimir documentos específicos. Para fazer isso, selecione os documentos usando as caixas de seleção no lado esquerdo da linha do documento. Em seguida, uma caixa de diálogo aparecerá com as opções de `Reimprimir` (botão azul) ou `Rejeitar` (botão vermelho) os documentos selecionados. Um documento só pode ser rejeitado ou reimpresso se seu status for **Impresso**.

![](/files/TzVMJTRiixK2AVIukblb)

**Rejeitando um Documento:**

Após clicar em Rejeitar documentos, uma caixa de diálogo aparecerá mostrando o número de documentos que serão rejeitados e pedindo um motivo para a rejeição. Insira o motivo e clique em Rejeitar documentos.

![](/files/xKNxjmdyuiPnEhGBsNAe)

Esta ação mudará o status dos documentos selecionados para **Rejeitado**.

![](/files/sQiHpkeqdIohmuHAMQqT)

**Reimprimindo um Documento:**

Após clicar em Reimprimir documentos, uma caixa de diálogo aparecerá mostrando o número de documentos que serão reimpressos. Para confirmar a reimpressão, clique em Reimprimir documentos.

![](/files/GuNaitjmtMJ0sBkiC5At)

Esta ação **removerá** os documentos do lote atual:

![](/files/04TzCM1SWk45H3Z9TWJK)

E criará um **novo** lote com os documentos selecionados. O status do novo lote será **Gerado**, e o status dos documentos será redefinido para **Imprimir**.

![](/files/2h36fTCu2wV4U0fjB9hR)

{% hint style="info" %}
Se um lote disponível existir - ou seja, se houver um lote com o mesmo layout e posto que ainda não está cheio - os documentos serão adicionados a esse lote em vez de criar um novo.
{% endhint %}

### Check Print

A aba `Check Print` mostra uma lista de documentos digitalizados e seus status atuais.

Antes de iniciar este processo, o usuário deve digitalizar os documentos e colocá-los na pasta configurada no menu [Configurações](#configuracoes) para o layout do documento. A colocação de arquivos nessa pasta pode ser automática, variando de acordo com o ambiente.

Após serem impressos e digitalizados, os documentos são processados automaticamente pelo GBS Print e exibidos nesta lista. O processo de verificação serve a dois propósitos principais: verificar se o documento foi impresso e digitalizado corretamente e vincular o número do documento ao código tipográfico da página. O código tipográfico é um código alfanumérico único que está presente em todas as páginas em branco de documentos (lâminas) e é usado para garantir a autenticidade do documento.

Para instruções práticas sobre como manusear e escanear os documentos impressos, consulte o Apêndice [Procedimento para escaneamento de documento e Check Print](#procedimento-para-escaneamento-de-documento-e-check-print).

![](/files/olyZ6YyS8m6bS0L5km1H)

Há **sete** possíveis status para um documento na aba `Check Print`:

| Status                   | Cor      | Descrição                                                                                                                                          |
| ------------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **OK**                   | Verde    | Documento foi verificado e vinculado ao tipográfico com sucesso.                                                                                   |
| **Cancelado**            | Cinza    | Documento foi cancelado pelo usuário.                                                                                                              |
| **Documento não lido**   | Vermelho | Número do documento não pôde ser lido automaticamente a partir do código QR do documento digitalizado.                                             |
| **Documento não existe** | Vermelho | Número do documento lido a partir do código QR do documento digitalizado não existe nos registros do GBS Print.                                    |
| **Tipográfico não lido** | Vermelho | Documento foi lido com sucesso, mas o código tipográfico não pôde ser lido automaticamente a partir do código de barras do documento digitalizado. |
| **Falha na atualização** | Vermelho | Houve um problema ao atualizar as informações do documento no GBDS.                                                                                |
| **Falha**                | Vermelho | Houve um erro interno durante o processamento.                                                                                                     |

O status de um documento na aba `Check Print` evolui à medida que ele é processado seguindo o fluxo de trabalho do Print. Para mais detalhes, consulte a [Aba Check Print](#aba-check-print) na seção [Fluxos de Trabalho](#fluxos-de-trabalho).

Como nas outras abas, há opções de filtros para ajudar o usuário a encontrar documentos específicos. É possível filtrar por intervalo de datas, número do documento, tipográfico e status. Para aplicar um filtro, selecione os filtros desejados e clique em Filtrar. Em seguida, apenas os documentos que atendem aos critérios selecionados serão exibidos.

Para remover um filtro, clique no botão X ao lado do filtro aplicado, ou clique no botão amarelo Limpar filtros para remover todos os filtros de uma vez.

![](/files/WOTDt38cWHR83dExtEGn)

Se um documento passar com sucesso por todas as etapas de verificação automática, seu status será **OK**, e nenhuma intervenção do usuário será necessária - no entanto, é recomendável que o usuário faça uma rápida inspeção visual para garantir que todas as informações foram capturadas corretamente.

Clicando na linha do documento, os **detalhes do documento** serão exibidos, incluindo a imagem do documento digitalizado e os campos que foram lidos. Neste caso, o documento e o tipográfico são vinculados automaticamente. O botão Vincular no canto inferior direito da tela permanece desativado até que alguma informação nos campos do documento ou tipográfico seja alterada.

![](/files/NZCKOTvljbV8zRO0WOAE)

#### Vinculando um Documento e um Tipográfico Manualmente

Caso o documento não passe na verificação automática, o usuário deve verificar e vincular manualmente o documento ao tipográfico. Para fazer isso, abra os detalhes do documento clicando na linha do documento. Em seguida, dependendo do erro, o usuário pode precisar inserir manualmente o número do documento, o tipográfico ou ambos. Após inserir as informações necessárias, o botão Vincular no canto inferior direito da tela será habilitado e ficará azul. Clique nele para vincular o documento e o tipográfico e finalizar o processo de verificação manual.

![](/files/C8Z5DSdsn2zVBjqDXuhX) ![](/files/I9hn6QMiJnwlnKhfNRCF)

Se a vinculação for bem-sucedida, o status do documento mudará para **OK**.

![](/files/X8M5IxxG0aduminmT4RI)

#### Cancelando um Documento

Após um documento ser vinculado a um tipográfico, se necessário, é possível cancelar o documento a qualquer momento, mesmo após seu envio. Para fazer isso, clique na linha do documento para abrir os detalhes do documento. Em seguida, clique no botão Cancelar documento no canto inferior esquerdo da tela. Uma caixa de diálogo aparecerá pedindo confirmação. Clique em Cancelar documento para confirmar a ação.

![](/files/PYRk5WR8c6YFXhUe8p6O)

### Malotes

A aba `Malotes` exibe a lista de malotes que foram criados e seus respectivos status. Um malote é um grupo de lotes com documentos que foram checados ou rejeitados.

![](/files/ErfGFkoqZm3jDTqkOdE4)

Há somente **dois** possíveis status para um malote:

| Status      | Cor          | Descrição                                                  |
| ----------- | ------------ | ---------------------------------------------------------- |
| **Gerado**  | Verde        | Status inicial. Malote foi criado e está aguardando envio. |
| **Fechado** | Transparente | Status final.                                              |

O status de um malote evolui à medida que ele é processado seguindo o fluxo de trabalho do Print. Para mais detalhes, consulte a [Aba Malotes](#aba-malotes) na seção [Fluxos de Trabalho](#fluxos-de-trabalho).

Como nas outras abas, há opções de filtros para ajudar o usuário a encontrar malotes específicos. É possível filtrar por intervalo de datas, protocolo, documento, posto, layout e status. Para aplicar um filtro, selecione os filtros desejados e clique em Filtrar. Em seguida, apenas os malotes que atendem aos critérios selecionados serão exibidos.

Para remover um filtro, clique no botão X ao lado do filtro aplicado, ou clique no botão amarelo Limpar filtros para remover todos os filtros de uma vez.

![](/files/dosdkK21OncjrwbTXMnw)

#### Criando um Malote

Para criar um malote, clique no botão Criar malote, localizado no canto inferior direito da tela. Em seguida, na caixa de diálogo, abra o menu suspenso e selecione um posto da lista. Também é possível encontrar um posto digitando seu nome no campo de pesquisa, após abrir o menu suspenso.

![](/files/vUQVCLM28c2GNeTEaS0X)

Em seguida, usando as caixas de seleção no lado esquerdo das linhas dos lotes, selecione os lotes que farão parte do malote. Somente lotes com status [Check OK](#checagem-ok) podem ser adicionados a um malote. Por fim, clique no botão Criar malote.

![](/files/6fNhAWxnPslOcR7gB5IL)

O novo malote será adicionado à lista, com o status **Gerado**. Clicando na linha do malote, a tela de **Detalhes do malote** será aberta. Esta tela exibe os lotes que fazem parte do malote, incluindo o status de cada lote.

![](/files/dpYb7tQwpO6BuVNVun8l)

#### Removendo um Lote de um Malote

Na tela de **Detalhes do malote**, é possível remover um lote de um malote. Para fazer isso, selecione um lote usando a caixa de seleção no lado esquerdo da linha do lote. Em seguida, clique no botão Remover lotes.

![](/files/fxyVbggSeOfrqR2q6wiL)

Uma caixa de diálogo aparecerá pedindo confirmação. Clique em Remover para confirmar a ação.

![](/files/DEN0tNIwc2FqjDJFi8yu)

Se o lote for removido com sucesso, uma mensagem de sucesso será exibida no canto superior direito da tela.

![](/files/9595dqhwW41s1MrYJpF8)

#### Enviando um Malote

Para enviar um malote, na tela de **Detalhes do malote**, clique no botão Enviar malote. Uma caixa de diálogo aparecerá pedindo confirmação. Clique em Enviar malote para confirmar a ação.

![](/files/ZhLlfcLvGXmw4agdbt2p)

Se o malote for enviado com sucesso, uma mensagem de sucesso será exibida no canto superior direito da tela. Além disso, uma caixa de diálogo aparecerá perguntando se o usuário deseja exportar o relatório do malote. Clique em Exportar relatório para baixar o relatório do malote em PDF.

![](/files/668m6GDuCCjyoAqWBwnm)

### Impressoras

Na aba `Impressoras`, você pode configurar as impressoras que serão usadas para imprimir os documentos.

A lista mostra as impressoras instaladas e suas respectivas configurações, incluindo nome, IP, layout do documento, posto e status.

![](/files/jSl1sY0wq1yBWtI4Wh4X)

{% hint style="warning" %}
A impressora deve estar instalada no computador antes de configurá-la no GBS Print. Para mais informações, consulte a seção [Sistemas de Impressão](/componentes-web/printconfig#sistemas-de-impressao) no [Manual de Configuração do GBS Print](/componentes-web/printconfig).
{% endhint %}

Para adicionar uma nova impressora, clique no botão Configurar impressora, localizado no canto inferior direito da tela. Uma caixa de diálogo aparecerá com os campos a serem preenchidos com as informações da impressora. Selecione um posto e uma impressora no menu suspenso, insira o endereço IP da impressora e selecione o layout de documento que será impresso por esta impressora. Após preencher os campos, clique em Confirmar.

![](/files/SOPYAml0nX1fmPhwtTys)

Para remover uma impressora, clique no ícone de lixeira na coluna **Remover** da linha da impressora. Uma caixa de diálogo aparecerá pedindo confirmação. Clique em Remover impressora para confirmar a ação.

![](/files/8Z6VzPQZJlo7sMIBlBUn)

### Relatórios

A aba `Relatórios` exibe a quantidade de documentos que foram processados. Ela mostra o número de documentos recebidos para impressão, enviados para a impressora, impressos, checados, rejeitados e enviados em malote.

![](/files/KQcmq45swdwkOAKYuIjd)

Como nas outras abas, há opções de filtros para ajudar o usuário a encontrar malotes específicos. É possível filtrar por intervalo de datas, protocolo, documento, posto, layout e status. Para aplicar um filtro, selecione os filtros desejados e clique em Filtrar. Em seguida, apenas os malotes que atendem aos critérios selecionados serão exibidos.

Para remover um filtro, clique no botão X ao lado do filtro aplicado, ou clique no botão amarelo Limpar filtros para remover todos os filtros de uma vez.

![](/files/OQcLOmww0IK0Bbds3vU1)

### Menu

No canto superior direito, você pode passar o mouse sobre o nome de usuário para acessar o menu:

![](/files/6lcJ8byEf76XoLfytAqU)

As opções disponíveis são:

* Configurações;
* Manual;
* Mudar senha;
* Configurar impressora;
* Sair.

{% hint style="info" %}
Algumas opções podem não estar disponíveis dependendo da configuração do ambiente.
{% endhint %}

#### Configurações

Esta seção permite ao usuário alterar alguns aspectos da interface:

![](/files/rtbfombIz3sFdiZ4lpnK)

* Tema: **Claro** ou **Escuro**;
* Idioma: **Português**, **Inglês** ou **Espanhol**;
* Formato de data: **dd/mm/aaaa**, **mm/dd/aaaa** ou **aaaa/mm/dd**;
* Formato de hora: **12 horas (AM/PM)** ou **24 horas**.
* Pastas para checagem de impressão: caminhos das pastas para cada layout de documento.

![](/files/OUKt1u1gAGyKx33M1zwq) ![](/files/hwRNjHjCZSSp2IFnGJp2)

## Fluxos de Trabalho

Esta seção explica o fluxo de trabalho para imprimir um documento usando o GBS Print. Ela detalha como o status dos documentos, lotes e malotes mudam à medida que são processados.

### Conceitos Básicos

A unidade mais básica no GBS Print é o documento. Um **documento** é uma entidade que contém as informações a serem impressas no documento de identidade. Os documentos são agrupados em **lotes**, que são então impressos, digitalizados e verificados. Os lotes verificados são agrupados em **malotes** e enviados para os postos para distribuição. O diagrama a seguir mostra esses conceitos e suas relações no GBS Print.

![](/files/vuU2VriAQFKCrsmVvYBE)

### Visão Geral

O fluxo de trabalho é dividido em três etapas principais: [Lotes](#aba-lotes), [Check Print](#aba-check-print) e [Malotes](#aba-malotes), com várias sub-etapas que podem mudar o status de um documento. Cada etapa corresponde a uma aba na [interface do usuário](#interface-do-usuario), onde todas as ações relacionadas a essa etapa são realizadas.

Nos diagramas das seções a seguir, os status e transições entre eles são agrupados pelas abas onde ocorrem; cada aba será indicada por uma cor diferente: **violeta** para [Lotes](#aba-lotes), **azul** para [Check Print](#aba-check-print) e **verde** para [Malotes](#aba-malotes).

![](/files/bdkw4T2xP24jbC5LmISe)

Em cada diagrama, o **estado inicial** é representado por um círculo preto, e o **estado final** é representado por um círculo preto com uma borda dupla, como mostrado na imagem a seguir:

![](/files/a2f8x5TfjqdYLIjFSOJz)

Os retângulos arredondados representam os status das entidades; eles possuem a mesma cor do status na interface do usuário. As setas representam as transições entre os status, e as legendas nas setas indicam as ações que desencadeiam as transições.

![](/files/oXsWjzY2C5T8VBGimrz3)

Os diagramas nas seções a seguir mostram todos os status possíveis para cada entidade e as transições entre eles.

{% stepper %}
{% step %}

#### Aba Lotes

**Status de Lotes:**

Há oito possíveis status para um lote:

* [Gerado](#gerado) (verde)
* [Pronto para impressão](#pronto-para-impressao) (azul)
* [Imprimindo](#imprimindo) (amarelo)
* [Impresso](#impresso) (verde)
* [Checando](#checando) (cinza)
* [Checagem OK](#checagem-ok) (verde)
* [Em malote](#em-malote) (cinza)
* [Pronto](#pronto) (verde)

![](/files/KJBSPbRj2Q8F18IruQgB)

O status de um lote é afetado por ações do usuário nas abas `Lotes`, `Check Print` e `Malotes`. Ele também é afetado por ações automáticas.

#### Gerado

**Gerado** é sempre o status inicial de qualquer lote no GBS Print. O lote foi criado e os documentos estão aguardando para serem impressos. Um lote neste status pode receber novos documentos até que esteja cheio (o tamanho do lote é configurável). Se um novo documento é recebido e existe um lote disponível com o mesmo layout e posto, o documento será adicionado a esse lote. Caso contrário, um novo lote será criado.

O lote permanece neste status até que o usuário envie o comando de impressão clicando em Imprimir lote. Após isso, o status do lote mudará para **Ready to print** e os status dos documentos no lote mudarão para [Imprimindo](#imprimindo-1).

#### Pronto para impressão

Após clicar em Imprimir lote, o status do lote muda para **Pronto para impressão**. Isso significa que o comando de impressão foi registrado e os documentos estão prontos para serem impressos. O GBS Print enviará automaticamente os documentos para a impressora configurada para o posto ao qual o lote está atribuído e atualizará o status do lote para **Imprimindo**.

#### Imprimindo

Enquanto os documentos estão sendo impressos, o status do lote será **Imprimindo**. Após todos os documentos terem sido [impressos](#impresso-1), o status mudará automaticamente para **Impresso**.

#### Impresso

Esse status indica que todos os documentos no lote foram impressos. O usuário pode então verificar os documentos e, se necessário, rejeitá-los ou reimprimi-los.

O lote permanecerá neste status até que **algum** documento do lote seja rejeitado (clicando em Rejeitar documentos - o status do documento muda para [Rejeitado](#rejeitado)) ou verificado com sucesso (clicando em Vincular na aba `Check Print` - o status do documento muda para [Checagem OK](#checagem-ok-1)).

#### Checando

Esse status indica que os documentos no lote estão sendo verificados, ou seja, que pelo menos um dos documentos no lote tem status [Rejeitado](#rejeitado) ou [Checagem OK](#checagem-ok-1).

O lote permanecerá neste status até que **todos** os documentos no lote tenham status [Rejeitado](#rejeitado) (clicando em Rejeitar documentos) ou [Checagem OK](#checagem-ok-1) (clicando em Vincular na aba `Check Print`).

#### Checagem OK

Esse status indica que **todos** os documentos no lote foram verificados. O usuário pode então colocar o lote em um malote. Somente lotes com status **Checagem OK** podem ser adicionados a um malote.

O lote permanecerá neste status até que o usuário crie um malote e adicione o lote a ele (clicando em Criar malote na aba `Malotes`). Após o lote ser adicionado a um malote, seu status mudará para **Em malote**.

#### Em malote

Esse status indica que o lote foi adicionado a um malote e está aguardando para ser enviado para o posto designado.

O lote permanecerá neste status até que o usuário envie o malote que contém o lote (clicando em Enviar malote na aba `Malotes`). Após o malote ser enviado, o status do lote mudará para **Pronto**.

#### Pronto

Esse status indica que o lote foi enviado para o posto designado. Este é um status final.

**Status de Documentos:**

Há oito possíveis status para um documento em um lote:

* [Imprimir](#imprimir) (azul)
* [Imprimindo](#imprimindo-1) (amarelo)
* [Impresso](#impresso-1) (verde)
* [Falha](#falha) (vermelho)
* [Rejeitado](#rejeitado) (laranja)
* [Checagem OK](#checagem-ok-1) (verde)
* [Cancelado](#cancelado) (cinza)
* [Pronto](#pronto-1) (verde)

![](/files/8lh4fDpUdqEKD7Wr8Et9)

O status de um documento é afetado por ações do usuário nas abas `Lotes`, `Check Print` e `Malotes`. Ele também é afetado por ações automáticas.

#### Imprimir

**Imprimir** é sempre o status inicial de qualquer documento em um lote. O documento foi adicionado ao lote e está aguardando para ser impresso. Se um novo documento é recebido e existe um lote disponível com o mesmo layout e posto, o documento será adicionado a esse lote. Caso contrário, um novo lote será criado.

O documento permanecerá neste status até que o usuário envie para impressão o lote que contém o documento (clicando em Imprimir lote na aba `Lotes`). Após isso, o status do documento mudará para **Imprimindo**.

#### Imprimindo

Esse status indica que o documento está sendo impresso. Após o documento ser impresso, seu status mudará automaticamente para **Impresso**. Se a impressão falhar, seu status mudará para **Falha**.

#### Impresso

Se o documento for impresso com sucesso, seu status mudará automaticamente para **Impresso**. Neste ponto, o usuário deve verificar o documento impresso e avaliar sua qualidade.

O documento permanecerá neste status até que o usuário tome uma das seguintes ações:

1. **Marcar o documento para reimpressão** selecionando-o e clicando em Reimprimir documentos. O documento será removido do lote atual e reiniciará o fluxo de trabalho em outro lote (novo ou existente com o mesmo layout e posto). O status do documento será redefinido para **Imprimir**.
2. **Rejeitar documento** selecionando-o e clicando em Rejeitar documentos. O documento permanecerá no lote atual, mas seu status mudará para **Rejeitado**.
3. **Checar documento com OK**. Esse processo é feito digitalizando o documento e verificando seu status na aba `Check Print`. Ele pode mudar automaticamente para **Checagem OK** se o documento e o tipográfico forem lidos e vinculados com sucesso (terá status [OK](#ok) na aba `Check Print`). Se o documento não for vinculado automaticamente, o usuário deve vinculá-lo manualmente ao código tipográfico (preenchendo os campos necessários e clicando em Vincular na aba `Check Print`). O status do documento mudará para **Checagem OK**.

#### Falha

Se a impressão de um documento falhar, seu status mudará automaticamente para **Falha**. Este é um status final.

#### Rejeitado

Esse status indica que houve um problema com o documento após a impressão e ele foi rejeitado pelo usuário.

O documento permanecerá neste status até que o lote que o contém seja adicionado a um malote (clicando em Criar malote na aba `Malotes`) e o malote seja enviado (clicando em Enviar malote na aba `Malotes`). Após o malote ser enviado, o status do documento mudará para **Pronto**.

#### Checagem OK

Esse status indica que o documento foi verificado com sucesso na aba `Check Print`.

O documento permanecerá neste status até que o usuário tome uma das seguintes ações:

1. **Rejeitar documento** selecionando-o e clicando em Rejeitar documentos. O documento permanecerá no lote atual, mas seu status mudará para **Rejeitado**.
2. **Cancelar documento** (na aba `Check Print`, clicando na linha do documento para abrir os detalhes do documento e clicando em Cancelar documento). O documento permanecerá no lote atual, mas seu status mudará para **Cancelado**.
3. **Enviar o malote**. O lote que contém o documento é adicionado a um malote (clicando em Criar malote na aba `Malotes`) e o malote é enviado (clicando em Enviar malote na aba `Malotes`). Após o malote ser enviado, o status do documento mudará para **Pronto**.

#### Cancelado

Esse status indica que o documento foi cancelado pelo usuário. Um documento pode ser cancelado a qualquer momento após ser verificado (status **Checagem OK**). Em circunstâncias especiais (como detecção de fraude), um documento pode ser cancelado após ser enviado para um posto (status **Pronto**). Este é um status final.

#### Pronto

Esse status indica que o documento foi enviado para o posto designado.

Em um fluxo de trabalho normal, este é geralmente um status final, mas em circunstâncias especiais (como detecção de fraude), ele pode mudar para **Cancelado** (clicando em Cancelar documento na aba `Check Print`).
{% endstep %}

{% step %}

#### Aba Check Print

Há sete possíveis status para um documento na aba `Check Print`:

* [OK](#ok) (verde)
* [Cancelado](#cancelado-1) (cinza)
* [Documento não lido](#documento-nao-lido) (vermelho)
* [Documento não existe](#documento-nao-existe) (vermelho)
* [Tipográfico não lido](#tipografico-nao-lido) (vermelho)
* [Falha na atualização](#falha-na-atualizacao) (vermelho)
* [Falha](#falha-1) (vermelho)

![](/files/H0nh2wKB4oLtimfTvWYi)

O status de um documento na aba `Check Print` é afetado somente por ações do usuário na aba `Check Print`.

#### OK

Esse é um dos possíveis estados iniciais de um documento na aba `Check Print`.

**OK** é também um possível status final, e indica que o documento foi automaticamente verificado e vinculado ao tipográfico com sucesso. Nenhuma ação adicional é necessária, mas uma revisão manual é recomendada.

O único cenário em que o status de um documento na aba `Check Print` mudará de **OK** é em uma circunstância excepcional (como detecção de fraude). Neste caso, o usuário o cancela manualmente, clicando na linha do documento para abrir os detalhes do documento e clicando em Cancelar documento. Em seguida, o status mudará para **Cancelado**.

#### Cancelado

Esse status indica que o documento foi cancelado pelo usuário. Um documento pode ser cancelado a qualquer momento após ser verificado (status **OK**). Este é um status final.

#### Documento não lido

Esse é um dos possíveis estados iniciais de um documento na aba `Check Print`. Ele indica que o número do documento não pôde ser lido automaticamente a partir do código QR do documento digitalizado.

O usuário deve inserir manualmente o número do documento e o código tipográfico e vinculá-los clicando em Vincular. Após o vínculo bem-sucedido, o status mudará para **OK**.

#### Documento não existe

Esse é um dos possíveis estados iniciais de um documento na aba `Check Print`. Ele indica que o número do documento lido a partir do código QR do documento digitalizado não existe nos registros do GBS Print. Isso pode acontecer se a leitura automática do documento falhar em obter as informações corretas.

O usuário deve inserir manualmente o número do documento e o código tipográfico e vinculá-los clicando em Vincular. Após o vínculo bem-sucedido, o status mudará para **OK**.

#### Tipográfico não lido

Esse é um dos possíveis estados iniciais de um documento na aba `Check Print`. Ele indica que o documento foi lido com sucesso, mas o código tipográfico não pôde ser lido automaticamente a partir do código de barras do documento digitalizado.

O usuário deve inserir manualmente o código tipográfico e vinculá-lo ao documento clicando em Vincular. Após o vínculo bem-sucedido, o status mudará para **OK**.

#### Falha na atualização

Esse é um dos possíveis estados iniciais de um documento na aba `Check Print`. Esse status indica que houve um problema ao atualizar as informações do documento no GBDS. Isso pode acontecer se o servidor estiver inativo ou se houver um problema de rede.

O usuário deve inserir manualmente o número do documento e o código tipográfico e vinculá-los clicando em Vincular. Após o vínculo bem-sucedido, o status mudará para **OK**.

#### Falha

Esse é um dos possíveis estados iniciais de um documento na aba `Check Print`. Ele indica que houve um erro interno durante o processamento.

O usuário deve inserir manualmente o número do documento e o código tipográfico e vinculá-los clicando em Vincular. Após o vínculo bem-sucedido, o status mudará para **OK**.
{% endstep %}

{% step %}

#### Aba Malotes

Há somente dois possíveis status para um malote:

* [Gerado](#gerado-1) (verde)
* [Fechado](#fechado) (transparent)

![](/files/kgpYVFGGAvqOO1ZF3V9u)

O status de um malote é afetado somente por ações do usuário na aba `Malotes`.

#### Gerado

**Gerado** é o status inicial de um malote. Após selecionar os lotes a serem adicionados ao malote e clicar em Criar malote, o status do malote será **Gerado**. Somente lotes com status [Checagem OK](#checagem-ok) podem ser adicionados a um malote. Esta ação também mudará o status dos lotes selecionados para [Em malote](#em-malote).

O malote permanecerá neste status até que o usuário clique em Enviar malote. Após clicar em Enviar malote, o status do malote mudará para **Fechado**. Esta ação também mudará o status dos lotes para [Pronto](#pronto), e os documentos neles para [Pronto](#pronto-1).

#### Fechado

**Fechado** é o status final de um malote.
{% endstep %}
{% endstepper %}

## Apêndices

### Procedimento para escaneamento de documento e Check Print

1. Destacar documentos da folha.
2. Colocar os documentos (no máximo 50) no scanner para a digitalização. Os documentos devem ser colocados com o **anverso para frente** e **não** devem ser colocados de ponta cabeça.
3. Digitalizar com a configuração: `colorido`, `600 DPI`, extensão `PNG`, scan `frente e verso`.
4. A nomenclatura dos arquivos devem seguir o padrão: `00000001.png`, `00000002.png` e assim por diante (8 dígitos, numeração incremental).
5. Os arquivos devem ser adicionados na pasta que o Check Print irá fazer a leitura (configurada em [Configurações](#configuracoes)).
6. O número de arquivos **deve** ser par. Caso contrário, um erro será gerado.
7. Ao ser processado com **sucesso**, o arquivo é movido para a pasta `SUCCESS`, dentro da pasta raíz.
8. Ao ser processado com **erro**, o arquivo é movido para a pasta `ERROR`, dentro da pasta raíz.


# Home Screen

## Introdução

O **GBS Home Screen** é uma aplicação web que disponibiliza uma interface com atalhos para acessar todas a Griaule Biometric Suite (GBS) utilizando um login único. Ao se autenticar, o usuário tem acesso a todas as aplicações disponíveis para ele, sem a necessidade de fazer login individualmente em cada aplicação.

Este manual está atualizado para a versão 1.0.1 do Home Screen.

### Acesso e Autenticação

Você deve acessar a aplicação com um navegador web (Google Chrome é recomendado). A URL de acesso é específica para cada implantação. Se necessário, entre em contato com a equipe de suporte da Griaule para obter a URL correta.

É preciso se autenticar para acessar a aplicação. As credenciais necessárias são nome de usuário e senha.

![](/files/m1xrfyOD7hlbQzgquihr)

{% hint style="info" %}
Na parte inferior da tela há uma opção para alterar o idioma da interface do usuário. Esta opção também está disponível nas configurações após o login.
{% endhint %}

### Autenticação de dois fatores (2FA)

Quando a autenticação de dois fatores (2FA) estiver ligada, na primeira vez que você fizer login, após entrar seu username e senha, será mostrado um QR Code que deve ser registrado no Google Authenticator.

{% hint style="info" %}
Google Authenticator é um gerador de códigos de autenticação disponível como um aplicativo para smartphones [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\&hl=en\&gl=US) e [iOS](https://apps.apple.com/us/app/google-authenticator/id388497605).
{% endhint %}

![](/files/favaWZy7CT0K1haNCCmx)

Após registrar com sucesso o QR Code no Google Authenticator, insira o código de seis dígitos gerado e clique em Enviar.

Você só precisará registrar o QR Code uma vez. Mas, a cada login subsequente, você precisará inserir o código de seis dígitos gerado pelo Google Authenticator.

![](/files/AwxPI9Kfdpp1nSrJn2m1)

Existe um número limitado de tentativas de login sem sucesso que um usuário pode fazer. Sempre que um código incorreto é inserido, uma mensagem de erro será exibida:

![](/files/1rUo9zvCauHW2w4MlZoZ)

Se você atingir o número máximo de tentativas de login sem sucesso, sua conta será automaticamente bloqueada.

![](/files/ZuRktMJoVoURGCuOdGYN)

{% hint style="warning" %}
Se sua conta for bloqueada, entre em contato com o administrador do sistema.
{% endhint %}

### Logins Simultâneos e Cadastro de Navegador

Apenas uma sessão por usuário é permitida. Não é possível fazer login simultaneamente com um mesmo perfil mais de uma vez na aplicação. Se um usuário já estiver conectado e outro acesso acontecer usando o mesmo nome de usuário e senha, o usuário com a sessão mais antiga será notificado e desconectado na próxima ação.

![](/files/zBOqhG7vCKttWDcILpAd)

Além disso, apenas um navegador pode ser usado de cada vez. Ao tentar fazer login usando um navegador diferente, o usuário será informado que é necessário autenticar o novo navegador. A autenticação de um novo navegador revogará o acesso do navegador anterior.

![](/files/YkknTQQA3mPdNJY8Qls3)

Para autenticar um novo navegador, clique em Autenticar e, em seguida, insira o código de verificação que será enviado para o e-mail vinculado à conta do usuário.

![](/files/UWDSpFqPjYiOixQT65Hw)

Se a autenticação for bem-sucedida, uma notificação aparecerá no canto superior direito da tela após o login.

![](/files/BFTEJgGRrTWSicMM4dYi)

### Login único (SSO - Single Sign On)

O login único (*SSO - Single Sign On*) é uma funcionalidade que permite que um usuário faça login em várias aplicações com uma única credencial. Se o SSO estiver habilitado, ao fazer login em uma aplicação, todas as outras que ele tiver permissão para utilizar também serão automaticamente autenticadas. Dessa forma, se o usuário acessar o Home Screen e em seguida acessar outra aplicação, ele não precisará fazer login novamente.

Analogamente, ao fazer logout de uma aplicação, todas as outras aplicações também serão desconectadas.

### Redefinir Senha

Para redefinir sua senha, na tela de login, clique em Esqueceu sua senha?:

![](/files/Kv46HOouUA9JkjRWXqRZ)

Em seguida, insira o nome de usuário do perfil e clique em Enviar.

![](/files/J03ngnqphwEyDzBCDiUS)

Um e-mail contendo um código de verificação será enviado para o endereço de e-mail vinculado a esse perfil. Insira o código de verificação e clique em Enviar código.

![](/files/L6Jf4jVd1lXSPlFPQVkv)

Se o código estiver correto, você poderá criar uma nova senha. Insira a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a redefinição, clique em Redefinir senha.

![](/files/C5IBm7Iu2MmpfszAKMX0)

## Interface do Usuário

Após fazer o login, o usuário será direcionado para a tela principal do GBS Home Screen. A interface do usuário é dividida em duas seções principais: a barra superior e a área de conteúdo.

Na extremidade direita da barra superior há duas opções:

![](/files/z21wvVn5SXMeLuO2EbPB)

1. [Configurações](#configurações) (ícone de engrenagem).
2. [Menu da Conta do Usuário](#menu). Clicando sobre o logotipo da organização ou abreviação do nome do usuário, há um [menu suspenso](#menu) com opções adicionais.

Na área de conteúdo, o usuário encontrará botões para acessar as aplicações disponíveis. Cada botão representa uma aplicação e, ao clicar sobre ele, o usuário será redirecionado diretamente para a área logada da aplicação correspondente.

![](/files/WtBNtuhuVmBcVB6UTumF)

Os botões das aplicações são exibidos conforme as permissões de uso concedidas ao usuário. Assim, se um usuário não tiver permissão para acessar uma aplicação, o botão correspondente não será exibido.

Por exemplo, se o usuário acima não possuísse as permissões para as aplicações *GBS Control Panel* e *GBS Print*, sua página inicial seria exibida da seguinte forma:

![](/files/yEqIT19zjsbCcSjDr4iF)

### Configurações

No canto superior direito, clique no ícone de engrenagem para acessar as configurações:

![](/files/V8bW9Q3JtrpfNwVjpnrn)

* Tema: **Claro** ou **Escuro**;
* Idioma: **Português**, **Inglês** ou **Espanhol**;

![](/files/371nUR0Sp9vpMeoItlOz) ![](/files/rARYzF13vx4WZeRAX1rn)

### Menu

No canto superior direito, você pode clicar para acessar o menu da conta do usuário:

![](/files/q7Smx5InnsW0TwK6KDPB)

Clique em Sair de todas as aplicações para fazer logout do GBS Home Screen e de todas as outras aplicações GBS que estiverem logadas.

![](/files/Tr8XV1gfEPm0hRlDAWAS)


# Card Scan

## Introdução

O **GBS CardScan** é uma aplicação web para captura de fichas de identificação com dados biométricos tais como impressões digitais, impressões palmares, fotos faciais, assinaturas e dados biográficos textuais. A aplicação captura os dados das fichas e os cadastra na base de dados biométrica do GBS. Ela emprega extração de campos flexível e configurável, permitindo operar com múltiplos modelos de fichas.

Esse manual está atualizado para a versão 1.6.2 do CardScan.

### Acesso e Autenticação

Você deve acessar o CardScan com um navegador e recomendamos o Google Chrome. A URL para acesso é específica para cada ambiente.

{% hint style="info" %}
Se necessário, entre em contato com a equipe de suporte da Griaule para obter a URL correta.
{% endhint %}

A autenticação é necessária para acessar a aplicação. As credenciais necessárias ao CardScan são nome de usuário e senha.

![](/files/Bizk0FlfzB6mu2VI0Vmo)

{% hint style="info" %}
Na parte inferior da tela há uma opção para alterar o idioma para o desejado. Esta opção também está disponível nas configurações após o login.
{% endhint %}

### Autenticação de dois fatores (2FA)

Quando a autenticação de dois fatores (2FA) estiver ligada, na primeira vez que você fizer login, após entrar seu username e senha, será mostrado um QR Code que deve ser registrado no Google Authenticator.

{% hint style="info" %}
Google Authenticator é um gerador de códigos de autenticação disponível como um aplicativo para smartphones [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\&hl=en\&gl=US) e [iOS](https://apps.apple.com/us/app/google-authenticator/id388497605).
{% endhint %}

![QR Code do Google authenticator para autenticação de dois fatores](/files/kYnPtXHicZzOSSemE1EB)

Após registrar com sucesso o QR Code no Google Authenticator, insira o código de seis dígitos gerado e clique em Enviar.

Você só precisará registrar o QR Code uma vez. Mas, a cada login subsequente, você precisará inserir o código de seis dígitos gerado pelo Google Authenticator.

![Autenticação de dois fatores](/files/A4dYTC9R6SVOvzXEWePy)

Existe um número limitado de tentativas de login sem sucesso que um usuário pode fazer. Sempre que um código incorreto é inserido, uma mensagem de erro será exibida:

![Autenticação de dois fatores - código incorreto](/files/pAntbJseYcWppvzNbJYM)

Se você atingir o número máximo de tentativas de login sem sucesso, sua conta será automaticamente bloqueada.

![Autenticação de dois fatores - conta bloqueada](/files/4MTnPZ0gg0hLBkTcjWkV)

{% hint style="warning" %}
Se sua conta for bloqueada, entre em contato com o administrador do sistema.
{% endhint %}

### Logins Simultâneos e Cadastro de Navegador

Apenas uma sessão por usuário é permitida. Não é possível fazer login simultaneamente com um mesmo perfil mais de uma vez na aplicação. Se um usuário já estiver conectado e outro acesso acontecer usando o mesmo nome de usuário e senha, o usuário com a sessão mais antiga será notificado e desconectado na próxima ação.

![](/files/mD1pJWbNUuHuGV56sczF)

Além disso, apenas um navegador pode ser usado de cada vez. Ao tentar fazer login usando um navegador diferente, o usuário será informado que é necessário autenticar o novo navegador. A autenticação de um novo navegador revogará o acesso do navegador anterior.

![](/files/8BTjnomRleonS8Szaj9b)

Para autenticar um novo navegador, clique em Autenticar e, em seguida, insira o código de verificação que será enviado para o e-mail vinculado à conta do usuário.

![](/files/qsfCVfSJbNVe0KWNyB3R)

Se a autenticação for bem-sucedida, uma notificação aparecerá no canto superior direito da tela após o login.

![](/files/UQyJbOOLblruORlC8seg)

### Redefinir Senha

Você pode redefinir sua senha caso a esqueça.

Para redefinir sua senha, na tela de login, clique em Esqueceu sua senha?:

![](/files/UBsTybyrh2kmiFJ1KFDJ)

Em seguida, insira o nome de usuário do perfil e clique em Enviar.

![](/files/WyB5eINP2yUHAnkZKAWS)

Um e-mail contendo um código de verificação será enviado para o endereço de e-mail vinculado a esse perfil. Insira o código de verificação e clique em Enviar código.

![](/files/sZ3eg4zyX8PvRvsf9ma0)

Se o código estiver correto, você poderá criar uma nova senha. Insira a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a redefinição, clique em Redefinir senha.

![](/files/csSFNrdVZ1N8yzfbE1nJ)

## Interface do Usuário

### Tela Principal

A tela principal exibe os principais recursos da aplicação:

![Página principal](/files/Au478YmY9QDll9O0OS4j)

Os recursos estão distribuídos em 3 grupos: **Requerer**, **Listar** e **Editar**. Estes recursos também podem ser acessados pela barra de navegação no topo da página.

### Requerer

Este grupo de recursos é usado para capturar e cadastrar fichas com dados biográficos e biométricos. Esta operação pode ser realizada de 3 formas: **Ficha unitária**, **Múltiplas fichas em arquivo**, e **Múltiplas fichas em servidor**.

#### Ficha Unitária

Esta operação é usada para processar uma única.

![Ficha única](/files/wGVIAL4XS79fl289rnwO)

Uma requisição de ficha única exige 4 parâmetros:

**Nome do processo**

> Um identificador (forma livre) para a operação.

**Resolução**

> Resolução de digitalização da(s) imagem(ns). Para melhor resultado, a ficha deve ser digitalizada na mesma resolução do layout selecionado.

**Layout**

> O layout de ficha usado para interpretar a imagem. Uma miniatura do layout selecionada será exibida.

**Arquivos**

> Um ou mais arquivos de imagem contendo a digitalização da ficha. Se a ficha tiver múltiplas páginas, ou tiver conteúdo frente/verso, múltiplas imagens devem ser enviadas (uma por página).

Após preencher os parâmetros e enviar as imagens, o usuário pode reordenar as imagens enviadas para casar com a ordem do layout, arrastando os ícones no lado esquerdo da tela. Imagens podem ser removidas clicando no ícone `X`:

![Ficha única](/files/RvJp1qk9AnORBMqWXnAk)

Clique em **Enviar** para enviar a requisição para processamento no servidor.

Para verificar o progresso da operação, selecione **Listar > Processos** no barra de navegação no topo da tela.

#### Múltiplas fichas em arquivo

Este tipo de operação é usado para processar um pacote contendo múltiplas fichas digitalizadas. O pacote deve ser um único arquivo *Zip* contendo todas as imagens digitalizadas.

O *CardScan* processará os arquivos seguindo a ordem lexicográfica de seus nomes. **É recomendável iniciar os nomes de arquivos com números, para garantir uma ordem previsível de processamento.**

![Múltiplas fichas em arquivo](/files/S27T378y9qpMasunbszc)

#### Múltiplas fichas em servidor

Esta operação é usada para processar uma lista de arquivos localizados no servidor que executa o serviço do CardScan. Ela processará os arquivos seguindo a ordem lexicográfica de seus nomes. **É recomendável iniciar os nomes de arquivos com números, para garantir uma ordem previsível de processamento.** Esta operação é indicada para migração de dados em larga escala, e pode exigir credenciais administrativas no servidor.

### Listar

Este grupo de recursos permite ao usuário listar os **perfis** gerados para cadastramento ao processar requerimentos; Para listar requerimentos enviados and inspecionar sua situação; E para inspecionar **logs** de operação.

#### Perfis

Esta seção exibe uma lista dos perfis existentes criados pelo sistema. É possível filtrar a lista por ID de processo, ID do perfil, chave, dado biográfico e/ou status, permitindo a localização de perfis específicos.

![Listar perfis](/files/qODrJbVCfLwVM2XjrxxY)

Clicar em uma linha de da listagem de perfis exibe seus detalhes, tais como imagens originais da ficha e imagens biométricas extraídas da ficha (impressões digitais, impressões palmares, foto facial, assinatura, etc.).

![Detalhes do perfil](/files/8LHRFWkO341OOMjdkrpU)

Nesta página também é possível editar os campos textuais obtidos por OCR (sigla em inglês para Reconhecimento óptico de caracteres), remover o perfil, atualizar a listagem e reprocessar os dados do perfil.

**Editando campos OCR:**

Na página de detalhes do perfil o usuário pode editar campos textuais tais como dados biográficos, chaves e rótulos (*labels*). Para tal, deve-se clicar em **Editar**:

![Editar detalhes do perfil](/files/XEtTgNs054ZUitbTmmQA)

Após clicar em **Editar**, os campos do perfil podem ser editados manualmente pelo usuário. Os campos podem ser Chaves (Keys), Biográficos (Biographics) e Labels. Quando o OCR não consegue extrair as informações de Biográficos, Chaves ou Labels da imagem digitalizada, elas devem ser inseridas manualmente utilizando esta opção.

Os campos exibidos são os configurados pelo administrador do sistema. Se você tiver as permissões necessárias, poderá ver e modificar esses campos na aplicação GBS BCC. Para mais informações, consulte a seção [Campos](/aplicacoes/bccweb#campos) no [manual do GBS BCC](/aplicacoes/bccweb).

Após editar os campos, clique em **Salvar alterações** para confirmar as mudanças. Se o usuário quiser cancelar as mudanças, clique em **Cancelar**. Para limpar os campos, clique em **Limpar campos**.

{% hint style="info" %}
Alguns campos podem ser obrigatórios, indicados pela mensagem "Este campo é obrigatório". Se um campo obrigatório for deixado em branco, o usuário não poderá enviar o perfil para o GBDS.
{% endhint %}

![](/files/SBZh7fELC9QorpFvLR84)

**Revisão manual:**

Ao usar o tipo de solicitação **Múltiplas fichas em servidor**, dependendo da configuração do seu ambiente, os perfis podem exigir revisão manual se o número de ID lido por OCR não estiver incluído em um intervalo indicado no nome da pasta do servidor.

Por exemplo, se o nome da pasta for `cartoes_1000_2000` e esse recurso estiver ativado no seu ambiente, o sistema verificará se o número de ID lido por OCR está entre 1000 e 2000. Aqueles que não estiverem dentro desse intervalo receberão o status `Revisão manual pendente` e aguardarão revisão manual.

Ao abrir um perfil que requer revisão manual, o usuário verá a tela do perfil com os campos em um estado editável. O usuário deve então revisar o documento digitalizado, editar ou inserir as informações necessárias e clicar em **Salvar**.

{% hint style="warning" %}
Algumas informações, como chaves de identificação, podem ser verificadas no banco de dados ABIS para garantir que sejam únicas. Se a chave já estiver no banco de dados, ela será exibida como **inválida**.
{% endhint %}

![](/files/WDlcD8ArBKnt5jlCrRXE)

**Enviando o perfil para o GBDS:**

Se a ficha foi processada sem erros, o botão **Enviar para GBDS** estará habilitado, permitindo ao usuário que envie o perfil para cadastro no banco de dados biométrico GBS.

{% hint style="info" %}
Alguns campos biográficos podem ser obrigatórios. Se um campo obrigatório for deixado em branco, o usuário não poderá enviar o perfil para o GBDS. Para prosseguir, clique em **Editar** e preencha os campos obrigatórios.
{% endhint %}

![Enviar para GBDS](/files/JJ1nei2RaqRNaPUjcyDm)

{% hint style="warning" %}
Uma vez enviado para o GBDS, os campos OCR não podem mais ser alterados.
{% endhint %}

**Status do Perfil:**

Todos os perfis têm um status indicando sua situação atual. O status do perfil está normalmente associado ao status do processo.

Quando um processo tem o status **Processando**, os perfis a ele associados podem ter os seguintes status:

<table><thead><tr><th width="200">Status</th><th>Descrição</th></tr></thead><tbody><tr><td><strong>Gerado</strong></td><td>Perfil criado.</td></tr><tr><td><strong>Segmentando</strong></td><td>Segmentação em andamento.</td></tr><tr><td><strong>Validação</strong></td><td>Validação em andamento.</td></tr><tr><td><strong>Erro de Segmentação</strong></td><td>Erro no processo de segmentação.</td></tr><tr><td><strong>Segmentação OK</strong></td><td>A segmentação foi realizada com sucesso, esperando que o usuário envie o perfil ao GBDS.</td></tr></tbody></table>

Quando o processamento é concluído, o status do perfil pode assumir outros valores:

<table><thead><tr><th width="200">Status</th><th>Descrição</th></tr></thead><tbody><tr><td><strong>Revisão manual pendente</strong></td><td>O ID lido por OCR não está no intervalo esperado. É necessária uma revisão manual.</td></tr><tr><td><strong>Revisão manual feita</strong></td><td>Revisão manual concluída, esperando que o usuário envie o perfil para o GBDS.</td></tr><tr><td><strong>Deletado</strong></td><td>Perfil deletado antes de ser enviado ao GBDS.</td></tr><tr><td><strong>Reprocessado</strong></td><td>O layout do perfil foi editado e o perfil foi reprocessado com o novo layout.</td></tr><tr><td><strong>Validação</strong></td><td>Validação em andamento.</td></tr><tr><td><strong>Erro de Segmentação</strong></td><td>Erro no processo de segmentação.</td></tr><tr><td><strong>Pronto para o GBDS</strong></td><td>Pronto para ser enviado ao GBDS.</td></tr><tr><td><strong>Enviando para o GBDS</strong></td><td>Enviando para o GBDS.</td></tr><tr><td><strong>Enviado para o GBDS</strong></td><td>Envio para o GBDS concluído.</td></tr><tr><td><strong>OK no GBDS</strong></td><td>Cadastro concluído com sucesso no GBDS, pode realizar transição para <strong>OK</strong>.</td></tr><tr><td><strong>OK</strong></td><td>Cadastro completo no GBDS e fluxo do perfil concluído no CardScan - este é um estado final.</td></tr><tr><td><strong>Erro</strong></td><td>Erro ao processar o perfil.</td></tr><tr><td><strong>Falha no GBDS</strong></td><td>Falha no cadastro no GBDS.</td></tr><tr><td><strong>Recusado no GBDS</strong></td><td>Perfil foi recusado pelo GBDS.</td></tr><tr><td><strong>Em análise (MIR)</strong></td><td>Esperando revisão manual de qualidade no <em>GBS MIR</em>.</td></tr><tr><td><strong>Aprovado (MIR)</strong></td><td>Aprovado na revisão de qualidade no <em>GBS MIR</em>, pode realizar transição para <strong>OK</strong>.</td></tr><tr><td><strong>Rejeitado (MIR)</strong></td><td>Rejeitado na revisão de qualidade no <em>GBS MIR</em>.</td></tr><tr><td><strong>Em análise (ETR)</strong></td><td>Cadastro gerou uma exceção, aguardando resolução no <em>GBS ETR</em>.</td></tr><tr><td><strong>Mesmas biometrias (ETR)</strong></td><td>Resolução no GBS ETR: encontradas as mesmas biometrias (<em>fraude em operação de cadastro</em>).</td></tr><tr><td><strong>Biometrias diferentes (ETR)</strong></td><td>Resolução no GBS ETR: biometrias diferentes (<em>fraude em operação de atualização</em>).</td></tr><tr><td><strong>Recoletar (ETR)</strong></td><td>Resolução no GBS ETR: recoleta necessária.</td></tr><tr><td><strong>Aprovado (ETR)</strong></td><td>Resolução no GBS ETR: aprovado, pode realizar transição para <strong>OK</strong>.</td></tr></tbody></table>

#### Processos

A seção de processos exibe uma lista de processos existentes e seus detalhes. A lista pode ser filtrada por data, nome de usuário, ID do processo e/ou status.

![Listar processos](/files/GnUSka4GfmP6NPpkeEtU)

Clicar em uma linha da lista de processos abre uma página com detalhes do processo e opções para recarregar as informações, exibir perfis associados e logs do processo:

![Detalhe de processo](/files/bQ3dT7t0TeS5HzKWkcFS)

**Status do Processo:**

Todo processo tem um status indicando sua situação atual, que pode assumir os seguintes valores:

<table><thead><tr><th width="200">Status</th><th>Descrição</th></tr></thead><tbody><tr><td><strong>Recebido</strong></td><td>Processo recebido e criado.</td></tr><tr><td><strong>Validando</strong></td><td>O processo está sendo validado.</td></tr><tr><td><strong>Detectando layout</strong></td><td>Detectando o layout automaticamente.</td></tr><tr><td><strong>Layout não detectado</strong></td><td>Erro: sistema não conseguiu detectar o layout.</td></tr><tr><td><strong>Layout detectado</strong></td><td>Detecção de layout concluída com sucesso.</td></tr><tr><td><strong>Pronto para segmentação</strong></td><td>Pronto para ser segmentado. Aguardado validação do usuário.</td></tr><tr><td><strong>Processando</strong></td><td>Processando perfis.</td></tr><tr><td><strong>Perfis gerados</strong></td><td>Perfis gerados com sucesso, usuário pode enviá-los ao GBDS.</td></tr><tr><td><strong>Processado</strong></td><td>Processamento concluído.</td></tr><tr><td><strong>Erro</strong></td><td>Erro no processo.</td></tr></tbody></table>

#### Logs de Operação

A seção de logs de operação exibe uma lista dos logs existentes e seus detalhes.

![Lista de logs](/files/TL0JueBXuONWQMZ0uOwj)

Esta lista não oferece uma vista detalhada de cada entrada de log, diferentemente das outras listas.

### Editar

Este grupo de recursos permite ao usuário editar configurações da aplicação, bem como layouts.

#### Configurações

Esta seção permite ao usuário alterar configurações gerais da aplicação:

![Configurações](/files/nkRj0mcaCE0kn3IqR307)

É possível alterar o tema da aplicação de escuro para claro, o idioma, o formato de data/hora e o tipo de busca. Estas configurações afetam apenas a interface com o usuário, e não as operações de processamento de fichas.

#### Layouts

Esta seção exibe uma lista de layouts existentes e permite ao usuário editá-los, cloná-los e/ou removê-los. Note que um layout só pode ser editado ou removido se não houver processos associados a ele.

![Lista de layouts](/files/CkIJN1XogblU087gMPcs)

Clicar em um layout da lista abrirá uma página mostrando o layout com seus campos em destaque:

![Detalhe de layout](/files/EiE5GbADQ0HUy7WkUtrE)

## Layouts

Um layout é uma representação de um modelo específico de ficha biométrica. Cada modelo distinto de ficha deve ter um layout correspondente no sistema.

No exemplo a seguir podemos ver as digitais (borradas neste manual para anonimização) e dados biográficos de uma pessoa:

![Exemplo de layout](/files/QqkL5VLuNauYb7UYB56v)

Para criar um layout correspondente, o usuário precisa especificar as regiões da imagem onde há dados biométricos e biográficos.

### Criando um novo layout

Para criar um novo layout, clique em **Novo Layout**:

![Criar novo layout](/files/LBVQjPlFsb7OLiFijwyZ)

A tela de criação de layout será exibida:

![Criar novo layout (vazio)](/files/M1mXEYnfsfNP6GMt1MJp)

#### Importar arquivo ou Adquirir Imagem

O primeiro passo na criação do layout é importar um arquivo de imagem para servir de base:

![Imagem de ficha biométrica importada](/files/nU84YEflyM1WvmUPNkQw)

#### Resolução

Um passo importante é a especificação da resolução da imagem importada (dada em pontos por polegada, *dpi* na sigla em inglês). A resolução pode ser indicada manualmente na barra lateral à direita:

![Imagem de ficha biométrica importada: resolução](/files/fPaokpSa4QLLga0SLseY)

O usuário também pode clicar em **Ajustar resolução** na barra de ferramentas à esquerda:

![Ferramenta de ajuste de resolução](/files/kZEv4gUicibonPx3abiB)

Escolha a unidade de medida desejada e informe a distância que será marcada na imagem:

![Exemplo de uso da ferramenta de ajuste de resolução](/files/p8cqU0KpeZoRO3hFxNsg)

Neste exemplo, o primeiro passo (1) indica 5 cm como a distância que será marcada na imagem. O segundo passo (2) é a marcação da distância na imagem. Após os passos 1 e 2, a aplicação informará a resolução calculada (3). Neste exemplo, 354 dpi.

{% hint style="warning" %}
A resolução mínima permitida é 300 dpi.
{% endhint %}

As seguintes informações podem ser adicionados ao layout:

**Nome**

> Um identificador (forma livre) para o layout.

**Descrição**

> Descrição do layout (ex.: "fichas do estado de Roraima, 1985-1993")

**Idioma**

> O idioma em que os dados das fichas estão grafados.

![Propriedades do layout.](/files/EiF21oylv2sYgkU7YqoJ)

#### Criar região

Em seguida, o usuário deve especificar uma ou mais regiões da imagem que contenham dados biométricos ou biográficos.

Na barra de ferramentas, clique em **Extrair região**:

![Extrair região com ferramenta de retângulo](/files/KUtp58lagWRfATjQaJwv)

Clique e arraste o mouse sobre a imagem para definir um retângulo, e então use a barra lateral à direita para preencher seus detalhes:

![Detalhes da região](/files/5sfkVYWQ97SmWFRhNaMJ)

è possível ajustar a posição e tamanho da região. Nesta tela, o usuário também pode alterar os seguintes ajustes:

* **Ângulo:**
  * Sem rotação: sem alteração na região criada
  * Rotacionar 90° no sentido horário: rotaciona a região por este ângulo
  * Rotacionar 90° no sentido anti-horário: rotaciona a região por este ângulo
  * Inverter: rotação de 180°
* **Tipo:**
  * Digital: impressão digital
  * Palmar: impressão palmar
  * Assinatura: assinatura
  * Chave: para campos que serão chave (valores que não podem se repetir para pessoas distintas). Chaves serão armazenadas na base de dados do GBS.
  * Biográfico: para campos com dados biográficos da pessoa. Esta informação será armazenada na base de dados do GBS.
  * Label: para campos que serão tratados como rótulos (labels). Labels serão armazenados na base de dados do GBS.
* **Subtipo para Digitais:**
  * Digital Simples: para regiões com uma única digital.
  * Dois Polegares: para regiões com dois polegares.
  * Duas Digitais: para regiões com duas impressões digitais.
  * Quatro Digitais: para regiões com quatro impressões digitais.
* **Digitais:**

  > Esta opção depende do subtipo acima, e indica qual dedo ou dedos estão presentes na região.
* **Subtipo para Palmares:**
  * Interdigital esquerda
  * Tenar esquerda
  * Hipotenar esquerda
  * Interdigital direita
  * Tenar direita
  * Hipotenar direita
  * Completa esquerda
  * Escrita esquerda
  * Completa direita
  * Escrita direita
* **Subtipo para Face:**
  * Face frontal
  * Mugshot esquerdo
  * Mugshot direito
* **Subtipo para Chave:**
  * Chave OCR: O campo será interpretado por OCR (reconhecimento óptico de caracteres).
  * Chave Código de barras: O campo será interpretado como um código de barras.
* **Campos para Chaves:**
  * Lista os campos registrados no servidor GBS para o tipo `Chave`:

    ![Campos chave](/files/qsUXYtuDijpDmRXj3z07)
  * Exemplos de campos chave: número de passaporte, número da CNH, número do título de eleitor.
* **Subtipo para Biográfico:**
  * Biográfico OCR: O campo será interpretado por OCR (reconhecimento óptico de caracteres).
  * Biográfico Código de barras: O campo será interpretado como um código de barras.
* **Campos biográficos:**
  * Lista os campos registrados no servidor GBS para o tipo `Biográfico`:

    ![Campos biográficos](/files/lirfzYjlregPVlJI75W8)
  * Exemplos de campos biográficos: nome, data de nascimento, nome da mãe, nome do pai.
* **Subtipo para Label:**
  * Label OCR: O campo será interpretado por OCR (reconhecimento óptico de caracteres).
  * Label Código de barras: O campo será interpretado como um código de barras.
* **Campos de Label:**
  * Lista os campos registrados no servidor GBS para o tipo `Label`:

    ![Campos de Label](/files/SgDlLhRGsn1pATjmbmzB)
  * Labels podem ser usadas para agrupar e filtrar pessoas nas operações de busca do GBS.

Quando a criação da região é concluída, a imagem terá as regiões associadas como na imagem abaixo:

![Ficha biométrica demarcada](/files/P7QxoD5nXsEap4udUUYL)

Para ajustar qualquer região criada, clique nela. Seus detalhes serão destacados na barra lateral e a lista de opções será exibida:

![Janela de edição de região](/files/CpIJBHsskJyWcw7YFNdP)


# MIR

## Introdução

O **GBS MIR (Manual Image Review)** é uma aplicação web desenvolvida para ajudar os examinadores a tratar transações de registro biométrico que exigem revisão manual. Essa etapa é necessária quando a qualidade da biometria capturada não atende aos requisitos mínimos, há dedos duplicados ou qualquer captura de impressão digital não corresponde à captura do controle de sequência. Você pode optar por corrigir e aprovar ou rejeitar perfis de transações de registro biométrico usando esta aplicação.

Este manual está atualizado para a versão 1.5.1 do GBS MIR.

### Acesso e Autenticação

Você deve acessar o MIR com um navegador web, e o Google Chrome é recomendado. A URL para acesso é específica para cada implantação.

{% hint style="info" %}
Se necessário, entre em contato com o suporte da Griaule para obter a URL correta para seu ambiente.
{% endhint %}

A autenticação é necessária para acessar o aplicativo. As credenciais necessárias para o MIR são nome de usuário e senha.

![login screen](/files/DeiNCGb5YtILD8Lo0cc2)

{% hint style="info" %}
Na parte inferior da tela, é apresentada uma opção para alterar o idioma. Esta opção também está disponível nas configurações após o login.
{% endhint %}

### Autenticação de dois fatores (2FA)

Quando a autenticação de dois fatores (2FA) estiver ligada, na primeira vez que você fizer login, após entrar seu username e senha, será mostrado um QR Code que deve ser registrado no Google Authenticator.

{% hint style="info" %}
Google Authenticator é um gerador de códigos de autenticação disponível como um aplicativo para smartphones [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\&hl=en\&gl=US) e [iOS](https://apps.apple.com/us/app/google-authenticator/id388497605).
{% endhint %}

![QR Code do Google authenticator para autenticação de dois fatores](/files/C1N1m8953DZoIeBEMVhu)

Após registrar com sucesso o QR Code no Google Authenticator, insira o código de seis dígitos gerado e clique em Enviar.

Você só precisará registrar o QR Code uma vez. Mas, a cada login subsequente, você precisará inserir o código de seis dígitos gerado pelo Google Authenticator.

![Autenticação de dois fatores](/files/UKrNAwjMpjoWMZEt0zzs)

Existe um número limitado de tentativas de login sem sucesso que um usuário pode fazer. Sempre que um código incorreto é inserido, uma mensagem de erro será exibida:

![Autenticação de dois fatores - código incorreto](/files/fY7l22vWnP6QtO2ALQwQ)

Se você atingir o número máximo de tentativas de login sem sucesso, sua conta será automaticamente bloqueada.

![Autenticação de dois fatores - conta bloqueada](/files/741AaHgIFitffQDp8F57)

{% hint style="warning" %}
Se sua conta for bloqueada, entre em contato com o administrador do sistema.
{% endhint %}

### Logins Simultâneos e Cadastro de Navegador

Apenas uma sessão por usuário é permitida. Não é possível fazer login simultaneamente com um mesmo perfil mais de uma vez na aplicação. Se um usuário já estiver conectado e outro acesso acontecer usando o mesmo nome de usuário e senha, o usuário com a sessão mais antiga será notificado e desconectado na próxima ação.

![](/files/PxJIx7aA98Oly09xEY0f)

Além disso, apenas um navegador pode ser usado de cada vez. Ao tentar fazer login usando um navegador diferente, o usuário será informado que é necessário autenticar o novo navegador. A autenticação de um novo navegador revogará o acesso do navegador anterior.

![](/files/JDEXEw85l5Rw1qIIsGPh)

Para autenticar um novo navegador, clique em Autenticar e, em seguida, insira o código de verificação que será enviado para o e-mail vinculado à conta do usuário.

![](/files/bn3sNvqg2W6RoXaC4HEe)

Se a autenticação for bem-sucedida, uma notificação aparecerá no canto superior direito da tela após o login.

![](/files/crgwdvHhkrR4ff91fx1l)

### Alterar ou Redefinir Senha

Por motivos de segurança, você pode alterar sua senha ou redefini-la caso a esqueça.

#### Alterar Senha

Para alterar sua senha, após fazer login, passe o mouse sobre seu nome de usuário no canto superior direito da tela e clique em Alterar senha.

![](/files/a6HXrvNGVEellGlv8q8f)

Em seguida, insira a senha atual e a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a alteração, clique em Alterar senha.

![](/files/RtLwwA4IYJClhGXwiF62)

#### Redefinir Senha

Para redefinir sua senha, na tela de login, clique em Esqueceu sua senha?:

![](/files/5z8PBIWLDGwspMghucIV)

Em seguida, insira o nome de usuário do perfil e clique em Enviar.

![](/files/CJy8iweAK2DUy4Mur8u5)

Um e-mail contendo um código de verificação será enviado para o endereço de e-mail vinculado a esse perfil. Insira o código de verificação e clique em Enviar código.

![](/files/htjtfatHCCgulL73TDJH)

Se o código estiver correto, você poderá criar uma nova senha. Insira a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a redefinição, clique em Redefinir senha.

![](/files/aj3BiLjnFxZEKXez9f0L)

## Interface do Usuário

Ao fazer login, a lista de perfis pendentes é exibida.

![main interface](/files/XK8ZUqnUm1EvJuCA1gKn)

O MIR mostra primeiro os perfis mais antigos. Você pode rolar para baixo para acessar perfis mais recentes ou usar os filtros no menu superior para recuperar perfis específicos. Ao rolar para baixo, uma pequena seta azul apontando para cima aparecerá no canto inferior direito da página. Clicar nele trará o usuário de volta ao topo da lista.

Para acessar um perfil, clique nele.

### Filtrando Perfis

Ao pesquisar perfis específicos, o usuário pode adicionar filtros às transações.

A área do filtro é colocada no menu superior, como pode ser visto na imagem. As opções de filtragem são:

* Data - Restringe a lista para um intervalo de tempo. Há atalhos para um dia (hoje), última semana e último mês.
* Status da transação - Restringe a lista para perfis aprovados, pendentes ou rejeitados.
  * Perfis `Aprovados` são identificados por um ponto verde.
  * Perfis `Rejeitados` são identificados por um ponto vermelho.
  * Perfis `Pendentes` são identificados por um ponto laranja.
* Por chave - Restringe a lista pela string fornecida.
* Por biográfico - Restringe a lista pela string fornecida.

{% hint style="warning" %}
A filtragem de chave e biografia ignora o filtro `Data`.
{% endhint %}

Após confirmar as condições do filtro, eles serão exibidos no lado direito. Para limpar as opções de filtragem, clique em Limpar filtros.

## Resolvendo Perfis Pendentes

Um perfil pendente é um perfil cujo GBDS detectou problemas com seu cadastro, sendo necessária uma revisão manual para ser validado. Para acessar um perfil, clique nele na tela principal do MIR.

Ao acessar um perfil, uma página com as informações da pessoa será exibida.

![main interface](/files/S9dhEjkMDVxZiGPsIRlK)

Na parte superior desta tela, você pode ver a biometria do rosto, os valores biográficos, as chaves, os rótulos, os problemas encontrados e as ações realizadas.

Abaixo, você encontra a seleção da aba biométrica para impressão digital, palmar e íris. A biometria problemática será destacada em vermelho por padrão.

{% hint style="warning" %}
O MIR informa apenas problemas nas impressões digitais. Também mostra a qualidade das impressões palmares, mas não aponta problemas com elas.
{% endhint %}

### Problemas

Se um cadastro estiver na Análise de Qualidade, significa que há alguns problemas. Conhecer esses problemas pode ajudá-lo a corrigir o cadastro.

Todos os problemas detectados podem ser vistos no painel `Problemas encontrados`, onde você pode marcá-los como resolvidos ou não. É possível marcar/desmarcar tudo de uma vez com o botão `Marcar todos os problemas como resolvidos`, mostrado no lado direito do painel Problema encontrado.

![](/files/AUlkccBqqwUGB6ZiV7rr)

{% hint style="warning" %}
O botão aprovar só estará disponível se todos os problemas forem resolvidos.
{% endhint %}

Para ajudar a identificar a origem de um problema, o MIR exibe bordas coloridas ao redor das impressões digitais e da face, indicando a presença de problemas relacionados a essa imagem. Os possíveis problemas que o MIR pode relatar são:

* Templates de baixa qualidade (de face e de impressão digital)
* Digitais duplicadas
* Problemas no controle de sequência:
  * Dedo não corresponde à impressão digital do controle de sequência
  * Dedo casou com outra digital do controle de sequência.

A seção a seguir descreverá as ferramentas do MIR para resolver esses problemas.

### Resolvendo Problemas

O MIR oferece algumas ferramentas para ajudá-lo a resolver os problemas. Elas são:

* [Comparar e Trocar Biometrias](#comparar-e-trocar-biometrias)
* [Editar Biometrias](#editar-biometrias)
* [Cortar do Controle de Sequência](#cortar-do-controle-de-sequencia)
* [Importar do Controle de Sequência](#importar-do-controle-de-sequencia)
* [Remover Biometria](#remover-biometria)
* [Restaurar para o Original](#restaurar-para-o-original)

Com exceção de Trocar Biometrias, você pode acessar todas as ferramentas passando o mouse em uma determinada biometria. Além disso, é fornecida uma ferramenta para [Trocar os Lados das Biometrias](#trocar-os-lados-das-biometrias).

![](/files/APrk1AztAJ8G4DkQbirw)

{% hint style="info" %}
Templates de face com baixa qualidade não podem ser tratados e são apenas indicações para ajudar o usuário na decisão de aprovar ou rejeitar o perfil.
{% endhint %}

#### Comparar e Trocar Biometrias

Você pode comparar e trocar a biometria arrastando uma biometria sobre a outra. Fazê-lo vai abrir a página `Comparação biométrica`. O botão Trocar biometrias será exibido no menu inferior se você estiver comparando uma biometria principal com outra biométrica principal.

![](/files/ugth2SUHcrGdLrSN1QBh)

{% hint style="success" %}
Acima de cada imagem, você pode usar um menu suspenso para navegar por outras biometrias.
{% endhint %}

#### Trocar os Lados das Biometrias

O MIR fornece uma ferramenta para inverter os lados de todas as biometrias. Para acessar esta ferramenta, passe o mouse sobre o indicador de seta próximo ao texto "Principal" ou "Controle de sequência" na página do perfil e clique no botão que aparece, conforme indicado na imagem.

![](/files/LKqCKsuC82Tx0d4rx4TB)

Ele irá inverter os lados das biometrias. Isso significa que a biometria de uma mão se tornará a biometria da outra e vice-versa.

#### Editar Biometrias

Você pode editar uma impressão digital para tentar melhorar sua qualidade. Para fazer isso, passe o mouse sobre a imagem da impressão digital e clique no ícone de lápis. Ele abrirá a página `Edição de biometria`. Esta página contém as ferramentas de edição de fragmentos biométricos explicadas na seção [Editando Fragmentos, do BEST](/aplicacoes/bestweb#editando-fragmentos).

![](/files/Efnjjfji8p2DpiMn3Lxb)

Ao exibir as minúcias, as cores indicam:

* `1` **Azul Escuro**: Minúcias criadas manualmente
* `2` **Azul Claro**: Minúcias de alta qualidade (extraídas automaticamente)
* `3` **Amarelo**: Minúcias de qualidade média (extraídas automaticamente)
* `4` **Vermelho**: Minúcias de baixa qualidade (extraídas automaticamente)

![](/files/XhWWjVt8q9jqfYPRZvur)

Após a edição, clique no botão Salvar para salvar as modificações. Clique no botão X ou pressione `ESC` para cancelar as edições. Tentar cancelar as edições exibirá uma caixa de confirmação.

![](/files/uxXYg3tRDv0mHJCoxulK)

#### Cortar do Controle de Sequência

A ferramenta de controle de corte de sequência permite selecionar uma área do controle de sequência para substituir pelo dedo com problema. Ao clicar para abrir esta ferramenta, a tela de corte aparecerá. Selecione uma das ferramentas de recorte (retangular ou poligonal) e extraia a imagem clicando em Recortar região.

![](/files/5oI7ulDcSPqNUyKnMpxa)

#### Importar do Controle de Sequência

Importar uma impressão digital do controle de sequência irá extraí-la automaticamente e colá-la no dedo principal. Para isso, clique no ícone e confirme a operação na caixa de diálogo que se abrirá.

![](/files/ktPe4NFmhey2s6Xg2agL)

{% hint style="warning" %}
Algumas impressões digitais podem apresentar problemas com o recurso de extração e apresentar biometria incompleta. Se isso acontecer, use a ferramenta Cortar do Controle de Sequência.
{% endhint %}

#### Remover Biometria

Para remover uma biometria, clique no ícone de Lixeira. Ele limpará a área da caixa biométrica e uma mensagem aparecerá indicando que a caixa não possui biometria.

![](/files/Ur0eLFZj4zPJac2d0SbP)

#### Restaurar para o Original

A opção de restauração reverte a modificação em uma biometria para a biometria original do perfil. Esta opção aparece no lado oposto das outras ferramentas de edição após qualquer alteração nessa biometria. Ao clicar, aparecerá uma caixa de confirmação para reverter a biometria ao seu estado original.

![](/files/6ldlvSrXPytpSKZnHtex)

### Aproveitar ou Rejeitar um Perfil

Para aprovar um perfil, todos os problemas **DEVEM** ser marcados como resolvidos. No entanto, não há restrições para rejeitar um perfil. Para realizar uma das ações, clique no botão correspondente na parte inferior central da tela.

Qualquer um dos botões acionará uma caixa de confirmação onde o usuário pode comentar sobre a operação selecionada.

![](/files/gy8cg72DjaAkvfBQ57LW) ![](/files/IgIvwuXfvDFbNcpiLemc)

### Ações Tomadas

A área de ações tomadas mostra as ações que você (ou outros examinadores) realizou em um perfil. Ele mostra a última ação realizada e enumera todas as ações confirmadas que causaram alguma alteração no perfil.

![](/files/kbg6sGqZNviSxSGDxSGJ)

## Configurações

Nesta tela, há cinco opções para que os usuários possam escolher suas preferências:

* Tema: **escuro** ou **claro**;
* Linguagem
* Formato de Data: **dd/mm/yyyy**, **mm/dd/yyyy** ou **yyyy/mm/dd**;
* Formato de tempo: **12 horas (AM/PM)** ou **24 horas**;
* Cor de destaque dos problemas.

A versão do aplicativo também é mostrada abaixo.

![](/files/YgKMVZU7TwttWElwqmMk)


# Intelligence

## Introdução

O **GBS Intelligence** é uma aplicação web que realiza buscas textuais na base de dados do GBDS, valores em identificadores (PGUID, TGUID), chaves, campos biográficos e campos de label.

Este manual está atualizado para a versão 1.6.1 do GBS Intelligence.

### Acesso e Autenticação

Você deve acessar o Intelligence com um navegador e recomendamos o Google Chrome. A URL para acesso é específica para cada ambiente.

{% hint style="info" %}
Se necessário, entre em contato com a equipe de suporte da Griaule para obter a URL correta.
{% endhint %}

A autenticação é necessária para acessar a aplicação. As credenciais necessárias ao Intelligence são nome de usuário e senha.

![](/files/uEt2n0fmsBIdDXHGeIzj)

{% hint style="info" %}
Na parte inferior da tela há uma opção para alterar o idioma para o desejado. Esta opção também está disponível nas configurações após o login.
{% endhint %}

### Autenticação de dois fatores (2FA)

Quando a autenticação de dois fatores (2FA) estiver ligada, na primeira vez que você fizer login, após entrar seu username e senha, será mostrado um QR Code que deve ser registrado no Google Authenticator.

{% hint style="info" %}
Google Authenticator é um gerador de códigos de autenticação disponível como um aplicativo para smartphones [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\&hl=en\&gl=US) e [iOS](https://apps.apple.com/us/app/google-authenticator/id388497605).
{% endhint %}

![QR Code do Google authenticator para autenticação de dois fatores](/files/8h5VuP3QNVZwqBhhzR8n)

Após registrar com sucesso o QR Code no Google Authenticator, insira o código de seis dígitos gerado e clique em Enviar.

Você só precisará registrar o QR Code uma vez. Mas, a cada login subsequente, você precisará inserir o código de seis dígitos gerado pelo Google Authenticator.

![Autenticação de dois fatores](/files/PvBfpT7lKoiYi8r5E0Az)

Existe um número limitado de tentativas de login sem sucesso que um usuário pode fazer. Sempre que um código incorreto é inserido, uma mensagem de erro será exibida:

![Autenticação de dois fatores - código incorreto](/files/EDs026dlRL1Ao0hN6dOI)

Se você atingir o número máximo de tentativas de login sem sucesso, sua conta será automaticamente bloqueada.

![Autenticação de dois fatores - conta bloqueada](/files/7GIz8VjjOxlI9OuZLzlb)

{% hint style="warning" %}
Se sua conta for bloqueada, entre em contato com o administrador do sistema.
{% endhint %}

### Logins Simultâneos e Cadastro de Navegador

Apenas uma sessão por usuário é permitida. Não é possível fazer login simultaneamente com um mesmo perfil mais de uma vez na aplicação. Se um usuário já estiver conectado e outro acesso acontecer usando o mesmo nome de usuário e senha, o usuário com a sessão mais antiga será notificado e desconectado na próxima ação.

![](/files/LnrVfjXUXN2bt6KI6Rqr)

Além disso, apenas um navegador pode ser usado de cada vez. Ao tentar fazer login usando um navegador diferente, o usuário será informado que é necessário autenticar o novo navegador. A autenticação de um novo navegador revogará o acesso do navegador anterior.

![](/files/4Rtr4xeqAF3uiaD47atd)

Para autenticar um novo navegador, clique em Autenticar e, em seguida, insira o código de verificação que será enviado para o e-mail vinculado à conta do usuário.

![](/files/ePJU4fqbSMxsWexyDC5O)

Se a autenticação for bem-sucedida, uma notificação aparecerá no canto superior direito da tela após o login.

![](/files/lIqsSZQQP6rI3teu6Jdl)

### Redefinir Senha

Você pode redefinir sua senha caso a esqueça.

Para redefinir sua senha, na tela de login, clique em Esqueceu sua senha?:

![](/files/hfzdnoh3rlm7PfpfpdiU)

Em seguida, insira o nome de usuário do perfil e clique em Enviar.

![](/files/XgwHMbaVfURWvOXyXiq7)

Um e-mail contendo um código de verificação será enviado para o endereço de e-mail vinculado a esse perfil. Insira o código de verificação e clique em Enviar código.

![](/files/ufYwM5mOQdlfJCnIsbsC)

Se o código estiver correto, você poderá criar uma nova senha. Insira a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a redefinição, clique em Redefinir senha.

![](/files/J0KfD6d8K0GqUdmlp1Aq)

## Interface do Usuário

### Tela Principal

A tela principal exibe uma página de busca simples:

![tela principal](/files/W8ZObNXAjoocibmqisOW)

TGUID, PGUID e as chaves e biográficos existentes configurados na base de dados de configurações são mostrados no menu suspenso à esquerda:

![Detalhe da busca](/files/4GUOE3kZCVgGOdjVrwMf)

O texto digitado na barra de busca se refere à opção selecionada. Por exemplo: digitar "João" com a chave "Nome" selecionada realizará uma busca pela palavra "João" no campo nome. Preencha os campos da busca e clique em `Buscar` para redirecionar a aplicação para a página de resultados.

### Tela de Resultados de Busca

Se não houver resultados, a página de resultados exibirá a mensagem "Nenhum resultado encontrado".

![Tela de resultados de busca](/files/MoMQXfNX82zN1dAwUIPF)

O parâmetros da busca atual são exibidos no topo à direita. Usando a barra no topo é possível editá-los e submeter uma nova busca.

Quando a buscar retornar resultados, eles serão exibidos em uma lista. Os resultados de buscas por TGUID são transações:

![detalhe de busca por transação](/files/t2vf4pyHIM8i02nZedD5)

É importante notar que, dependendo do status da transação, o perfil associado à transação pode ainda não estar disponível para buscas no *Intelligence*. Isto gera um cenário onde uma busca por transação pode retornar uma transação associada a um PGUID válido nos resultados, mas buscas por este PGUID não retornarão resultados até que o fluxo da transação no GBDS seja concluído. O status das transações é exibido na lista de resultados, bem como no campo `Dados da transação` na página de detalhes da transação.

Os painéis de resultados podem ser clicados para abrir uma página de detalhes.

### Tela de Transação

Clicar em um resultado de busca por TGUID redirecionará para uma nova tela que exibe os detalhes da transação:

![detalhes de transação](/files/i5gMYPmOxim9uDJetrzQ)

Existem **seis** possíveis status para uma transação:

| Status            | Descrição                                                                |
| ----------------- | ------------------------------------------------------------------------ |
| Enviado para GBDS | A transação foi enviada para o ABIS.                                     |
| Processando       | A transação está sendo processada no ABIS.                               |
| OK                | A transação foi processada com sucesso pelo ABIS.                        |
| Em exceção        | A transação está em estado de exceção, aguardando tratamento no GBS ETR. |
| Falha             | O processamento da transação falhou no ABIS.                             |
| Pendente          | A transação está pendente de tratamento no GBS MIR.                      |

Os dados biométricos são exibidos na metade inferior, e é possível navegar através das modalidades biométricas presentes usando as abas.

### Tela de Perfil

Clicar em um resultado de busca por PGUID ou campo textual redirecionará para uma nova tela exibindo os detalhes do perfil:

![detalhes de perfil](/files/DKRiNqTh96dK9rcwZbpY)

Assim como na tela de transação, os dados biométricos do perfil são separados em abas, por modalidade. No canto superior direito do painel é mostrado o histórico de transações envolvendo este perfil. Clicar em uma das linhas deste histórico realizará uma busca pelo TGUID da transação.

### Configurações e Atalhos

No canto superior direito da tela, há três ícones que dão acesso a:

* [Configurações](#configuracoes)
* [Aplicações](#aplicacoes)
* [Menu do usuário](#menu-do-usuario)

#### Configurações

Para acessar as configurações, clique no ícone de engrenagem:

![](/files/1XbJufMrdCepE4FhDKEJ)

Esta seção permite ao usuário alterar alguns aspectos da interface:

![](/files/kAXmSvIPd51TCG9oSjN2)

* Tema: **Claro** ou **Escuro**;
* Idioma: **Português**, **Inglês** ou **Espanhol**;
* Formato de Data: **dd/mm/yyyy**, **mm/dd/yyyy**, ou **yyyy/mm/dd**;
* Formato de Hora: relógio de **12 horas (AM/PM)** ou de **24 horas**.

![](/files/QfDhK3sSZyvELrkWKW1d)

#### Aplicações

Para acessar os atalhos para as outras aplicações GBS, clique em:

![](/files/tUq16Xck9Qql9bwb23qV)

Em seguida, clique no ícone da aplicação que deseja acessar:

![](/files/ivEelKw9i0CmmhbaIguG)

{% hint style="info" %}
Somente serão exibidos os ícones das aplicações para as quais o usuário tem permissão de acesso.
{% endhint %}

#### Menu do usuário

Para acessar o menu do usuário, clique no ícone do usuário:

![](/files/iQJW0u0yPMJedLKchn0x)

Um menu será exibido com o nome de usuário, email e opções adicionais:

![](/files/4aaJwEjSmHoh8B7FaoT1)


# Control Panel

## Introdução

O **GBS Control Panel** é uma aplicação desenvolvida para alterar facilmente os parâmetros de configuração do GBDS. O Control Panel fornece uma interface visual onde o usuário controla os valores dos parâmetros e compara os valores atuais com valores históricos das configurações.

Este manual está atualizado para a versão 1.3.1 do GBS Control Panel.

### Acesso e Autenticação

Você deve acessar o Control Panel com um navegador, e o Google Chrome é recomendado. A URL para acesso é específica para cada implantação. Se necessário, entre em contato com o suporte da Griaule para obter a URL correta para seu ambiente.

A autenticação é necessária para acessar o aplicativo. As credenciais necessárias para o Control Panel são nome de usuário e senha.

![login screen](/files/fU2qxjePRalhyy944Zpr)

Na parte inferior da tela, é apresentada uma opção para alterar o idioma. Esta opção também está disponível nas configurações após o login.

### Logins Simultâneos e Cadastro de Navegador

Apenas uma sessão por usuário é permitida. Não é possível fazer login simultaneamente com um mesmo perfil mais de uma vez na aplicação. Se um usuário já estiver conectado e outro acesso acontecer usando o mesmo nome de usuário e senha, o usuário com a sessão mais antiga será notificado e desconectado na próxima ação.

![](/files/zSUH4IwgAV0UUGOqBtV4)

Além disso, apenas um navegador pode ser usado de cada vez. Ao tentar fazer login usando um navegador diferente, o usuário será informado que é necessário autenticar o novo navegador. A autenticação de um novo navegador revogará o acesso do navegador anterior.

![](/files/YhVO7LJP8LwA7M8L0mZr)

Para autenticar um novo navegador, clique em Autenticar e, em seguida, insira o código de verificação que será enviado para o e-mail vinculado à conta do usuário.

![](/files/J7G5WKSNlfWrfnCuYWsq)

Se a autenticação for bem-sucedida, uma notificação aparecerá no canto superior direito da tela após o login.

![](/files/a3Ki4cWvJVJR5ltX0JPe)

### Redefinir Senha

Você pode redefinir sua senha caso a esqueça.

Para redefinir sua senha, na tela de login, clique em Esqueceu sua senha?:

![](/files/4qeTSr6Es2WXFohafmIf)

Em seguida, insira o nome de usuário do perfil e clique em Enviar.

![](/files/Klxlp5P2N3bIKqplSlQv)

Um e-mail contendo um código de verificação será enviado para o endereço de e-mail vinculado a esse perfil. Insira o código de verificação e clique em Enviar código.

![](/files/KvA1WRS2bdRfEJzv1shj)

Se o código estiver correto, você poderá criar uma nova senha. Insira a nova senha duas vezes. Certifique-se de atender aos requisitos da senha, eles estão listados abaixo do campo de nova senha e ficarão verdes quando atendidos. Por fim, para confirmar a redefinição, clique em Redefinir senha.

![](/files/V6H0xB57upL3ROpWz9to)

## Interface do Usuário

### Tela Principal

Ao fazer login, a página principal Configurações é exibida.

![main screen](/files/ADA5KleQmKZcjrweq2qG)

Esta página mostra o nome do aplicativo e as configurações que você pode alterar. É possível acessar a página Histórico e verificar a versão ativa.

### Painel de Configurações

No menu da página Configurações, você pode ver a Versão Ativa e os valores dos parâmetros desta versão. Você também pode selecionar uma versão mais antiga no menu suspenso e verificar seus valores. O procedimento de verificação do valor também pode ser feito na aba Histórico.

Nesta página, você pode alterar os parâmetros de configuração atuais. Para isso, insira os novos valores desejados nos campos e clique no botão Salvar no canto inferior direito da tela. Ele irá alterar os parâmetros e atualizar o número da versão.

{% hint style="info" %}
Ambos os botões Salvar e Descartar estarão disponíveis somente se alguma alteração tiver sido feita nos parâmetros de configuração.
{% endhint %}

### Painel de Histórico

A página Histórico permite comparar os parâmetros de configuração entre as várias alterações de versão do aplicativo desejado.

![history screen tab](/files/oV0ifqrKoroCRBrrKR92)

Nesta página, você pode comparar a versão atual (marcada com uma etiqueta verde) com uma versão selecionada pelo menu suspenso. A lista mostrará as versões que estão sendo comparadas, a data de operação inicial da versão e os valores das propriedades.

Propriedades com valores diferentes são destacadas em vermelho, enquanto propriedades com o mesmo valor não serão ser destacadas.

Também é possível restaurar os parâmetros de configuração de uma versão anterior. Para isso, selecione a versão desejada e clique no botão Restaurar para a versão #.

## Parâmetros de Configuração do GBDS

Esta seção apresenta os parâmetros que o Control Panel pode alterar no GBDS, relaciona seus nomes aos nomes de configuração nos arquivos de configuração e explica suas funcionalidades.

* Face enroll minimum templates - Define o número mínimo de templates de face requeridos para a transação ser processada.

  > Nome do parâmetro no GBDS: gbds.enroll.faces.min-nr-template
* Fingerprint enroll minimum templates - Define o número mínimo de templates de digitais requeridos para a transação ser processada.

  > Nome do parâmetro no GBDS: gbds.enroll.fingerprints.min-nr-template
* Iris enroll minimum templates - Define o número mínimo de templates de íris requeridos para a transação ser processada.

  > Nome do parâmetro no GBDS: gbds.enroll.iris.min-nr-template
* Newborn palmprint enroll minimum templates - Define o número mínimo de templates de palmar de recém-nascidos requeridos para a transação ser processada.

  > Nome do parâmetro no GBDS: gbds.enroll.newborn-palmprint.min-nr-template
* Palmprint enroll minimum templates - Define o número mínimo de templates de palmar requeridos para a transação ser processada.

  > Nome do parâmetro no GBDS: gbds.enroll.palmprint.min-nr-template
* Fingerprint enroll minimum quality - Define a qualidade mínima para uma transação de cadastro de digitais não gerar uma exceção.

  > Nome do parâmetro no GBDS: gbscluster.min.quality
* Turn on RDB system configuration on GBDS API - Ativar a configuração do sistema pelo banco de dados relacional.

  > Nome do parâmetro no GBDS: gbds.rdbSystemConfiguration.api.enabled
* Fingerprint update verify threshold - Define a pontuação mínima para considerar casamento de digitais em uma comparação 1:1 em uma operação de busca.

  > Nome do parâmetro no GBDS: gbscluster.enroll.fingerprints.verify.matchthreshold
* Face update verify threshold - Define o limiar usado quando casando faces durante uma operação de busca.

  > Nome do parâmetro no GBDS: gbscluster.update.faces.verify.matchthreshold
* Fingerprint update minimum quality - Define a qualidade mínima necessária de uma extração de digital para não gerar uma exceção de atualização.

  > Nome do parâmetro no GBDS: gbscluster.update.min.quality
* Fingerprint update minimum biometrics - Define o número mínimo de casamento biométrico de digitais para uma operação de atualização ser aceita.

  > Nome do parâmetro no GBDS: gbscluster.update.minimum.fingers
* Face update exception enabled - Define quando imagem faciais devem ser consideradas para gerar exceções de atualização.

  > Nome do parâmetro no GBDS: gbscluster.update.consider.faces
* Fingerprint update exception enabled - Define se digitais devem ser consideradas para gerar exceções de atualização.

  > Nome do parâmetro no GBDS: gbscluster.update.consider.fingerprints

## Configurações

Nesta tela, há quatro opções para que os usuários possam escolher suas preferências:

* Tema: **escuro** ou **claro**;
* Linguagem;
* Formato de hora: **12 horas (AM/PM)** ou **24 horas**;
* Formato de data: **dd/mm/yyyy**, **mm/dd/yyyy** ou **yyyy/mm/dd**;

![settings screen](/files/xHT5XrkwtlVZin5iBbcJ)


# SMART

## Introdução

O **GBS SMART** é uma aplicação web para a coleta de dados biográficos e biométricos para emissão de carteiras de identidade ou identificação criminal.

Este manual está atualizado para a versão 1.1.12.1 do SMART.

### Acesso e Autenticação

A aplicação deve ser acessada com um navegador web (Google Chrome é recomendado). A URL de acesso é específica para cada implantação. Se necessário, entre em contato com a equipe de suporte da Griaule para obter a URL correta.

É preciso se autenticar para acessar a aplicação. As credenciais necessárias são nome de usuário e senha.

![](/files/4m46spfgzRpBzbSJpw4V)

## Interface do Usuário

Após fazer o login, o usuário é direcionado para a tela inicial do GBS SMART. Essa tela contém atalhos para as principais funcionalidades do SMART.

A interface é dividida em duas seções principais: a barra superior e a área de conteúdo.

![](/files/rwtm4dZRnO6XLC0VFg1A)

Na barra superior, há 4 menus suspensos, cada um representando uma categoria de funcionalidades:

![](/files/lvIee2lYV2ep97F9XCAH)

1. [Processos Civis](#processos-civis)
2. [Processos Criminais](#processos-criminais)
3. [Outros](#outros)
4. [Menu no Nome de Usuário](#menu). Passando o mouse sobre o **nome de usuário**, pode-se acessar opções adicionais.

{% hint style="info" %}
Algumas opções podem não estar disponíveis dependendo da configuração do ambiente ou permissões do usuário.
{% endhint %}

## Processos Civis

As funcionalidades para **Processos Civis** podem ser acessadas por meio dos atalhos na tela inicial:

![](/files/lN1bfWKaI80w6zYIANpf)

Ou passando o mouse sobre `Processos Civis` na barra superior para mostrar o menu suspenso:

![](/files/4usLm1E0BkJuzxFp6axr)

As funcionalidades disponíveis são:

* [Lista de Processos Civis](#lista-de-processos-civis)
* [Emissão de Carteira de Identidade](#emissao-de-carteira-de-identidade)
* [Emissão Expressa](#emissao-expressa)

### Lista de Processos Civis

Esta tela mostra uma lista com todos os processos civis que foram criados. Um processo civil é o registro de atendimento e um conjunto de dados biográficos de um cidadão (coletados no momento da criação do processo) e de dados biométricos (como foto de face e impressões digitais) para a emissão de uma Carteira de Identidade Nacional (CIN). Os processos são organizados em uma tabela com colunas para o número do protocolo, nome, CPF, RG, data de criação, posto de atendimento e status.

![](/files/BQX8jz2qx66naOc3eajh)

Os status são categorizados conforme o seguinte código de cores:

<table><thead><tr><th width="100">Cor</th><th>Descrição</th><th width="230">Ação necessária para avançar?</th></tr></thead><tbody><tr><td>Amarelo</td><td>É necessária uma ação interna à aplicação para que o processo possa avançar. Não depende do requerente.</td><td>Sim, interna.</td></tr><tr><td>Azul</td><td>Aguardando ação interna à aplicação para avançar, porém depende de interação com o requerente.</td><td>Sim, interna com o requerente.</td></tr><tr><td>Laranja</td><td>Necessita de ação externa/em conjunto com outro órgão para que o processo avance.</td><td>Sim, externa e/ou conjunta.</td></tr><tr><td>Cinza</td><td>Estado unicamente informativo: aguardando resposta ou tramitando em serviços externos.</td><td>Não.</td></tr><tr><td>Verde</td><td>Tramitação concluída com sucesso.</td><td>Não.</td></tr><tr><td>Vermelho</td><td>Processo com erro ou cancelado.</td><td>Não.</td></tr></tbody></table>

Há 19 possíveis status para um processo civil:

<table><thead><tr><th width="200">Status</th><th width="100">Cor</th><th>Descrição</th></tr></thead><tbody><tr><td><strong>Necessita Captura</strong></td><td>Azul</td><td>O processo foi criado e está aguardando a realização da captura biométrica (ao vivo ou por meio de ficha).</td></tr><tr><td><strong>Aguardando segmentação</strong></td><td>Cinza</td><td>O processo foi enviado para o GBS CardScan e está aguardando segmentação das biometrias. Não é necessário intervenção do operador.</td></tr><tr><td><strong>Pronto para envio</strong></td><td>Amarelo</td><td>As biometrias foram capturadas (ao vivo ou por meio de ficha) e o processo está aguardando ser enviado.</td></tr><tr><td><strong>Processando no ABIS</strong></td><td>Cinza</td><td>O processo civil está sendo processado pelo ABIS. Não é necessário intervenção do operador.</td></tr><tr><td><strong>Baixa qualidade (MIR)</strong></td><td>Laranja</td><td>O processo está aguardado atuação no GBS MIR devido à baixa qualidade das biometrias.</td></tr><tr><td><strong>Exceção (ETR)</strong></td><td>Laranja</td><td>O processo está aguardando atuação no GBS ETR pois gerou uma exceção.</td></tr><tr><td><strong>Processado no ABIS</strong></td><td>Cinza</td><td>O cadastro no ABIS finalizado com sucesso. Não é necessário intervenção do operador.</td></tr><tr><td><strong>Pronto para conferência</strong></td><td>Amarelo</td><td>O processo está aguardando conferência manual ou investigação do operador antes de ser enviado para a Receita Federal.</td></tr><tr><td><strong>Processando na RFB</strong></td><td>Cinza</td><td>O processo está na etapa de checagem na Receita Federal do Brasil (RFB). Não é necessário intervenção do operador.</td></tr><tr><td><strong>Aguardando correção (RFB)</strong></td><td>Laranja</td><td>O processo apresentou erro na Receita Federal do Brasil (RFB) e necessita de atuação conjunta com a Receita Federal.</td></tr><tr><td><strong>Cadastro com erro</strong></td><td>Vermelho</td><td>O processo está com erro interno.</td></tr><tr><td><strong>Processando no MJ</strong></td><td>Cinza</td><td>O processo está na etapa de envio e checagem no Ministério da Justiça (MJ). Não é necessário intervenção do operador.</td></tr><tr><td><strong>Enviado para impressão</strong></td><td>Laranja</td><td>O processo foi enviado para o GBS Print. Não é necessário intervenção do operador no GBS SMART, somente no GBS Print.</td></tr><tr><td><strong>Impresso</strong></td><td>Cinza</td><td>A documento de identidade foi impresso e validado no GBS Print e está sendo enviado ao posto de atendimento.</td></tr><tr><td><strong>Aguardando Pagamento</strong></td><td>Azul</td><td>Status exclusivo da <a href="#emissao-expressa">Emissão Expressa</a>: o processo está aguardando pagamento.</td></tr><tr><td><strong>Disponível para entrega</strong></td><td>Azul</td><td>O documento impresso foi recebido no posto de atendimento e está disponível para entrega ao requerente. Isto é, o malote que continha o documento foi marcado como recebido por meio da funcionalidade de Receber Malote.</td></tr><tr><td><strong>Finalizado</strong></td><td>Verde</td><td>Status final global do processo civil. Indica o fim do processamento em todos os serviços externos (como Receita Federal, Wallet, ABIS, etc.) e que não há mais ações a serem tomadas.</td></tr><tr><td><strong>Entregue</strong></td><td>Verde</td><td>O documento impresso foi entregue ao requerente (em mãos ou por procuração). O envio para Wallet pode ser efetuado e, após conclusão, poderá evoluir para Finalizado.</td></tr><tr><td><strong>Rejeitado</strong></td><td>Vermelho</td><td>O processo civil foi cancelado. Isto pode ocorrer em caso de rejeição na conferência/investigação ou GBS ETR, por exemplo.</td></tr></tbody></table>

Clicar em um processo da lista abrirá a tela de [Detalhes do Processo Civil](#detalhes-do-processo-civil).

Para criar um novo processo civil e emitir uma carteira de identidade, clique no botão Criar processo civil, localizado no canto superior direito da tela. Em seguida, siga as instruções descritas em [Emissão de Carteira de Identidade](#emissao-de-carteira-de-identidade).

#### Filtros

Na parte superior da tela, há opções de filtros para ajudar o usuário a encontrar processos específicos. É possível filtrar por intervalo de datas, protocolo, CPF, RG, posto e status. Para aplicar um filtro, selecione os filtros desejados e clique em Filtrar. Em seguida, apenas os processos que atendem aos critérios selecionados serão exibidos.

![](/files/c8nvYJl2BNlWduI7AmBn)

Para remover um filtro, clique no botão X ao lado do filtro aplicado, ou clique no botão amarelo Limpar filtros para remover todos os filtros de uma vez.

#### Detalhes do Processo Civil

Na tela de `Detalhes do Processo Civil` é possível visualizar todos os dados do processo e realizar diversas ações.

![](/files/OpqiNaeWHItzm8udkjzV)

Na parte superior da ficha de processo, é possível encontrar as datas de criação e modificação do processo, seu status e os [Botões de Ação](#botoes-de-acao). Abaixo, estão a foto de face, os dados biográficos e a subseção de [documentos adicionais](#documentos-adicionais). Na parte inferior, estão os dados biométricos organizados em abas de acordo com seu tipo. Finalmente, no rodapé da página, encontram-se os [Botões de Rodapé](#botoes-de-rodape).

{% stepper %}
{% step %}

#### Botões de Ação

No canto superior direito da ficha de processo, há uma série de botões de ação que permitem ao usuário realizar diversas operações. Eles se tornam disponíveis ou indisponíveis automaticamente conforme sua aplicabilidade para o status atual do processo.

As opções disponíveis são:

* Histórico: mostra o histórico do processo.

  > Para detalhes da funcionalidade de histórico, veja a seção [Histórico do Processo Civil](#historico-do-processo-civil).
* Editar biográficos: abre a tela de edição de biográficos.

  > Para detalhes desta funcionalidade, veja a seção [Editar Biográficos](#editar-biograficos).
* `Pagamento`, menu suspenso com as opções:

  > * Gerar boleto: gera um boleto para pagamento.
  > * Isentar pagamento: isenta o requerente do pagamento mediante justificativa.
  > * Confirmar pagamento: confirma o pagamento utilizando o número do boleto.
  >
  > Para detalhes do procedimento de pagamento, veja a seção [Pagamento](#pagamento).
* `Baixar`, menu suspenso com as opções:

  > * Prontuário: baixar o prontuário do processo em PDF.
  > * Protocolo: baixar o protocolo do processo em PDF.
* `Capturar`, menu suspenso com as opções:

  > * Face ao vivo: capturar foto de face utilizando a câmera da estação de trabalho.
  > * Digitais ao vivo: capturar impressões digitais utilizando o leitor biométrico da estação de trabalho.
  > * Assinatura ao vivo: coletar assinatura utilizando o pad de assinatura da estação de trabalho.
  > * Capturar em ficha: capturar dados biométricos a partir de uma ficha de papel digitalizada.
  > * Apagar Biometrias: remove todas as biometrias do processo.
  > * Imagens auxiliares ao vivo: capturar imagens auxiliares utilizando a câmera da estação de trabalho.
  >
  > Para detalhes do procedimento de captura biométrica, veja a seção [Coletar Dados Biométricos](#coletar-dados-biometricos).
  > {% endstep %}

{% step %}

#### Botões de Rodapé

No rodapé da tela de [Detalhes do Processo Civil](#detalhes-do-processo-civil), há botões adicionais para ações específicas.

Do lado esquerdo:

* Voltar: retorna à [Lista de Processos Civis](#lista-de-processos-civis).

Do lado direito, dependendo do status do processo, pode-se ter:

* Enviar: envia o processo para processamento.

  > Disponível se o **status** do processo for **Pronto para Envio** (para Processos Civis tradicionais) ou **Aguardando Pagamento** (para Processos Civis de [Emissão Expressa](#emissao-expressa)).
  >
  > Para detalhes do procedimento de enviar o processo civil, veja a seção [Enviar Processo Civil](#enviar-processo-civil).
* Conferência biográfica: abre a tela de [Conferência Biográfica](#conferencia-biografica).

  > Disponível se o **status** do processo for **Pronto para conferência**.
  >
  > Para detalhes do procedimento de conferência biográfica, veja a seção [Conferência Biográfica](#conferencia-biografica).
* `Entregar Documento`, menu suspenso com opções para marcar que o documento impresso vinculado ao processo foi entregue:

  > * Entrega em mãos: marca que o documento foi entregue diretamente ao requerente.
  > * Entrega por procuração: marca que o documento foi entregue a um procurador do requerente.
  >
  > Presente se o **status** do processo for **Disponível para entrega**.
  >
  > Para detalhes do procedimento de conferência biográfica, veja a seção [Entregar Documento Impresso](#entregar-documento-impresso).
  > {% endstep %}
  > {% endstepper %}

### Emissão de Carteira de Identidade

A emissão de uma carteira de identidade representa o processo de coleta de dados biográficos e biométricos para produzir uma nova carteira de identidade, seja ela a primeira via ou uma segunda via com recoleta de dados.

Para emitir uma carteira de identidade, primeiro deve-se buscar o CPF ou RG do requerente na base de dados. Para isso, preencha o campo `Buscar CPF` ou `Buscar RG` com um número de documento válido e clique no botão de busca, indicado pelo ícone de lupa.

![](/files/mcPWGMLiIhlg2SCHD0Sp)

Caso o documento seja encontrado, os dados biográficos obtidos da base de dados serão exibidos na seção `Resultados da busca`, no lado direito da tela:

![](/files/KTgDZjNy19m2O15ZrzK6)

Caso contrário, será exibida a mensagem: "*Nenhuma informação foi encontrada para o documento: \<CPF/RG>*".

![](/files/mDoyiN7fTpCwkolpP3A4)

Além disso, na parte inferior da tela - na seção `Processos já emitidos`, é possível visualizar os processos já emitidos para o documento buscado. Ou, caso não haja nenhum processo emitido, será exibida a mensagem: "*Nenhum processo emitido foi encontrado para o documento: \<CPF/RG>*".

Para prosseguir com a emissão, se a busca de documento retornou resultados, clique no botão Nova carteira, localizado no canto inferior direito da tela.

Caso a busca de documento não tenha retornado resultados, clique no botão Nova carteira sem CPF/RG, localizado no canto inferior direito da tela.

Isso abrirá uma janela com o formulário de coleta de dados biográficos.

#### Coletar Dados Biográficos

Para dar início à criação de um processo civil e emitir uma carteira de identidade, deve-se capturar os dados biográficos do cidadão.

{% hint style="info" %}
Se a busca de documento retornou resultados, os dados biográficos obtidos serão preenchidos automaticamente no formulário de coleta.
{% endhint %}

Preencha cuidadosamente o formulário de coleta de dados biográficos. Os campos obrigatórios são destacados com um contorno laranja, indicados por uma mensagem (*Este campo é obrigatório*) e devem ser preenchidos para que seja possível prosseguir.

![](/files/gPRxECqq5oHTKJ3DDvsP)

Por fim, clique em Criar processo.

Após a criação do processo, você será redirecionado para a tela de [Detalhes do Processo Civil](#detalhes-do-processo-civil). Prossiga realizando a [coleta de dados biométricos](#coletar-dados-biometricos), como explicado na seção a seguir.

#### Coletar Dados Biométricos

Após a coleta de dados biográficos e criação do processo, é necessário coletar os dados biométricos. Isso ocorre a partir da tela de [Detalhes do Processo Civil](#detalhes-do-processo-civil).

![](/files/ATLpzxfkMBIUSKhE2frS)

Há duas maneiras de capturar os dados biométricos:

* [Em Ficha](#captura-em-ficha): a partir de uma ficha de papel digitalizada.
* [Ao Vivo](#captura-ao-vivo): utilizando a câmera, leitor biométrico e pad de assinatura da estação de trabalho.

![](/files/JIjvvWZanFKPj68jZBDs)

Para cada dado biométrico do processo (como foto de face e impressão digital) também é possível fazer a captura individual ou adicionar informações justificando a ausência da biometria, como dedo enfaixado, amputado, etc. Para isso, passe o mouse sobre a seta para baixo, localizada à direita do nome da biometria, e clique na opção desejada.

![](/files/DMGkrnjORkqGR73J8fmK)

{% stepper %}
{% step %}

#### Captura em Ficha

Para capturar os dados biométricos utilizando uma ficha de papel digitalizada, passe o mouse sobre o botão de ação `Capturar` e clique em Capturar em ficha.

Em seguida, insira a resolução da imagem da ficha de papel digitalizada, selecione o layout da ficha utilizando o menu suspenso e selecione o arquivo da ficha digitalizada para fazer upload.

{% hint style="success" %}
Para mais informações sobre os layouts de ficha, consulte a seção [Layouts](#layouts).
{% endhint %}

![](/files/PlNi2j0nsONUr4aRlmZc)

No lado direito da tela - na seção de `Pré-visualização`, a ficha digitalizada será exibida com os as regiões de onde serão extraídas as biometrias destacadas em azul.

Verifique se essas regiões se sobrepõem adequadamente às biometrias coletadas na ficha.

Se estiverem corretas, clique em Enviar, localizado no canto inferior direito da tela.

Caso contrário, clique em Enviar com layout ajustado. Na janela que abrir, selecione a ferramenta de `Transformar Região`.

![](/files/KyJ6erGCkI2zvKZk8cyQ)

Clique e arraste as regiões para reposicioná-las (contorno azul escuro) ou clique sobre uma região para mostrar as opções de redimensionamento (contorno verde claro): para redimensionar uma região, clique e arraste um dos pontos de controle encontrados no contorno da região.

{% hint style="info" %}
Cada região está atrelada a uma biometria específica. Essa biometria é indicada no canto superior esquerdo de cada região. Certifique-se de que as regiões estejam posicionadas corretamente sobre as biometrias correspondentes.
{% endhint %}

![](/files/3SjvqTYlP8VwHO3S2F3l) ![](/files/Zrc7XHj8LdAkrNhWo3qa)

Após ajustar as regiões, clique em Salvar, localizado no canto superior direito, e escolha uma opção:

* Original: cria um novo layout com as regiões ajustadas e que poderá ser utilizado para novas requisições. Se for usado, antes de salvar é recomendável alterar o nome e descrição do layout.
* Editado: utiliza as edições no envio atual mas não cria um novo layout.

![](/files/91jtA8wfQlzxQzcXVzBG)

Você será redirecionado de volta para a tela de [Detalhes do Processo Civil](#detalhes-do-processo-civil) e, em segundo plano, o sistema fará a extração das biometrias da ficha digitalizada. Conforme a extração é executada, automaticamente as biometrias serão adicionadas ao processo e seu status será atualizado.

Ao final da extração, o status do processo será **Capturado** e as biometrias estarão disponíveis para visualização.
{% endstep %}

{% step %}

#### Captura ao Vivo

A captura ao vivo é realizada utilizando a câmera, leitor biométrico e pad de assinatura da estação de trabalho, no momento do atendimento ao cidadão.

{% hint style="warning" %}
Para que seja possível realizar a captura ao vivo, é necessário que o **BCC Services** esteja em execução na estação de trabalho.

Para certificar-se de que ele está em execução - no canto inferior direito da tela, na barra de tarefas - clique na seta apontando para cima e verifique se o logo do BCC Services está na lista de programas em execução.

<img src="/files/WDsSB63eDEly2tY9ETFp" alt="" data-size="original"><img src="/files/MNHzjqAwer52eX7N1n8D" alt="" data-size="original">

Caso o BCC Services não esteja em execução, abra o menu iniciar clicando no ícone do Windows no lado esquerdo da barra de tarefas (ou apertando a tecla Windows no teclado). Em seguida, procure pela pasta GBS BCC na lista de programas (ou digite "bcc" para fazer uma busca). Clique no ícone `BCC` para abrir o BCC Services.

![](/files/mFT8sE4QQWYtjrEVYbpD) ou ![](/files/y3BhOwiiaykHrxhC7eBC)
{% endhint %}

* **Face**

Para capturar a foto de face, passe o mouse sobre o botão de ação `Capturar` e clique em Face ao vivo. Uma janela de captura será aberta.

Se a camera não iniciar automaticamente, clique em Iniciar câmera.

![](/files/nDJLqwqOad4OFsDXIbWe)

Instrua a pessoa a se posicionar corretamente diante da câmera e clique em Capturar.

{% hint style="info" %}
Em alguns ambientes, a captura da foto pode ser feita automaticamente após o sistema detectar que a pessoa está posicionada corretamente diante da câmera.
{% endhint %}

![](/files/og5lLrI2hQUydI79S2JZ)

Automaticamente, o sistema fará alguns ajustes na imagem capturada e a mostrará no lado direito da tela. Se desejar, é possível realizar ajustes manuais de brilho e contraste. Para isso, deslize o seletor para a direita ou esquerda. Quando estiver satisfeito com a imagem, clique em OK.

![](/files/gAj3hlKmDSK3dcA2jAtc)

* **Impressões Digitais**

Para capturar as impressões digitais, passe o mouse sobre o botão de ação `Capturar` e clique em Digitais ao vivo. Uma janela de captura será aberta.

![](/files/nYcB7D4JpMp5KtAvGR70)

Clique em Digitais, no canto inferior direito da tela, e faça a captura das digitais de controle de sequência, conforme as instruções exibidas na tela.

{% hint style="info" %}
Esse passo pode não ser necessário em seu ambiente, nesse caso, ignore-o e prossiga para o próximo passo.
{% endhint %}

![](/files/j71q0t8FTdh8bRNmaioC)

Em seguida, clique novamente em Digitais para iniciar a captura das digitais principais. O dedo a ser capturado será destacado em vermelho. Instrua a pessoa a posicionar o dedo corretamente sobre o leitor biométrico e aguarde a captura automática.

![](/files/O15Ud64g8MUJsGK0yT4X)

Após uma captura bem-sucedida, dedo coletado será destacado em verde e a tela avançará automaticamente para o próximo dedo a ser capturado.

![](/files/j7eMI2l31PcBGq9jnIIa)

Em casos especiais, pode ser necessário indicar alguma anomalia na captura de um dedo. Para isso, com o dedo selecionado (destacado em vermelho), clique no menu suspenso abaixo da área de captura e selecione um motivo. As opções são: Danificado, Enfaixado, Ignorado, Amputado ou Baixa qualidade.

![](/files/QdwSfpULIasDF9yVgv5h)

Após escolher um motivo, o dedo selecionado será destacado em laranja. Clique em Aceitar, no canto inferior direito da tela, para confirmar a anomalia.

![](/files/Xp7Fm3eDMm82dYxwNdwT)

Após aceitar a adição de uma anomalia, o dedo com anomalia será destacado por uma cor específica, dependendo do motivo:

* **Danificado** ou **Enfaixado**: cinza
* **Ignorado** ou **Baixa qualidade**: amarelo
* **Amputado**: preto

![](/files/3mIZ9upVCIrkcwwOCiJ7)

As anomalias também serão exibidas na lista de digitais coletadas com a mensagem "anomalia" e o motivo escolhido. As biometrias sem anomalia serão acompanhadas de uma indicação da qualidade da coleta.

![](/files/VKOTY1CwMpT1103ujawe)

Após finalizar a captura de impressões digitais, clique em Salvar, no canto inferior direito da tela.

![](/files/96fFAvEaMrGaTddsI6Ah)

* **Assinatura**

Para capturar a assinatura, passe o mouse sobre o botão de ação `Capturar` e clique em Assinatura ao vivo. Uma janela de captura será aberta.

![](/files/aAJEiHUPeMPi3QmbcYIz)

Realize a coleta utilizando o pad de assinatura.

Ao final das capturas, o status do processo será **Capturado** e as biometrias estarão disponíveis para visualização.
{% endstep %}
{% endstepper %}

#### Editar Biográficos

Se um processo ainda não foi enviado, é possível editar os dados biográficos do requerente. Para isso, clique no botão de ação Editar biográficos, localizado no canto superior direito da tela. Uma janela de edição será aberta:

![](/files/c1xWb5aHBGs9iD0IYbN0)

Realize as modificações necessárias e clique em Editar biográficos. Se desejar descartar as alterações, clique em Cancelar.

#### Documentos Adicionais

Antes de enviar um processo, deve-se anexar `Documentos Adicionais`, como uma cópia da certidão de nascimento ou casamento do requerente.

Para isso, clique no botão de **Adicionar**, localizado na parte inferior direita da seção de documentos adicionais:

![](/files/hd9JZUNKEheWptDWmUM4)

Selecione o arquivo desejado e clique em Abrir para anexá-lo ao processo. O documento será exibido na lista de documentos adicionais. Em seguida, no menu suspenso, selecione uma categoria para o documento e clique em Salvar alterações.

![](/files/3SAVF501XbYPUc7jw2hd)

O documento será adicionado ao processo. Para **visualizar**, **baixar** ou **excluir** um documento, clique nos ícones correspondentes, localizados no final da linha do documento na lista de documentos adicionais.

![](/files/dbuQq4VeTpeVEZsu00wK)

#### Enviar Processo Civil

A etapa seguinte do processo de emissão de uma carteira de identidade é enviar o processo para processamento. Para isso, na tela de [Detalhes do Processo Civil](#detalhes-do-processo-civil), clique no botão Enviar, localizado no canto superior direito da tela.

![](/files/1fUIUnQTD2v4o9ZLlPyx)

Uma janela de confirmação aparecerá. O botão de envio permanecerá desativado até que uma opção seja selecionada.

![](/files/CX0VgeqABp0Sc6f0zoEL)

Selecione se deseja enviar o perfil para investigação (exceção biográfica no ETR). Se sim, utilize o menu suspenso para adicionar um motivo.

![](/files/Bjz67gx2ywrrrq4D9R4K) ![](/files/HnNErGK7l2ugwyEMrVos)

Em seguida, se necessário, marque que o perfil possui biometrias de baixa qualidade.

Por fim, clique em Enviar.

![](/files/CqHhgPLBbWpFOPgjxjyK)

O perfil será enviado para processamento e seu status será atualizado.

![](/files/qlwaUBuFAAdIhl5qQ8iq)

#### Conferência Biográfica

Em alguns casos, pode ser necessário realizar uma Conferência Biográfica para revisar os dados biográficos enviados no processo. Isso se dá por configurações do ambiente ou por divergências entre os dados enviados no processo e os dados biográficos já presentes na base de dados. Nesses casos, o processo terá o status **Pronto para conferência**.

Para realizar a Conferência Biográfica, clique no botão de rodapé Conferência biográfica, localizado no canto inferior direito da página:

![](/files/c6dgdliuv5EqTFADElMS)

A tela de `Conferência biográfica` será aberta. Nela, é possível visualizar os dados biográficos do processo e os dados recuperados da base de dados, assim como a certidão de nascimento (ou casamento) enviada como o processo:

![](/files/chJMmqdUyxkQ0T9JzneL)

**Os dados biográficos do processo devem coincidir com os dados presentes na certidão de nascimento** (ou casamento) do cidadão requerente, mesmo que esses dados não coincidam com os recuperados da base de dados.

Ao realizar a conferência, se necessário, é possível editar os dados biográficos do processo. Para isso, clique em Editar biográficos. Realize as modificações necessárias e clique em Salvar mudanças. Se desejar descartar as alterações, clique em Cancelar.

![](/files/XwStZvmNZi0edCAlgEo9)

Então, clique em Aceitar para confirmar a Conferência Biográfica e aceitar o processo. Na tela de confirmação, clique novamente em Aceitar.

![](/files/It85e4RB7WgvZyTWpUNL)

Se não desejar prosseguir com este processo, é possível rejeitá-lo. Para isso, clique em Rejeitar. Na tela de confirmação, clique novamente em Rejeitar.

{% hint style="danger" %}
Ao rejeitar um processo, seu status evoluirá para **Rejeitado** e o processo será finalizado. Esse é um status final. Para reiniciar, será necessário fazer um novo atendimento com o requerente e criar um novo processo.
{% endhint %}

![](/files/3gXlp4a3nGM0uU8Mvl6S)

#### Pagamento

Em processos de segunda via ou de [Emissão Expressa](#emissao-expressa), é necessário que o pagamento seja realizado antes de entregar o documento impresso ao requerente.

As opções de pagamento estão disponíveis junto aos botões de ação, no menu suspenso `Pagamento`.

![](/files/DbwaeMusKVR2v9l18XtW)

Há três opções disponíveis:

* [Gerar Boleto](#gerar-boleto)
* [Isentar Pagamento](#isentar-pagamento)
* [Confirmar Pagamento](#confirmar-pagamento)

{% stepper %}
{% step %}

#### Gerar Boleto

Para gerar um boleto bancário de pagamento, passe o mouse sobre `Pagamento` e clique em Gerar boleto.

Uma nova aba será aberta com o PDF do boleto bancário e opções para salvar ou imprimir o boleto.
{% endstep %}

{% step %}

#### Isentar Pagamento

Para isentar um processo de pagamento, passe o mouse sobre `Pagamento` e clique em Isentar pagamento. Em seguida, selecione o motivo da isenção e clique em Enviar:

![](/files/oQ6KxUP37kUpYMBp1OmH)
{% endstep %}

{% step %}

#### Confirmar Pagamento

Se o pagamento foi realizado por boleto bancário, é necessário confirmá-lo para que o processo possa prosseguir. Para isso, passe o mouse sobre `Pagamento` e clique em Confirmar pagamento. Em seguida, insira o número do boleto e clique em Confirmar pagamento. Uma busca será realizada e, se o boleto constar como pago, o pagamento será confirmado.

![](/files/2578IwVlFEOYXisJXMGx)
{% endstep %}
{% endstepper %}

#### Entregar Documento Impresso

A etapa final do processo de emissão de uma carteira de identidade consiste em entregar o documento impresso ao requerente. Para isso, o processo deve ter o status **Disponível para entrega**.

![](/files/SR8D6bgIQNDN5YzfUsyz)

Há duas opções:

* [Entrega em mãos](#entrega-em-maos)
* [Entrega por procuração](#entrega-por-procuracao)

{% hint style="info" %}
Em processos de segunda via ou de [Emissão Expressa](#emissao-expressa), é necessário que o pagamento já tenha sido confirmado para que o documento impresso possa ser entregue ao requerente.

A opção `Entregar Documento` se manterá indisponível até que o pagamento seja confirmado.

<img src="/files/iIaluUfhMYG1SqgLWlZq" alt="" data-size="original">

Para mais informações sobre o pagamento, consulte a seção [Pagamento](#pagamento).
{% endhint %}

{% stepper %}
{% step %}

#### Entrega em mãos

Passe o mouse sobre `Entregar Documento`, localizado no canto inferior direito da tela, e clique em Entrega em mãos.

![](/files/0b0jTbHypXZEkX8nBXSu)

Na tela de entrega de documento, há 3 opções de entrega:

1. **SEM** verificação biométrica

   > Se o documento for entregue sem a realização de verificação biométrica, clique em Não verificar. Em seguida, confirme a entrega clicando em Confirmar.
2. **COM** verificação biométrica de **face**

   > Se o documento for entregue com a realização de verificação utilizando biometria de face, clique em Verificar com face. Em seguida, realize a captura da foto de face.
3. **COM** verificação biométrica de **impressão digital**

   > Se o documento for entregue com a realização de verificação utilizando biometria de impressão digital, clique em Verificar com digital. Em seguida, realize a captura das impressões digitais.
   > {% endstep %}

{% step %}

#### Entrega por procuração

Passe o mouse sobre `Entregar Documento`, localizado no canto inferior direito da tela, e clique em Entrega por procuração.

![](/files/hxoJbNLTsCRAtpiGNPDa)

Em seguida, clique em Anexar procuração. Anexe o arquivo da procuração e confirme a entrega clicando em Confirmar entrega.
{% endstep %}
{% endstepper %}

#### Histórico do Processo Civil

A qualquer momento, é possível visualizar o histórico de operações realizadas no processo clicando no botão de ação Histórico. Uma tabela será exibida com o histórico de ações, sua descrição, data e hora de execução e o status atual daquela ação (concluído ou pendente).

![](/files/DzBzvvXGNjzNw27rfZ5m)

As ações possíveis de serem visualizadas no histórico são:

<table><thead><tr><th width="300">Ação</th><th>Descrição</th></tr></thead><tbody><tr><td><strong>Aguardando captura</strong></td><td>Aguardando a captura biométrica</td></tr><tr><td><strong>Capturado</strong></td><td>Dados biométricos capturados</td></tr><tr><td><strong>Processando</strong></td><td>Dados em processamento no ABIS</td></tr><tr><td><strong>Aguardando tratamento de qualidade</strong></td><td>O processo deve ser tratado no MIR</td></tr><tr><td><strong>Aguardando tratamento de exceção</strong></td><td>O processo deve ser tratado no ETR</td></tr><tr><td><strong>Processado</strong></td><td>Dados processados</td></tr><tr><td><strong>Conferência biográfica</strong></td><td>Conferência biográfica necessária</td></tr><tr><td><strong>Processando na Receita Federal</strong></td><td>Dados em processamento na Receita Federal</td></tr><tr><td><strong>Processando no Ministério da Justiça</strong></td><td>Dados em processamento no Ministério da Justiça</td></tr><tr><td><strong>Imprimindo</strong></td><td>Imprimindo documento</td></tr><tr><td><strong>Impresso</strong></td><td>Documento impresso</td></tr><tr><td><strong>Encerrado</strong></td><td>Processo encerrado</td></tr><tr><td><strong>Cancelado</strong></td><td>Processo cancelado</td></tr><tr><td><strong>Erro na Receita Federal</strong></td><td>Erro na Receita Federal</td></tr></tbody></table>

### Emissão Expressa

A `Emissão Expressa` é uma funcionalidade que permite a reimpressão de um documento de identidade já emitido (o mais recente), sem a necessidade de coleta biométrica ou possibilidade alterações de dados.

{% hint style="warning" %}
Para emitir uma segunda via de um documento com coleta biométrica ou alterações, utilize a funcionalidade de [Emissão de Carteira de Identidade](#emissao-de-carteira-de-identidade).
{% endhint %}

Para realizar uma emissão expressa, selecione o tipo de chave de busca utilizando o menu suspenso e insira o valor correspondente. Em seguida, clique no botão Buscar.

![](/files/PkUDZwRL7Ym6dSGy6ixK)

Se nenhum perfil for encontrado, será exibida a mensagem "*Nenhum perfil foi encontrado para o CPF: \<CPF>*".

![](/files/ZIkuEnkyomrlqK4IHRtW)

Se o perfil for encontrado, uma ficha contendo a foto de face e um resumo dos dados biográficos será exibida. Verifique se os dados correspondem ao requerente da emissão expressa e clique em Criar processo.

![](/files/AJ7Xcobcxm7eFbkXUK2x)

Um novo processo civil será criado e você será redirecionado para a tela de [Detalhes do Processo Civil](#detalhes-do-processo-civil). O status do processo será atualizado para **Aguardando Pagamento**. Então, siga as mesmas instruções da [Emissão de Carteira de Identidade](#emissao-de-carteira-de-identidade), a partir da etapa de [Enviar Processo Civil](#enviar-processo-civil).

## Processos Criminais

As funcionalidades para **Processos Criminais** podem ser acessadas por meio dos atalhos na tela inicial:

![](/files/HTLSRNKqq9L9RfBDOVLw)

Ou passando o mouse sobre `Processos Criminais` na barra superior para mostrar o menu suspenso:

![](/files/3r2lnAVHtLImpuMcHZxq)

### Lista de Processos Criminais

Esta tela mostra uma lista com todos os processos criminais que foram criados. Um processo criminal é o conjunto de dados biográficos e biométricos de um cidadão (coletados no momento da criação do processo) coletados com o intuito de realizar uma identificação criminal. Os processos são organizados em uma tabela com colunas para o número do protocolo, nome, CPF, RG, data de criação, posto de atendimento e status.

![](/files/BkeCwhHKDvjf6N7QgJAQ)

## Outros

As funcionalidades auxiliares podem ser acessadas por meio dos atalhos na tela inicial:

![](/files/f4XR1FclIXb8PgqAnJRz)

Ou passando o mouse sobre `Outros` na barra superior para mostrar o menu suspenso:

![](/files/05PHClmxIr374yKidUYA)

As funcionalidades disponíveis são:

* [Busca Avançada](#busca-avancada)
* [Layouts](#layouts)
* [Receber Malote](#receber-malote)

### Busca Avançada

Na tela de `Busca Avançada` é possível realizar uma busca por qualquer tipo de processo na base de dados.

Para isso, selecione o tipo de chave de busca utilizando o menu suspenso, insira o valor correspondente e clique em um dos botões de busca.

Há dois tipos de pesquisa disponíveis:

* Busca: realiza uma pesquisa exata do valor inserido. Os resultados são exibidos rapidamente.
* Busca Ampliada: realiza uma pesquisa mais abrangente, considerando a existência parcial e variações do valor inserido. Os resultados podem demorar mais para serem exibidos.

![](/files/igverRlXC6ME2Ua5VU9Q)

### Layouts

Na tela de `Layouts` é possível visualizar os modelos de ficha registrados que podem ser utilizados.

Os layouts são criados no [CardScan](/aplicacoes/cardscanweb) e representam modelos de fichas de papel que são usadas para coletar dados biométricos. Clique em um layout da lista para visualizar uma prévia do modelo.

{% hint style="success" %}
Para mais informações sobre a criação de layouts, consulte o [capítulo Layouts da documentação do CardScan](/aplicacoes/cardscanweb#layouts-1).
{% endhint %}

![](/files/lwupXLsHyqn1rU6y0uwc)

As áreas destacadas em azul representam as regiões da ficha de onde as biometrias serão extraídas.

![](/files/35b8FJW1iBsYwd9M9lOO)

### Receber Malote

Na tela de `Receber Malote` é possível buscar um malote utilizando seu número de identificação, ver seu status e marcá-lo como recebido.

![](/files/OrejZ8ftp21yuRg7Htkx)

Para buscar um malote, digite seu *ID* no campo de busca e clique em Buscar.

Se o malote não for encontrado, a tela de `Resultado da busca` exibirá a mensagem: *"Nenhum malote foi encontrado com o ID: \<ID>"*

![](/files/4J8DbUsTbWIRaIn85NC7)

Se o malote for encontrado, a tela de `Resultado da busca` exibirá as informações do malote e seu status atual.

Os possíveis status para um malote no SMART são:

* `Gerado`
* `Fechado`
* `Recebido`

![](/files/54bT2kzl29w06Zdt1i4w)

Caso o status seja `Fechado` e o posto de atendimento já tenha o malote em mãos, clique em Malote recebido para marcar o malote como recebido.

O status evoluirá para `Recebido`:

![](/files/g2Rm8RsKfcmSWTVe5JGZ)

## Menu

No canto superior direito, você pode passar o mouse sobre o **nome de usuário** para acessar o menu:

![](/files/M00ZGXLH9x6CpFki9p4J)

As opções disponíveis são:

* Configurações;
* Sair.

### Configurações

Esta seção permite ao usuário alterar alguns aspectos da interface:

![](/files/SgJdx9pOZDJpYNUS3Up9)

* Tema: **Claro** ou **Escuro**;
* Idioma: **Português**;

![](/files/oNbKuzyrOarq2fMm6CZd) ![](/files/urQ4G22mBVgaEXWXCoX4)


# Trust

## 1. Visão Geral da Ferramenta

O Trust é uma ferramenta do GBS usada para resolver conflitos entre dados biométricos ou biográficos que necessitam intervenção humana. Nessas situações, um especialista analisa os perfis envolvidos e escolhe se deve manter, unir ou rejeitar algum deles. As decisões afetam diretamente a base de dados, e as transações em fila só são reprocessadas depois que o caso for resolvido. A ferramenta é utilizada em diferentes contextos, como:

* **Emissão de identidades**: quando há tentativas de cadastro com dados inconsistentes;
* **Sistemas bancários:** garantir que a autenticidade e a unicidade de cada cliente ou correntista sejam asseguradas, e sua identidade corretamente verificada;
* **Eleições**: para garantir a unicidade do eleitor.

### 1.1 O que o Trust resolve na prática?

O Trust foi criado para tratar **inconsistências que comprometam a integridade da base de dados única**, como:

* Um mesmo indivíduo tentando se registrar com **documentos e nomes diferentes**;
* **Biometrias coincidentes** associadas a dados biográficos conflitantes;
* **Atualizações cadastrais incorretas**, que divergem da identidade original.<br>

### 1.2 Quais são os principais benefícios de usar o Trust? <a href="#id-7u3w4io4vzov" id="id-7u3w4io4vzov"></a>

Usando o Trust, você poderá ter:

* **Confiabilidade da base:** assegura que apenas perfis legítimos e consistentes permaneçam, evitando duplicidades e fraudes.
* **Transparência e rastreabilidade:** todas as ações ficam registradas, permitindo auditorias e garantindo confiança nas decisões.
* **Agilidade operacional:** interface intuitiva, com fluxos bem definidos que facilitam o trabalho dos analistas.
* **Segurança nas decisões:** oferece comparações detalhadas entre dados biométricos e biográficos, apoiando decisões técnicas e fundamentadas.
* **Integração com outras ferramentas:** conecta-se com o Intelligence para acesso rápido ao histórico de transações.

## 2. Conceitos Essenciais

Nesta seção, você encontra os principais conceitos e estruturas que compõem o funcionamento do Trust. Eles ajudam a entender como o sistema organiza as informações, como os conflitos são detectados e tratados, e qual o papel dos usuários e das permissões no processo de decisão.

### 2.1 Perfil <a href="#qk1z1dndt60g" id="qk1z1dndt60g"></a>

O perfil representa um indivíduo único na base de dados. Cada perfil reúne dados biográficos e biométricos consolidados e validados.

A base garante que não existam dois perfis com a mesma chave ou biometrias, garantindo que haja unicidade. Perfis existentes são comparados com os dados recebidos em um novo cadastro para verificar possíveis conflitos com as regras da base.

### 2.2. Inconformidade <a href="#nefs492kra8i" id="nefs492kra8i"></a>

No contexto do Trust, uma inconformidade é uma situação em que os dados de um novo cadastro ou de uma atualização não batem com as informações já registradas na base. Isso pode acontecer, por exemplo, quando:

**1. Biometrias Iguais com Chaves Diferentes (Mesmas biometrias)**\
Esta situação ocorre em transações de *enroll* (cadastro) quando dois indivíduos, com o mesmo tipo de chave (como CPF), mas com valores diferentes, apresentam biometrias idênticas (digital e facial), o que pode indicar duplicidade de cadastros.

**2. Biometrias Diferentes com Mesma Chave**\
Ocorre em transações de *update* (atualização), quando duas pessoas compartilham uma mesma chave (mesmo número de CPF, por exemplo), mas apresentam biometrias distintas. Isso sugere possível inconsistência ou troca de identidade.

**3. Biometrias Inconclusivas**\
Podem ocorrer tanto em *enroll* quanto em *update*, em dois cenários principais:

* Quando há uma modalidade biométrica igual (ex: digitais) e outra diferente (ex: face), o que pode indicar tentativa de fraude ou a existência de gêmeos idênticos.
* Quando a qualidade das biometrias é tão baixa que nem o sistema nem os peritos conseguem concluir se são iguais ou diferentes.<br>

**4. Inconformidade de Atualização**\
As biometrias registradas durante a atualização são diferentes das anteriores, indicando uma possível troca de identidade ou erro no processo.

**5. Inconformidade de Cadastro**\
As biometrias fornecidas já existem na base, mas estão associadas a outro perfil, o que pode indicar duplicidade ou tentativa de fraude.

#### Tipos de inconformidade <a href="#id-72cluk9zranj" id="id-72cluk9zranj"></a>

Esses conflitos impedem que o sistema aprove automaticamente a entrada dos dados. Por isso, a inconformidade precisa ser analisada manualmente no Trust, para decidir o que fazer com os perfis envolvidos, se devem ser unificados, rejeitados ou mantidos separados.

O sistema pode detectar diferentes tipos de inconformidade:

* **Biométrica**: Quando há análise biométrica pendente no grupo (ex: digitais ou face da transação coincidem com as de outro perfil).
* **Biográfica**: Quando há análise biográfica pendente no grupo (todas as análises biométricas já foram feitas)
* **Mista**: ocorre quando há conflito simultâneo entre dados biométricos e biográficos.<br>

![](/files/UEVgmJyUr0lti4jvz0Sj)

### 2.3 Grupo de Inconformidade (ou Grupo) <a href="#wzb2u5k20f0n" id="wzb2u5k20f0n"></a>

No Trust, o grupo é a unidade central de análise. Ele é formado por todos os perfis e transações relacionados a uma mesma inconformidade, originada por uma transação que tenta entrar na base de dados. Essa transação é comparada com os perfis existentes e, quando há conflito, todos os envolvidos são reunidos em um único grupo para facilitar a visualização e o tratamento. O grupo é analisado de forma conjunta, permitindo ao especialista entender o caso completo antes de decidir o que deve acontecer na base.

<figure><img src="/files/Dn3qsad0k4eiGnwL3mOA" alt=""><figcaption></figcaption></figure>

### 2.4 Transação <a href="#st8jkh3r8v07" id="st8jkh3r8v07"></a>

No contexto do Trust, uma transação é a tentativa de inserir ou atualizar dados na base do GBDS. Ela pode se referir tanto a um cadastro de um novo indivíduo quanto a uma atualização de dados de um indivíduo já existente na base.

Cada transação contém informações biométricas (como digitais e face) e biográficas (como nome, CPF, data de nascimento) de um indivíduo. O sistema avalia se a chave fornecida (ex: CPF, Título de Eleitor) já existe na base para determinar se a transação é uma atualização ou um novo cadastro.

Existem duas formas principais de transação:

* **Cadastro:** Quando um novo indivíduo é adicionado à base.
* **Atualização:** Quando uma nova transação é enviada para um indivíduo que já estava registrado na base.

<p align="center"><br></p>

<figure><img src="/files/2RpLZ2snG9awhe9D77HD" alt=""><figcaption></figcaption></figure>

### 2.5 Transações em Espera de Resolução <a href="#id-3oyo5ofqs4zv" id="id-3oyo5ofqs4zv"></a>

São transações que entram em conflito com um perfil já envolvido em um grupo de inconformidade ainda não resolvido. Por esse motivo, não podem ser tratadas imediatamente e ficam em estado de espera até que o grupo anterior seja finalizado.

Após a resolução do grupo que causou o bloqueio, essas transações são automaticamente reprocessadas. Nesse momento, elas podem ser aceitas diretamente ou gerar um novo grupo de inconformidade, conforme o resultado da duplicação.

![](/files/dv6Cl70CWq3Cj16QQLWJ)

### 2.6 Comparação Biométrica <a href="#dmlk3cas0pfn" id="dmlk3cas0pfn"></a>

A funcionalidade de comparação biométrica permite ao operador visualizar lado a lado os pares de biometrias (face e digitais) entre a transação e o perfil em análise. Cada par é apresentado com uma borda colorida, que indica o resultado da comparação realizada pelo sistema:

* **Verde:** alta similaridade entre as biometrias
* **Vermelho:** baixa similaridade entre as biometrias
* **Cinza:** resultado inconclusivo

### 2.7 Confirmação do Tratamento <a href="#e69sjdqa43eg" id="e69sjdqa43eg"></a>

Escolha feita ao final da análise de um grupo, definindo o que acontecerá com os perfis e com a transação entrante. As principais decisões são:

* **Rejeitar transação**
* **Unificar perfis**
* **Manter os perfis como distintos**

### 2.8 Hierarquia e Permissões <a href="#mefvrejyhtcu" id="mefvrejyhtcu"></a>

Os usuários têm diferentes níveis de permissão com base na organização à qual estão vinculados e isso afeta o que podem visualizar e decidir dentro do sistema Trust.

Apenas usuários com permissões adequadas conseguem fazer determinadas alterações, visto que algumas ações exigem validação por uma organização superior, o que garante maior segurança e governança nas decisões que afetam múltiplas instituições.

![](/files/BbKdjsSNqf09F1ciEH9w)

### 2.9 Conflito Biométrico <a href="#cd8vx2jucekb" id="cd8vx2jucekb"></a>

Conflito biométrico ocorre quando a biometria apresentada em uma transação (como digitais ou face) difere da biometria já registrada para a mesma chave ou coincide com a biometria de outro perfil existente na base com outra chave. Essa inconsistência pode indicar um erro de cadastro, uma duplicidade ou até uma tentativa de fraude. Conflitos biométricos estão entre os principais motivos que geram inconformidades e exigem análise manual.<br>

### 2.10 Decisão Biométrica <a href="#r28jqyuk3fst" id="r28jqyuk3fst"></a>

A decisão biométrica é a conclusão sobre a similaridade entre duas biometrias. Pode ser tomada automaticamente pelo sistema, com base no score de comparação, ou manualmente por peritos. Scores muito altos indicam biometrias compatíveis, enquanto scores muito baixos indicam biometrias diferentes. Quando o score está em uma faixa intermediária (inconclusiva), é necessária a avaliação por peritos. A decisão biométrica orienta o tratamento da inconformidade, indicando se os dados são da mesma pessoa ou não.<br>

### 2.11 Análise Biométrica <a href="#dqo5ayjug9l0" id="dqo5ayjug9l0"></a>

A análise biométrica é o processo de avaliação visual das biometrias envolvidas em uma inconformidade. Ela ocorre apenas quando as biometrias ficam em uma zona inconclusiva (nem com um score muito alto, nem muito baixo). Nesse caso, peritos comparam as digitais ou imagens faciais para determinar se pertencem à mesma pessoa. A análise é feita de forma independente por mais de um perito e exige consenso para prosseguir com o tratamento. As decisões possíveis são: biometria compatível, incompatível ou inconclusiva.

## 3. Fluxo Operacional

Esta seção descreve passo a passo o funcionamento da ferramenta Trust, refletindo o fluxo real de trabalho dos usuários na análise e tratamento de inconformidades. Inclui a lógica de detecção, os critérios que definem os fluxos possíveis e as decisões que impactam a base de dados.

### 3.1 Tela inicial <a href="#dyi1raoavrxb" id="dyi1raoavrxb"></a>

Esta é a tela que dá acesso às análises disponíveis para um usuário. As informações exibidas variam conforme as permissões do usuário (tipos de análise que pode realizar) e a organização à qual está vinculado.

Na parte superior da tela, há botões que levam à próxima análise disponível. A escolha da análise a ser realizada segue a lógica de priorização definida pelas configurações do sistema, o operador não seleciona qual transação irá analisar, mas sim trata a próxima da fila.

Também são apresentados contadores que indicam quantas análises ainda estão disponíveis para aquele usuário.

![](/files/W2jQiSfEnG6eubWKmbYa)

### 3.1.2 Detecção da Inconformidade <a href="#vdl4ye7l1htg" id="vdl4ye7l1htg"></a>

O sistema Trust detecta uma inconformidade quando uma transação de cadastro ou atualização entra em conflito com os dados consolidados na base. A verificação é feita por meio de algoritmos que avaliam a consistência entre os dados recebidos e os dados existentes, considerando informações biométricas (como digitais e face) e biográficas (como nome, data de nascimento e número de documentos).

#### Critérios de detecção para cadastros e atualizações <a href="#vmbj291bjxa1" id="vmbj291bjxa1"></a>

A transação pode representar:

* **Um novo cadastro**, quando a chave de identificação (por exemplo, CPF ou Título de Eleitor) ainda não existe na base.
* **Uma atualização**, quando a chave já está registrada na base e uma nova transação com as mesmas chaves é feita.

A lógica de detecção de inconformidades varia conforme o tipo da transação:

* No caso de **cadastro**, os dados enviados são comparados com todos os perfis existentes na base, buscando semelhanças biométricas que indiquem duplicidade.
* No caso de **atualização**, os dados da transação são comparados com os dados do perfil de origem. Se houver inconsistência (por exemplo, a biometria enviada for de outra pessoa), uma inconformidade é gerada.

#### Algoritmos de detecção <a href="#id-1fb8cjtup1qk" id="id-1fb8cjtup1qk"></a>

A base utiliza algoritmos de matching que comparam os dados da transação com os perfis existentes. Para a biometria, são utilizados limiares definidos de similaridade para determinar se há ou não correspondência. Em caso de dúvida ou incerteza, o sistema não toma a decisão automaticamente, a análise é encaminhada para operadores humanos, com o apoio de ferramentas de análise facial e de análise de digitais.

**Exemplos de situações que geram inconformidades:**

* Um novo cadastro tem digitais que coincidem com as de um perfil já existente, mesmo com dados biográficos diferentes.
* Uma atualização tenta alterar a biometria (por exemplo, a face) de um perfil, mas a nova biometria não corresponde ao perfil de referência com as mesmas chaves.<br>

Essas situações impedem a entrada automática da transação e acionam os fluxos de análise manual por especialistas.

### 3.1.3 Possíveis fluxos de análise a partir da inconformidade <a href="#id-63v8esb711f2" id="id-63v8esb711f2"></a>

Após a detecção da inconformidade, o sistema pode encaminhar o grupo gerado para diferentes tipos de análise biométrica e biográfica:

* **Apenas análise facial**: se o conflito for facial e não houver indícios de problema nas digitais.
* **Apenas análise de digitais**: se o conflito for exclusivamente nas digitais.
* **Análise facial e da digital**: se forem detectadas inconsistências nas duas modalidades biométricas.
* **Análise facial e/ou digital, mas sem necessidade de comparação de dados ou imagem**: em alguns casos, mesmo com análise biométrica necessária, a análise biográfica não é habilitada, por ausência de conflito nos dados biográficos.<br>

![](/files/m0qAXZGhBaOgwWVbJ8p4)

A análise biográfica é apresentada somente se o sistema identificar divergências nos dados biográficos. Se os dados biográficos forem compatíveis e não houver risco de alteração do conteúdo da base, a etapa de análise biográfica pode não ocorrer.

### 3.2. Acesso à Fila de Análises <a href="#id-9234xlg28wnz" id="id-9234xlg28wnz"></a>

Após a detecção de uma inconformidade, o grupo correspondente é encaminhado para análise por operadores habilitados. O sistema organiza e disponibiliza essas análises por meio de uma interface específica, que permite o acesso controlado e ordenado às inconformidades pendentes de tratamento.

### 3.2.1 Organização da fila (priorização e alocação) <a href="#j1z74d7cuf7b" id="j1z74d7cuf7b"></a>

A priorização das análises segue regras que consideram, entre outros fatores, o tempo de espera da inconformidade e o status atual do grupo. Há um painel do administrador que permite configurar regras de prioridade para determinados grupos ou tipos de transações.

A alocação das análises pode ocorrer de duas formas:

* **Distribuição automática**: o sistema entrega diretamente uma análise disponível ao usuário, conforme sua permissão e escopo organizacional.<br>
* **Seleção manual:** o usuário escolhe livremente qual inconformidade vai analisar; atualmente, esse tipo de seleção só é possível no painel do administrador, por meio de uma busca direta pela chave da pessoa envolvida.

### 3.2.2 Como o usuário recebe uma análise <a href="#f6y2sd2w84tn" id="f6y2sd2w84tn"></a>

Ao acessar a tela de análise, o sistema pode apresentar automaticamente um grupo disponível, conforme a lógica de distribuição. Alternativamente, o operador pode utilizar os recursos de busca e filtros no painel do administrador para selecionar a análise que deseja tratar. As permissões da organização à qual o operador está vinculado determinam quais grupos estarão visíveis ou disponíveis para tratamento.

#### 3.2.3 Interface de acesso: análise em fila de prioridade e painel de análises atribuídas <a href="#k5klniuqbheq" id="k5klniuqbheq"></a>

![](/files/kxXFMMGQexgFbqh2XXtZ)

A interface de acesso ao Trust permite ao operador escolher o tipo de inconformidade a ser tratada, dentro dos grupos específicos a que tem acesso. Os principais recursos dessa interface incluem:

* **Análises das inconformidades em ordem de prioridade**, que incluem:
  * **Análise de digitais**: comparação de impressões digitais para verificar se pertencem à mesma pessoa.<br>
  * **Análise de faces**: comparação de imagens faciais quando há incerteza na correspondência automática.<br>
  * **Análise biográfica**: avaliação de conflitos entre dados como nome, data de nascimento e filiação.<br>
  * **Aprovação pendente**: casos já tratados que aguardam confirmação final por um segundo operador.<br>
* **Painel de análises atribuídas:** cada operador possui um painel com as análises que já estão atribuídas a ele, ou seja, aquelas em que ele iniciou a análise biográfica, mas ainda não concluiu o tratamento. Esse painel permite retomar casos pendentes e garante que uma mesma inconformidade não seja tratada por mais de um operador.

<figure><img src="/files/d1GIjplhOIo5HPBcaGT2" alt=""><figcaption></figcaption></figure>

### 3.3. Análises Biométricas <a href="#id-7mf9x63vnxo" id="id-7mf9x63vnxo"></a>

A etapa de análise biométrica envolve a verificação de similaridade entre registros faciais e digitais detectados pelo sistema como possíveis correspondências. As análises são separadas em duas interfaces distintas: **análise de faces** e **análise de digitais**. Cada uma possui fluxos próprios e critérios específicos de avaliação.

### 3.3.1. Análise de faces <a href="#h8kqikspfd7w" id="h8kqikspfd7w"></a>

#### Critério de exibição na análise de faces (limiar de incerteza) <a href="#p7igs1i7mdp6" id="p7igs1i7mdp6"></a>

Um caso é direcionado para tratamento manual sempre que o score de similaridade facial entre duas imagens se encontra em uma faixa de incerteza, ou seja, dentro de um intervalo em que o sistema não tem confiança suficiente para tomar uma decisão automática. A lógica é a de evitar falsos positivos ou negativos em casos de baixa ou média confiabilidade.

#### Modal de comparação biométrica facial <a href="#jusiuvo1ripf" id="jusiuvo1ripf"></a>

Ao clicar no botão **Análise de faces** da tela inicial do Trust o sistema seleciona automaticamente o primeiro caso da fila e abre um modal de comparação, que exibe lado a lado as imagens faciais dos dois perfis que estão sendo comparados, sem no entanto indicar a qual perfil pertencem.

![](/files/c4TIl7EXuGGNMNu4nqmW)

**Funcionamento da interface**

A interface da análise facial apresenta os pares de imagens faciais a serem comparados. Após a análise, o operador deve indicar a sua decisão por meio dos três botões na parte inferior da tela, ou através das teclas de atalho correspondentes:

* **Faces diferentes - vermelho (tecla A)**<br>
* **Não consigo decidir - cinza (tecla S)**<br>
* **Mesmas faces - verde (tecla D)**

A decisão do operador é registrada e utilizada nas etapas seguintes do fluxo.

Uma vez indicada a decisão, o caso será finalizado e o próximo caso será apresentado automaticamente na tela do operador. Se não houver mais casos a serem tratados, a mensagem correspondente será apresentada na tela.

Para voltar à tela inicial basta clicar no logotipo do Trust no canto superior esquerdo ou em **Análise**. O caso que eventualmente estiver aberto sem uma decisão retornará à fila de análise para ser encaminhada a outro operador.

**Quando marcar como inconclusivo**

A opção de marcar a análise como inconclusiva deve ser usada quando o operador não conseguir determinar com segurança se as imagens faciais correspondem à mesma pessoa, mesmo após observação detalhada no modal de comparação. Esse botão serve para sinalizar que a decisão não pode ser tomada com base nos dados apresentados.

### 3.3.2. Análise de Digitais <a href="#e1i0a8hsd00q" id="e1i0a8hsd00q"></a>

#### Modal de comparação biométrica de digitais <a href="#lzg29oofwbw7" id="lzg29oofwbw7"></a>

Ao clicar no botão **Análise** **de digitais** da tela inicial, o sistema seleciona automaticamente o primeiro caso da fila e abre um modal de comparação, que exibe lado a lado as imagens das impressões digitais dos dois perfis que estão sendo comparados, sem no entanto indicar a qual perfil pertencem.

<figure><img src="/files/JuI9JYOqKiiYmZqWUCQ4" alt=""><figcaption></figcaption></figure>

**Funcionamento da interface**

A interface da análise de digitais apresenta os pares de imagens de impressões digitais a serem comparados. Após a análise, o operador deve indicar a sua decisão por meio dos três botões na parte inferior da tela, ou através das teclas de atalho correspondentes:

* **Digitais diferentes - vermelho (tecla A)**<br>
* **Não consigo decidir - cinza (tecla S)**<br>
* **Mesmas digitais - verde (tecla D)**

A decisão do operador é registrada e utilizada nas etapas seguintes do fluxo.

Uma vez indicada a decisão, o caso será finalizado e o próximo caso será apresentado automaticamente na tela do operador. Se não houver mais casos a serem tratados, a mensagem correspondente será apresentada na tela.

Para voltar à tela inicial basta clicar no logotipo do Trust no canto superior esquerdo ou em **Análise**. O caso que eventualmente estiver aberto sem uma decisão retornará à fila de análise para ser encaminhada a outro operador.

#### Regras de fusão biométrica <a href="#id-3mnb3pedq7z4" id="id-3mnb3pedq7z4"></a>

O sistema considera múltiplos fatores para determinar se as biometrias pertencem à mesma pessoa:

* **Limiar de similaridade**: scores de comparação entre digitais.<br>
* **Qualidade das biometrias**: biometrias com baixa qualidade podem dificultar a decisão e justificar um status inconclusivo.<br>
* **Quantidade de dedos com “hit”**: o número de dedos coincidentes é um fator relevante para a tomada de decisão. A concordância em poucos dedos pode ser suficiente ou não, dependendo da qualidade e do score.

Importante ressaltar que nem sempre os 10 dedos estarão disponíveis para análise no Trust. O sistema só envia para verificação manual os pares de digitais cuja comparação automática não foi conclusiva. Ou seja, dedos com boa qualidade e score muito alto (indicando forte similaridade) ou muito baixo (indicando forte diferença) são automaticamente classificados pelo sistema, sem necessidade de revisão manual. Por isso, o operador pode visualizar apenas alguns pares, como 6 ou 7 dedos, dependendo da qualidade das biometrias e do desempenho da comparação inicial.

**Quando marcar como inconclusivo**

Assim como na análise facial, o botão de inconclusivo deve ser usado quando, após a observação das digitais no modal de comparação, o operador não consegue afirmar com segurança se as impressões digitais são da mesma pessoa ou não.

### 3.4. Análise Biográfica <a href="#w0g1u3krvp8o" id="w0g1u3krvp8o"></a>

Após a etapa de análise biométrica (facial e/ou das digitais), o sistema pode encaminhar o perfil para a etapa de análise biográfica, dependendo das características da inconformidade. A análise biográfica é feita com base na comparação entre os dados biográficos da transação (cadastro ou atualização) e os dados do perfil da base que está sendo comparado.

#### Como visualizar e comparar <a href="#id-2c3ipvcjorpx" id="id-2c3ipvcjorpx"></a>

**Os dados biográficos entre perfis**

A interface apresenta os dados biográficos da transação e os dados biográficos do perfil da base, permitindo que o operador compare os dois conjuntos de informações. Essa visualização busca evidenciar convergências e divergências nos dados, como nome, data de nascimento, filiação, entre outros.

![](/files/W23pmg9INvCd0yzKgbL5)

{% hint style="info" %}
Durante a análise biográfica, também é possível visualizar as biometrias (facial e digitais) dos perfis envolvidos. Isso auxilia o usuário a tomar uma decisão mais embasada, caso haja necessidade de revisar a correspondência biométrica já analisada anteriormente.
{% endhint %}

#### Tratamento da inconformidade <a href="#g7mxbmofpjd5" id="g7mxbmofpjd5"></a>

Na **Análise Biográfica** é apresentado o tipo de transação porque cada tipo de transação tem situações específicas que geram inconformidades:

* Cadastro - A inconformidade é gerada quando os perfis do grupo apresentam biometrias iguais e chaves biográficas diferentes.
* Atualização - A inconformidade é gerada quando os perfis do grupo apresentam biometrias diferentes ou inconclusivas e chaves biográficas iguais.

Cada perfil listado na tela possui um cartão com ações específicas, conforme o tipo de correspondência biométrica:

* Para perfis com mesmas biometrias, estão disponíveis as seguintes ações:<br>
  * **Decisão de base**: permite rejeitar ou unificar o perfil com a transação entrante.<br>
  * **Comparar biometrias:** abre um modal com a comparação detalhada das biometrias.<br>
  * **Ver perfil no Intelligence:** redireciona para o perfil no Intelligence.

![](/files/ZV0BZ18wLVkqTSYX2z4B)

{% hint style="info" %}
Clique "Ver perfil no Intelligence" para conferir todos os dados de cadastro de um indivíduo em específico.
{% endhint %}

* Para perfis com biometrias inconclusivas, as ações disponíveis são:<br>
  * **Decisão de base:** permite rejeitar, unificar ou manter separadamente (utilizado em casos de falso positivo).<br>
  * **Comparar biometrias:** abre um modal com a comparação detalhada das biometrias.<br>
  * **Ver perfil no Intelligence:** redireciona para o perfil no Intelligence.<br>

No modal de comparação biométrica, são apresentados os resultados de similaridade entre as biometrias da transação entrante e do perfil selecionado, com o seguinte código de cores:

* **Verde:** biometrias iguais

![](/files/orvZTISdoqWG3ko7YcwF)

* **Vermelho**: biometrias diferentes

![](/files/AeqzYLckLosg9F5IpHGw)

* **Cinza**: resultado inconclusivo<br>

É possível selecionar uma biometria específica clicando diretamente sobre ela ou utilizando o dropdown de seleção de índice. As biometrias da transação entrante são exibidas à esquerda e as do perfil selecionado à direita. A partir da versão 1.1.0 do Trust, essas posições foram invertidas: a biometria do perfil selecionado passou a ser exibida à esquerda, enquanto a da transação entrante passou a aparecer à direita.

Após realizar a comparação biométrica, o operador será direcionado para uma tela onde os dados biográficos dos perfis envolvidos serão exibidos destacando os dados divergentes. Esses dados devem ser analisados para que sejam mantidos os valores corretos no perfil final.

Na tela de confirmação, são apresentados:

![](/files/3Fi60XuIxTwClnH3YX17)

* **Perfis que serão unificados**<br>
* **Perfis que serão rejeitados**<br>
* **Dados biográficos selecionados para o perfil resultante**<br>
* **Campo para comentário com a justificativa das decisões**<br>

Caso existam transações em fila de espera pelo grupo em análise, elas são exibidas na seção Transações bloqueadas. Após o tratamento, se não houver mais grupos bloqueando, a transação é automaticamente reprocessada.

#### Ações disponíveis por tipo de análise (cadastro ou atualização) <a href="#hiasst98mfp0" id="hiasst98mfp0"></a>

As ações disponíveis na tela de análise biográfica variam conforme o tipo de transação que gerou a inconformidade:

* **Para transações de cadastro**:<br>
  * **Rejeitar**<br>
  * **Unificar**<br>
* **Para transações de atualização**:<br>
  * **Rejeitar**<br>
  * **Unificar** (quando as biometrias são coincidentes)
  * **Manter separadamente** (quando a biometria é inconclusiva)

{% hint style="info" %}
Essas ações devem ser escolhidas com base nas informações biográficas e biométricas disponíveis na tela.
{% endhint %}

#### Escolha das chaves que vão compor o perfil final <a href="#id-96bq40lcwq5g" id="id-96bq40lcwq5g"></a>

O usuário pode selecionar, caso haja divergência, quais chaves devem prevalecer no perfil final. Para cada chave divergente, é possível escolher se o valor que será mantido é o da transação ou o do perfil da base. Essa funcionalidade é especialmente importante em casos de unificação, onde o sistema permite que o operador componha o perfil unificado com os dados mais corretos ou completos.

#### Regras para habilitar o botão "Confirmar tratamento" <a href="#pxmhw7v2hsrg" id="pxmhw7v2hsrg"></a>

O botão **"Confirmar tratamento"** somente é habilitado quando todas as decisões obrigatórias foram tomadas:

* A decisão sobre a relação entre os perfis (unificar, manter separado ou rejeitar) foi registrada.<br>
* Todos os campos divergentes tiveram um valor escolhido pelo operador (transação ou base).<br>
* Foi inserida uma **justificativa textual**, explicando a decisão tomada.

![](/files/u572hCId0CKQNhWlNY5n)

Somente após o cumprimento desses requisitos o sistema permite concluir a análise e registrar o tratamento da inconformidade.

**Ações disponíveis conforme o tipo de transação**

**Para transações de cadastro**

* **Rejeitar**: utilizada quando há uma tentativa de fraude ou quando a transação não deve ser inserida na base.<br>
* **Unificar**: utilizada quando a transação corresponde a um perfil já existente na base e os dados devem ser consolidados.<br>
* **Manter separadamente**: utilizada quando a biometria foi marcada como inconclusiva e o operador identificou que na verdade são biometrias diferentes.

**Para transações de atualização**

* **Rejeitar**: utilizada quando os dados enviados para atualização não pertencem ao perfil em questão, ou configuram tentativa de fraude.
* **Unificar**: utilizada em casos de biometria inconclusiva, quando a decisão é consolidar os dados da transação ao perfil existente.<br>

  <figure><img src="/files/YUHV2Ol6raav2oeqWIkX" alt=""><figcaption></figcaption></figure>

#### Quando usar cada decisão <a href="#c0q5vlmgmuql" id="c0q5vlmgmuql"></a>

A escolha da ação depende da análise conjunta das biometrias (facial e digitais) e dos dados biográficos. Por exemplo:

* Se a biometria confirma que os perfis são da mesma pessoa e os dados biográficos são compatíveis, a ação indicada é **unificar**.<br>
* Quando biometrias e dados biográficos divergem, o sistema recomenda **manter** (em cadastros com chaves diferentes) ou **rejeitar** (em atualizações com chave igual).<br>
* Quando não há certeza suficiente, especialmente em casos de biometria inconclusiva, pode-se optar por **manter separadamente** (para cadastro) ou **unificar** com ressalvas (para atualização), conforme o contexto.<br>

A decisão deve sempre ser **fundamentada** com base nas evidências apresentadas pela interface.

#### Como inserir justificativa <a href="#id-2wb7n0f5dv06" id="id-2wb7n0f5dv06"></a>

Antes de confirmar o tratamento, o operador deve **preencher um campo de justificativa**, explicando os motivos da decisão. Essa justificativa serve como base de auditoria e deve apresentar, de forma objetiva, os elementos que sustentam a conclusão tomada (ex: divergência de dados biográficos, correspondência biométrica, evidência de tentativa de fraude etc.).

![](/files/TG89by4NM9DvdajEs6E3)

#### O que acontece ao confirmar o tratamento <a href="#w9zi7bff25p1" id="w9zi7bff25p1"></a>

Ao clicar em **"Confirmar tratamento"**, o sistema:

* **Atualiza o status da inconformidade** para resolvida.<br>
* **Registra a decisão e a justificativa**.<br>
* **Executa as ações correspondentes à decisão**:<br>
  * Se for **unificação**, os dados da transação são consolidados ao perfil existente.<br>
  * Se for **rejeição**, a transação é descartada e registrada como inválida.<br>
  * Se for **manter separadamente** ou **manter**, os perfis continuam distintos e não são mesclados.<br>

Além disso, o sistema pode acionar mecanismos automáticos, como o **reprocessamento de transações anteriormente bloqueadas**, caso a resolução da inconformidade permita a continuidade de fluxos dependentes.

### 3.6. Validação por Outras Organizações <a href="#id-7y66nibvew6k" id="id-7y66nibvew6k"></a>

A **validação por outras organizações** é necessária quando há a presença de **múltiplas organizações** responsáveis por tratar e validar as inconformidades de perfis. Em cenários onde um perfil pertence a uma outra organização há a necessidade de uma análise de uma instância superior para confirmar a veracidade de uma transação. A pendência gerada é direcionada para uma organização superior às envolvidas para uma avaliação final. Essa funcionalidade é configurável, podendo ou não ser habilitada no ambiente do cliente.

#### Quando a validação é necessária <a href="#au4taswaamvq" id="au4taswaamvq"></a>

A validação por outras organizações ocorre nos seguintes casos:

* Quando uma **inconformidade** é detectada em um perfil que pertence a uma outra organização, o sistema aciona a necessidade de validação por parte das outras organizações envolvidas.<br>
* Quando a análise de uma transação exige **confirmação externa** ou **revisão** de outra organização, especialmente em situações que envolvem decisões com altos riscos ou em que há **divergências** nas biometrias ou nos dados biográficos.<br>

#### Como a pendência é gerada e alocada <a href="#yeyroogq9gf4" id="yeyroogq9gf4"></a>

A **pendência** de validação é gerada automaticamente pelo sistema, que, ao identificar que uma inconformidade deve ser verificada por outra organização, **cria uma pendência** associada à transação em questão. A alocação de uma pendência ocorre de acordo com o fluxo de trabalho configurado para cada organização, e o sistema irá **enviar a pendência para a organização responsável** ou para o operador que deve realizar a validação.

* **Pendência alocada**: Assim que a pendência é criada, ela é **alocada ao operador ou à organização** que deve validá-la.<br>

#### O que o primeiro operador que tratou enxerga na interface <a href="#hfb6cpspe6w0" id="hfb6cpspe6w0"></a>

Quando o **primeiro operador** trata a inconformidade, ele poderá ver na interface uma indicação de que **outras organizações precisam validar** a transação ou inconformidade. A interface oferece um **status de pendência**, com as informações sobre qual organização ou operador deve concluir a validação.

* O operador poderá também ver o **detalhamento** da inconformidade, com as evidências e dados associados à transação que precisa ser validada.<br>
* Caso o operador não tenha permissão para finalizar o processo, ele verá a opção de **encaminhar a pendência** para a organização responsável para conclusão da validação.<br>

#### O que acontece se a pendência for aprovada ou rejeitada <a href="#mip98pm5i1dr" id="mip98pm5i1dr"></a>

Dependendo da decisão tomada pela organização que recebeu a pendência, o seguinte ocorre:

* **Se a pendência for aprovada**: O sistema **finaliza o processo** e a transação é tratada conforme as decisões anteriores, como **unificação** ou **manutenção separada**. O status da inconformidade é atualizado para resolvido, e o perfil da base é atualizado conforme o tratamento aprovado.<br>
* **Se a pendência for rejeitada**: Caso a outra organização não valide a transação, o grupo voltará para a etapa de análise biográfica e será alocado a um novo investigador.

### 3.7. Finalização do Processo <a href="#id-9zfdovksuqcj" id="id-9zfdovksuqcj"></a>

A **finalização do processo** de tratamento de inconformidades ocorre quando todas as etapas de análise e decisão são concluídas, resultando na **atualização da base de dados** e no possível reprocessamento de transações. Este processo é crítico para garantir que as informações da base estejam sempre atualizadas e corretas, refletindo todas as decisões de tratamento tomadas durante a análise.

#### Atualização automática da base <a href="#hxryn9wqwuok" id="hxryn9wqwuok"></a>

Após a conclusão de todos os tratamentos de inconformidade, o sistema realiza a **atualização automática da base de dados**. Isso inclui:

* **Inclusão ou atualização de perfis**: Quando uma inconformidade é resolvida, os dados biográficos e biométricos dos perfis afetados são atualizados na base, conforme as decisões tomadas (unificação, manutenção separada, rejeição, etc.).<br>
* **Exclusão de transações**: Caso uma transação tenha sido rejeitada, ela é excluída da base de dados ou marcada como inválida, conforme a política da organização.<br>

O processo de atualização automática é realizado sem a necessidade de intervenção manual, garantindo agilidade e precisão nas modificações feitas na base de dados.

#### Reprocessamento de transações anteriormente bloqueadas <a href="#e8c1ml26i3e7" id="e8c1ml26i3e7"></a>

Em alguns casos, as transações podem ter sido inicialmente **bloqueadas** devido a inconformidades não resolvidas. Após o tratamento dessas inconformidades e a tomada de decisão, o sistema realiza o **reprocessamento** dessas transações bloqueadas.

* **Reavaliação das transações**: Transações que foram bloqueadas podem ser reavaliadas com base nas novas informações ou decisões de tratamento tomadas. Se a inconformidade foi resolvida e a transação agora for considerada válida, ela será processada e integrada à base de dados.<br>
* **Impacto nas transações bloqueadas**: O reprocessamento pode gerar a atualização dos perfis envolvidos, dependendo da decisão tomada durante a análise (por exemplo, unificação de perfis ou separação de dados).<br>

#### Possibilidade de gerar novas inconformidades a partir da resolução <a href="#mq95ajv2pwm9" id="mq95ajv2pwm9"></a>

Após a resolução de uma inconformidade, há a **possibilidade de novas inconformidades serem geradas**. Isso pode ocorrer nos seguintes casos:

* **Mudança de status do perfil**: A resolução de uma inconformidade pode levar a **novas verificações** de dados que, por sua vez, podem gerar novas inconformidades. Por exemplo, ao unificar dois perfis, podem surgir divergências adicionais entre os dados biográficos ou biométricos, resultando em uma nova inconformidade.<br>
* **Reprocessamento de transações anteriores**: Como parte do reprocessamento de transações bloqueadas, podem ser detectadas novas inconformidades em perfis ou transações que antes não apresentavam problemas evidentes.<br>
* **Alterações nos critérios de validação**: A atualização da base e o reprocessamento de transações também podem levar a uma **reavaliação dos critérios de similaridade** e de fusão, o que pode gerar novas inconformidades quando o sistema detecta diferenças adicionais.<br>

Esse ciclo contínuo de análise e tratamento de inconformidades garante que a base de dados esteja sempre em conformidade com os padrões de qualidade e segurança.

### 3.8. Painel do Administrador <a href="#ql7698232m1t" id="ql7698232m1t"></a>

O **Painel do Administrador** é uma interface dedicada ao acompanhamento e gerenciamento das inconformidades registradas no sistema. Ele permite a realização de buscas específicas, a visualização detalhada de cada inconformidade, além da priorização e, em alguns casos, o próprio tratamento diretamente pela interface.

#### Busca de Inconformidades (Busca de transação) <a href="#id-3hrun3gu94i9" id="id-3hrun3gu94i9"></a>

No painel, é possível realizar buscas por inconformidades a partir de **chaves específicas**, como CPF, RG, título de eleitor, entre outras. A busca retorna uma **lista de inconformidades** que correspondem à chave informada. Ao clicar em uma das inconformidades listadas, o sistema exibe sua **página de detalhes**.

![](/files/Mu9ZiO7yHMPSXItIHA0B)

![](/files/Sa8zR9H3T5RfmTi1VJag)

#### Status das Inconformidades <a href="#lwm83v8n0jok" id="lwm83v8n0jok"></a>

Cada inconformidade pode estar em um dos seguintes **status**, de acordo com seu estágio no fluxo de tratamento:

* **Análise biométrica**: pendência de análise biométrica em algum grupo.<br>
* **Análise biográfica**: todas as análises biométricas foram concluídas, e há pendência de análise biográfica.<br>
* **Aprovação pendente**: a análise biográfica foi realizada e aguarda aprovação de uma organização superior.<br>
* **Em processamento**: a inconformidade está sendo processada pelo ABIS, sem necessidade de ação do usuário.<br>
* **Aceito**: a inconformidade foi resolvida e a transação foi aceita na base de dados.<br>
* **Rejeitado**: a inconformidade foi resolvida e a transação foi rejeitada.<br>
* **Erro**: ocorreu um erro ao processar a inconformidade no ABIS.<br>
* **Bloqueado**: a transação está vinculada a um grupo ainda não resolvido. É necessário tratar as inconformidades relacionadas para que a transação possa ser desbloqueada.<br>
* **Reenviado para processamento**: as inconformidades que bloqueavam a transação foram resolvidas, e ela foi reenviada ao ABIS com um novo identificador da transação.<br>

#### Detalhes da Inconformidade <a href="#id-8i9iutj7z6f5" id="id-8i9iutj7z6f5"></a>

Na **página de detalhes** de uma inconformidade, o sistema apresenta:

* O **status atual** e sua descrição.<br>
* Os **perfis envolvidos** no grupo.<br>
* As **ações disponíveis** que variam de acordo com o status.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdRJtqMWc_hP5N7KTkrKhmKM2A80C2YmncfOHWG1ZJkndX9t2Iw7J_bF1ZwNpOJ-2fgsgdayJb6dVtynU2P_utNUJ6jSg7nktCRV8q2GH1x_JcNjRkaO_ltaUGRdJH38ZG_JzCRbA?key=4PqG-0cf9otytlK0Jm0vqzlk" alt=""><figcaption></figcaption></figure>

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcnidq2Y-FdatvhqCnG2WrPjAp00ljjgOUZHO6jbaqVLktoc6eWpZiskN7zDqePKzTPCdcKoDmyM9LNCPun4uOqd1J5j4TGR05G9YrMMvEHgdWelnI2dCv1zbyvHpLpMFJUFDYF-w?key=4PqG-0cf9otytlK0Jm0vqzlk" alt=""><figcaption></figcaption></figure>

A partir da versão 1.1 do Trust, é possível encaminhar perfis que estão em análise biométrica para análise biográfica por meio da tela “Detalhes de Inconformidade”. Em seguida, pode-se realizar o tratamento da inconformidade. Nesses casos, o sistema atribui o resultado da análise biométrica como *INCONCLUSIVO*.

#### Inconformidades Bloqueadas <a href="#vb1h1vz5sckd" id="vb1h1vz5sckd"></a>

Para inconformidades nos status **Bloqueado** ou **Reenviado para processamento**, a interface não exibe diretamente os perfis conflitantes. Em vez disso, são listadas as **inconformidades que estão bloqueando a transação**, e o operador pode acessá-las clicando sobre cada item.

Ao **priorizar uma transação bloqueada**, o sistema também **prioriza automaticamente** todas as inconformidades relacionadas que estão bloqueando a transação, assegurando que elas recebam tratamento mais rapidamente.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfi7OVupCLmbWy7Vkw_vDLvPlYw9PcOYB5cd7SzJwLcYyu6mSLUXWVxjcqWx5hRkDYtxDZS3lziLewwwLIlvqr4eSPtQPh7t1gfopcVNz7cS92_CuLPDhsGEF2Z6pBZqbDNL9y6Ng?key=4PqG-0cf9otytlK0Jm0vqzlk" alt=""><figcaption></figcaption></figure>

Essa funcionalidade permite uma atuação mais eficiente da equipe administrativa, garantindo agilidade na resolução de casos críticos e maior controle sobre o fluxo de tratamento das inconformidades.

### 3.9. Relatórios

*Verificar disponibilidade no ambiente implantado.*

<figure><img src="/files/krj03RLhhVHBVmjsBReh" alt=""><figcaption></figcaption></figure>

O Trust também oferece uma ferramenta de visualização de gráficos e métricas sobre o histórico de transações e inconformidades do ambiente. Esses dados possibilitam a extração de insights sobre o tratamento de inconformidades, auxiliando supervisores e coordenadores a aprimorar a operação dos usuários do Trust.

Atualmente, o sistema disponibiliza duas categorias de relatórios:

* Transações
* Inconformidades

<figure><img src="/files/ishH5iZEykt41kA05O37" alt=""><figcaption></figcaption></figure>

Cada categoria conta com abas de dashboard que apresentam métricas e gráficos específicos.

Na categoria *Transações*, há uma única aba de dashboard:

* Geral

Já na categoria *Inconformidades*, estão disponíveis as seguintes abas de dashboard:

* Geral
* Análise Biométrica&#x20;
* Análise Biométrica - Comparação por usuário:
* Análise Biográfica
* Análise Biográfica - Comparação por usuário

#### Aplicação de filtros

<figure><img src="/files/zNKGN85VPg9994jzVyTl" alt=""><figcaption></figcaption></figure>

Todas as dashboards contam com uma série de filtros que impactam diretamente os dados utilizados no cálculo das métricas e na geração das visualizações.

Os filtros disponíveis podem variar entre as dashboards, mas alguns exemplos são:

* **Período:** define o intervalo de datas considerado nos dados.
* **Label de origem:** corresponde ao *label* da transação no GBDS.
* **Cidade de origem:** corresponde à cidade de origem da transação no GBDS.
* **Tipo de transação:** indica o tipo de operação no GBDS (cadastro ou atualização).
* **Tipo de biometria:** especifica a modalidade biométrica do dado (face ou impressão digital).
* **Usuário:** corresponde ao usuário associado aos dados filtrados.

#### Tooltips de métricas

As métricas e gráficos exibem *tooltips* ao passar o cursor do mouse sobre os elementos da dashboard. Essas *tooltips* podem fornecer descrições das métricas ou detalhar valores e informações específicas apresentadas no gráfico.

## 4. Casos de Uso Comuns

Esta seção apresenta exemplos reais ou simulados de uso da ferramenta Trust. Os exemplos ajudam a consolidar o entendimento do sistema e orientar as decisões dos usuários.

#### Perfis com mesma biometria e nomes diferentes: o que fazer? <a href="#xdf8le65iraq" id="xdf8le65iraq"></a>

O sistema pode identificar uma inconformidade entre dois perfis com **biometria considerada idêntica**, mas **dados biográficos divergentes**, como diferenças no nome. Este é o caso típico de mudança de nome após o casamento.

O analista usou o Trust para:

* Verificar a correspondência biométrica por meio do modal de comparação;<br>
* Avaliar as divergências biográficas diretamente na tela de análise;<br>
* Consultar o histórico de transações de cada perfil no Intelligence.<br>

A análise manual identificou que a única alteração foi no nome de solteira para o nome de casada. Com base nas evidências, a decisão foi **rejeitar o perfil de referência e aceitar o perfil entrante**.

#### Um perfil com biometria igual, mas dados biográficos divergentes: o que priorizar? <a href="#id-2dpttlub5j2f" id="id-2dpttlub5j2f"></a>

Em análises biográficas de cadastro com biometrias idênticas, o Trust permite comparar os dados biográficos entre os perfis do grupo. Quando há divergências, o analista deve escolher, campo a campo, qual informação irá compor o perfil resultante.

Esse processo ocorre após a seleção de uma ação de base (como "unificar"), e antes da confirmação do tratamento. O Trust exibe lado a lado os biográficos divergentes, e o analista seleciona as informações corretas com base nos dados disponíveis e no histórico de transações acessível via Intelligence.

Obs: A funcionalidade de seleção de campos depende da adequada integração com o sistema onde os dados biográficos estão armazenados. Caso não seja possível a atualização dos dados biográficos, a seleção de campos estará desabilitada.

#### Suspeita de fraude <a href="#wwmdiepqk05l" id="wwmdiepqk05l"></a>

O Trust foi projetado para tratar casos de suspeita de fraude. Um exemplo envolve um indivíduo tentando obter um novo documento com informações biográficas diferentes. O sistema detectou a coincidência biométrica e gerou a inconformidade para análise.

A partir das evidências, como o histórico de transações e a origem dos cadastros, o analista pode rejeitar o perfil suspeito, justificando sua decisão na tela de confirmação. Se o grupo estiver bloqueando alguma transação, esta será reprocessada automaticamente após a finalização do tratamento.

## 5. FAQ

Esta seção reúne dúvidas frequentes. O objetivo é ajudar o usuário a tomar decisões mais seguras, evitar erros comuns e entender o impacto das suas ações no sistema.

### 1) O que acontece se eu rejeitar o perfil errado? <a href="#exv87f1qeo8u" id="exv87f1qeo8u"></a>

Ao rejeitar uma transação ou marcar um perfil como inválido, o sistema registra essa decisão e pode bloquear definitivamente aquele registro. Se for uma rejeição incorreta, a consequência pode ser a perda de um dado legítimo ou a necessidade de intervenção por parte de outro órgão com permissão superior.

{% hint style="info" %}
Antes de rejeitar, verifique com atenção todos os dados biográficos, históricos e biometrias disponíveis. Quando houver dúvida, utilize o recurso de pendência para revisão por outro responsável.
{% endhint %}

### 2) Posso desfazer uma decisão? <a href="#pwpfo6ta8vu4" id="pwpfo6ta8vu4"></a>

Não. Uma vez que a decisão é registrada e confirmada, ela **não pode ser desfeita diretamente** pelo usuário. Isso garante rastreabilidade e segurança nas ações.

No entanto, dependendo do fluxo da organização, um perfil impactado pode ser tratado novamente dentro do processo de análise de pendências.

### 3) Como interpretar um match inconclusivo? <a href="#id-91uag364v8qc" id="id-91uag364v8qc"></a>

Um match é considerado inconclusivo quando o score biométrico está em uma zona intermediária, ou seja, nem alto o suficiente para afirmar com segurança que os perfis são da mesma pessoa, nem baixo o bastante para descartar relação.

Nesses casos:

* Verifique se a imagem (facial ou digital) tem qualidade suficiente.<br>
* Analise os dados biográficos em paralelo.<br>
* Utilize os recursos de zoom e comparação lado a lado no modal.<br>
* Se a incerteza persistir, documente a dúvida na justificativa e opte por **rejeitar o perfil entrante**. Desta forma se evita uma atualização indevida e se permite que as biometrias sejam coletadas novamente ocasionando eventualmente um match mais assertivo.<br>

### 4) Como lidar com perfis que parecem legítimos, mas não coincidem? <a href="#nmlk1m9ufwzj" id="nmlk1m9ufwzj"></a>

Esses casos são comuns e podem envolver variações legítimas ou tentativas de fraude. Analise com atenção o histórico dos perfis, as biometrias e os dados principais. Se houver evidências claras de que se trata da mesma pessoa, unifique os registros com os dados corretos.

### 5) Quais são as boas práticas para investigar e documentar uma decisão? <a href="#id-73lg12c3vajk" id="id-73lg12c3vajk"></a>

Avalie sempre o conjunto de informações: dados biográficos, histórico e biometrias. Dê atenção especial aos campos divergentes, como nome, documentos e data de nascimento. Use os filtros para entender o contexto da transação e, se necessário, envolva outras organizações via pendência. Ao registrar a decisão, seja claro e objetivo na justificativa — isso ajuda na rastreabilidade e em auditorias futuras. Priorize a precisão, mesmo em casos aparentemente simples.


# FastLine

## Introdução

O **GBS FastLine** é uma aplicação de software para autenticação em filas de espera. Ele usa identificação facial de forma rápida e precisa para fazer com que as pessoas sejam identificadas de forma mais ágil do que pelo processo de checagem de documentos realizado por um operador humano. Usando o FastLine, é possível reconhecer, identificar e registrar indivíduos em uma fila de forma automática.

Esse manual está atualizado para a versão 1.5.1 do FastLine.

### Versões da Aplicação

O GBS FastLine está disponível em duas versões:

#### Desktop Standalone

Essa versão é para uso completo em um ambiente desktop, sem a necessidade de ferramentas ou requisitos externos.

{% hint style="warning" %}
O GBS FastLine foi projetado como um serviço, e sua versão desktop é recomendada para procedimentos de teste, validação e prova de conceito, ou para casos triviais de uso.
{% endhint %}

{% hint style="info" %}
Nesse documento essa versão será referida somente como **Desktop**.
{% endhint %}

#### Services

Nessa versão, o GBS FastLine é fornecido como um serviço e deve ser controlado por uma aplicação externa através de sua API. Esta versão também fornece meios para supervisão externa.

### Licença de Software

O GBS FastLine requer uma licença de software para funcionar. A licença não está ligada a nenhum endereço de hardware (como MAC Address) e não expira. A licença deve ser instalada em: `C:\ProgramData\Griaule`, de acordo com as instruções presentes no manual de licença.

{% hint style="info" %}
Se for necessária mais assistência, entre em contato com o suporte da Griaule.
{% endhint %}

### Instalação e Configuração Inicial do FastLine

O instalador do FastLine tem uma aba de configuração, *GBDS Settings*:

![GBS Fast Line Installer](/files/eZr8InAA9KdkGfnTg4Mo)

#### Configurações do GBDS

**GBDS URL Address**

URL de endereço do servidor GBDS. Exemplo: `http://192.168.0.1:8085`.

**Username and Password**

Credenciais usadas pelo FastLine para autenticação no GBDS.

## Interface do Usuário

### Iniciando a Aplicação

Ao iniciar o FastLine, a *Tela Inicial* será exibida:

![GBS Fast Line Main Page](/files/zaPu19B4Voo9OLfnje8v)

### Adicionando Perfis ao Banco de Dados

Essa seção mostra como popular o banco de dados local.

#### Recuperando do GBDS

O formulário *Load base from GBDS*, mostrado abaixo, pode ser usado para recuperar perfis do GBDS. Os perfis podem ser filtrados pelas chaves biográficas. Se o filtro for deixado vazio, todos os perfis disponíveis serão importados.

![GBDS filter](/files/M7U1ujH38T9IYWRZcVy3)

#### Cadastro Local

O botão **Capturar Foto** permite ao usuário cadastrar uma nova pessoa no banco de dados local. Ao selecionar essa opção, a janela de captura de imagem irá abrir:

![GBS FastLine Capture Image Screen](/files/gPwP5MeofRr0j22xpRwY)

A versão *Desktop* permite o cadastro por captura de imagens ao vivo, ou por importação de arquivos de imagem já salvos.

A versão *Services* permite cadastrar por importação de arquivos de imagem, mas não por captura ao vivo. Essa versão é focada em usos externos, para os quais é esperado um banco de dados já populado com perfis.

### Visualizando Perfis

A lista de perfis é exibida na barra lateral, e mostra todos os perfis disponíveis para detecção. O número de perfis é mostrado no topo da lista.

![Local database](/files/jOiRIC6qqWfZTH5oV6Zv)

O tamanho da lista exibida pode ser modificado nas configurações da aplicação. Passar o cursor do mouse sobre um perfil mostra sua foto. Perfis podem ser selecionados ou desselecionados ao clicar neles.

### Deletando Perfis

Para deletar um ou mais perfis, selecione-os clicando na lista de perfis e pressione o botão **Delete**.

{% hint style="warning" %}
Uma vez que um perfil for deletado, ele não poderá ser recuperado.
{% endhint %}

### Configurações da Aplicação

Para configurar a aplicação, clique em **Configurações** na página inicial:

![GBS FastLine Settings Screen](/files/XzN1m1wjpfLwLudKdsT5)

Nessa tela, o usuário pode configurar o funcionamento da detecção, bem como a câmera que será usada.

## Fluxo de Trabalho Padrão

O fluxo de trabalho padrão para uso do FastLine é o seguinte:

1. Realizar o login
2. Preencher o banco de dados
3. Começar a detecção
4. Finalizar a detecção
5. Verificar os resultados
6. Exportar o PDF com os resultados.

## Detecção

### Tela de Detecção

A *Tela de Detecção* é o núcleo do GBS FastLine. Nessa tela, o usuário poderá visualizar as imagens capturadas pela câmera, bem como as pessoas já identificadas e não identificadas.

![GBS FastLine Detection Screen](/files/aXYpqXo3wSGXYnKPDVxR)

#### Realizando Detecções

Detecções podem ser iniciadas através da interface da versão *Desktop*, ou através da API, na versão de *Services*. Uma vez iniciada, a aplicação começará o reconhecimento através da câmera configurada. Cada vez que um quadro da imagem ao vivo coincidir com um perfil do banco de dados, o evento será registrado e uma notificação podrá ser enviada (dependendo das configurações da aplicação).

Cada perfil pode ser reconhecido somente uma vez: Quando um perfil é reconhecido, ele é removido da *lista de observação*.

É possível detectar mais que uma face de uma vez, reduzir a área de detecção da câmera, especificar outras resoluções de câmera, alternar entre câmeras, mudar o limiar de identificação, e outros recursos, através das configurações da aplicação.

Detecções são realizadas em *sessões de detecção*, um conceito discutido abaixo.

#### Sessão de Detecção

Todo processo de detecção deve ocorrer dentro de uma Sessão de Detecção, essas sessões podem ser criadas pelo usuário através da interface ou da API. Uma vez criadas, as sessões podem ser iniciadas, pausadas, retomadas e finalizadas. Enquanto não finalizadas, as sessões podem ter as configurações e dados alterados. Uma vez finalizada, a sessão de gera um relatório de detecção que não pode mais ser alterado.

Uma *Sessão de Detecção* pode ser vista como um relatório que está sendo escrito. Quando completo, se torna um relatório de detecção imutável, garantindo a consistência dos dados.

Cada sessão de detecção tem seu próprio *UUID* (Identificador Único Universal, em inglês, *Universal Unique Identifier*), chamado **SGUID** (Identificador Único Global de Sessão, do inglês, *Session Global Unique Identifier*)

### Lista de Identificados

A *Lista de Identificados* mostra as pessoas que casaram com as pessoas cadastradas desde o início da sessão:

![GBS FastLine Detected People List](/files/HsQEQHLhzKR1JRGkXd70)

### Lista de Não Identificados

A *Lista de Não Identificados* mostra as pessoas que não casaram com as pessoas cadastradas desde o início da sessão:

![GBS FastLine Unidentified People List](/files/03RALbigpe6wLAlkNiU6)

### Relatório de Resultados

O usuário pode ver o status da sessão na *Tela de Relatório*:

![GBS FastLine Report Screen](/files/ZHibboasQI4rWIi2pbm1)

Uma vez que a sessão de detecção termina, a lista de detecção se torna um relatório imutável. O relatório é automaticamente salvo em um arquivo PDF ou JSON. O formato do relatório e a localização onde é salvo são determinados nas configurações da aplicação. Na versão *Desktop*, a aplicação pode ser configurada para automaticamente mostrar o relatório quando a sessão é finalizada.

![Export as PDF Button](/files/183XZmh36cTg0RbdQlN7)

#### Gerando Relatório em Execução

Você pode gerar um relatório enquanto o FastLine está em execução. Este relatório parcial só está disponível se o parâmetro de configuração `savePdfRunning` estiver definido como `true` no arquivo `config.properties`. Quando este parâmetro for `true`, um botão chamado Exportar como PDF aparecerá na tela de detecção. Você pode clicar no botão para gerar o relatório.

![Export as PDF Button](/files/qjybuxNPQlQy0GFVZboM)

## Notificação Externa

Quando o FastLine detecta uma face, ele exibirá a imagem da face adquirida e da face de referência. Outras informações, como o nome e a pontuação da pessoa também são exibidas. As informações de casamento também podem ser enviadas para um determinado URL por meio da configuração `desktopStandalone.notifyUrl`.

Para modificar a configuração, vá para a pasta FastLine, acesse o arquivo `conf/config.properties` e altere o parâmetro `desktopStandalone.notifyUrl` para a URL que será notificada.

Após o FastLine realizar um casamento, ele exibirá as informações na interface e notificará a URL configurada com o seguinte JSON:

```json
{
	"id": "FastLine001",
	"status": "MATCH",
	"matchSummary": {
		"referencePerson": {
			"template": "BYTEARRAY",
			"tguid": "29D99G74-BF97-4714-B78E-1A3A49DDF782",
			"name": "John Doe",
			"document": "88418861092",
			"key": "CPF",
			"profileImageByteArray": "BYTEARRAY"
		},
		"score": 95.29505,
		"timestamp": "2022-08-08_08.08.08_BRT",
		"queryImage": "BYTEARRAY"
	}
}
```

{% hint style="info" %}
Note que os valores de `profileImageByteArray`, `template` e `queryImage` serão bytearrays com formato de base64.
{% endhint %}

Os campos JSON são:

* id: ID do FastLine, definido pela configuração `desktopStandalone.notifyId`.
* status: Indique se houve casamento ou não. Ele pode retornar `MATCH` ou `NOT_MATCH`. Quando retornar o valor `NOT_MATCH`, o JSON não terá um `matchSummary`.
* template: ByteArray do template de imagem no GBDS.
* tguid: ID único da transação no GBDS.
* name: Nome da pessoa. Se nenhuma informação biográfica estiver disponível, este campo pode ficar em branco.
* document: valor da chave definida no campo `key`.
* key: Chave da pessoa no GBDS.
* profileImageByteArray: ByteArray da imagem no GBDS.
* score: Pontuação do casamento.
* timestamp: Timestamp do casamento.
* queryImage: ByteArray da imagem capturada pelo FastLine.


# FastLine Report Server

## Introdução

FastLine Report Server é uma aplicação Web que monitora muitos aplicativos FastLine e seus resultados. Ele mostra se a imagem adquirida casou com alguém no banco de dados, se não casou e qual câmera obteve a imagem.

## Instalação

Para instalar, baixe o arquivo `.rpm` e execute com o seguinte comando:

```sh
rpm -ivh report-server-<versão>.rpm
```

{% hint style="info" %}
Lembre-se de substituir `<versão>` pela versão correta que você baixou.
{% endhint %}

## Configuração

Para configurar o FastLine Report Server, abra o arquivo `config.properties` na pasta `/var/lib/griaule/reportserver`. Você pode ver um exemplo na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuração).

No arquivo de configuração, altere os parâmetros `reportserver.ip` e `reportserver.port` para que correspondam ao seu ambiente. Após concluir as alterações, execute o script `setup.sh` na mesma pasta.

```sh
./setup.sh
```

## Acesso

Você pode acessar o Report Server a partir do link:

```html
http://<IP>:<PORT>/report
```

{% hint style="success" %}
IP e PORT são os mesmos configurados no arquivo `config.properties`.
{% endhint %}

Ao entrar no site, a seguinte tela será exibida:

![](/files/xpAL6ku8kqiYmqQMlDu4)

Insira suas credenciais para fazer login.

## Tela de Relatório

Após o login, a tela do relatório será exibida.

![](/files/bDxCFMRgY6jXqfw0nrUP)

Nesta tela, você pode ver os relatórios gerados por todas as instâncias do FastLine e câmeras configuradas para notificar o servidor.

Observe que `teste` é o nome da câmera. As imagens destacadas em verde são as imagens que casaram e as imagens destacadas em vermelho são as que não houve casamento.

O FastLine Report Server mostrará uma chave (key) e um biográfico abaixo das imagens casadas. A chave e o biográfico exibidas são os registrados no banco de dados.

Nesta tela, também é possível exportar todas as faces do relatório em formato PDF.

### Filtros

Na tela do relatório, alguns filtros podem ser aplicados:

* Data.
* Status, que pode ser `Todos`, `Identificado` e `Não identificado`.
* Camera, que filtrará pelo nome de uma câmera específica.

## Exemplo do Arquivo de Configuração

```properties
server.servlet.context-path=/report
server.port=8226

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://172.16.0.66:3306/fastline?useSSL=false
jdbc.username=root
jdbc.password=CDrt8vbewA2YAubPNOLZkw==
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=false

reportserver.ip=172.16.0.70
reportserver.port=8226
```


# Griaule Mobile

## Fluxo de Primeiro Acesso

* Ao clicar em "Entrar com organização", você poderá escanear um QR Code ou inserir a URL manualmente
* Para obter o QR Code, fale com o responsável pela sua organização
  * Caso sua organização não possua uma URL, crie uma e entre em contato com o Suporte da Griaule para cadastrá-la

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKGXgqrc3MNBPpbZXVEbp%2Fuploads%2FztQaM4YNRZUYDz6KtRJO%2FWhatsApp%20Video%202025-08-14%20at%2014.51.31.mp4?alt=media&token=3d962a3e-c69b-4148-8f66-70771d2f136b>" fullWidth="false" %}

* Se quiser alterar sua organização, clique em "Alterar organização" e refaça os passos anteriores

## Funcionalidades

As funcionalidades abaixo constam na versão 1.7 do Griaule Mobile

### Motivação de Busca

Ao realizar uma busca (seja verificação ou identificação) é obrigatório cadastrar um motivo pelo qual essa busca está sendo realizada.\
Essa informação será enviada nos metadados da transação, podendo ser buscada depois para:

* Auditoria
* Exibição em relatórios
* Exibição no histórico de pesquisa

Um checkbox abaixo da janela com a opção de "Lembrar motivo" é mostrado, ao ser selecionado, ele manterá o campo de motivação preenchido na próxima vez que for aberto (independente de serem operações diferentes).\
O campo só deixará de ser preenchido quando ele for desselecionado e uma busca for realizada, então ele será mostrado em branco na próxima busca.

<figure><img src="/files/azo9BJZPwSz46vLZWmz2" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Essa feature é opcional e configurável a nível de organização
{% endhint %}

Para ativá-la, deve ser alterado o campo *mobile.confs* na tabela *sphinx.settings*

* Nome: requireSearchReason
* Caminho: operations.requireSearchReason
* Tipo: Bool
* Default: *false*
* Obrigatória: Não

```
  "operations": {
    "requireSearchReason": true, // novo campo
    "identify": {
      "faceCapture": {
        "frontCameraDefault": true,
        "isEnabled": true,
        "rotationEvaluation": false,
        "showPreview": false,
        "smileEvaluation": false
      }
```

### Histórico de Transações

A funcionalidade de histórico de transações exibe todas as transações feitas pelo usuário, permitindo que seja exportado um relatório referente àquela transação.

Atualmente, as transações são salvas localmente no celular.

{% hint style="warning" %}
Caso o BCC Web não tenha suporte ao campo de metadados, os dados "motivo da pesquisa" e "biometrias coletadas" não estarão disponíveis
{% endhint %}

<figure><img src="/files/J3VgR7ROVJ6QCZ7AY1ZB" alt="" width="375"><figcaption></figcaption></figure>

#### Verificação

No caso de operações 1:1 são exibidos:

* Score
* Motivo
* CPF (chave da busca)
* Data e Hora da transação
* Biometrias submetidas

Ao solicitar o relatório, ele é gerado imediatamente, sem nenhum passo adicional necessário

#### Identificação

No caso de operações 1:N são exibidos:

* Maior score obtido entre os candidatos
* Motivo
* Data e hora
* Biometrias submetidas

Ao solicitar o relatório, é exibida uma janela com os candidatos trazidos na consulta, sendo necessário selecionar o indivíduo para gerar o relatório entre as duas pessoas

No caso em que a operação 1:N traz apenas um candidato, o relatório é gerado imediatamente

### Geração de Relatórios

Há a possibilidade de gerar um relatório negativo (caso em que a verificação/identificação falha em identificar alguém na base de dados).

Os relatórios podem ser gerados de duas maneiras:

* Através da tela de Perfil do Candidato
  * Permite gerar apenas um relatório
* Através da tela de histórico
  * Permite a geração de múltiplos relatórios de uma vez

#### Relatório Individual

Para gerar o relatório individual, há um botão disponível no canto superior direito da tela de Perfil, ao ser gerado, o relatório inclui:

* Dados da Pesquisa
* Dados do Perfil selecionado

O relatório não inclui uma decisão de "MATCH", apenas o Score resultante da operação, uma vez que a decisão final de match é do operador.&#x20;

#### Múltiplos Relatórios

Ao pressionar uma operação na tela de histórico ela será selecionada, permitindo selecionar múltiplas operações para gerar os relatórios de forma automática.

Os relatórios incluem:

* Dados da Pesquisa
* Dados de todos os candidatos que deram match

{% hint style="info" %}
Caso o BCC Web não esteja em uma versão que suporte o envio dos metadados, os dados "*motivo da pesquisa"* e "*biometrias coletadas"* não estarão disponíveis
{% endhint %}


# Permissões de usuário

### Permissões básicas

Para realizar uma busca no Griaule Mobile, o usuário necessita das seguintes permissões para poder realizar as operações e visualizar as informações:

* org\_ALL
* ori\_all
* bcc\_mobile

Permitem que o usuário visualize os candidatos com origem civil, criminal e necro

O usuário necessita da permissão:

* bcc\_user

Que autoriza as operações de identificação e verificação de face e digital.

### Permissão de Investigação

Para acessar os "Casos de atenção" atrelados a um perfil, é necessário um usuário cadastrado no SMART com permissão de investigação. Só assim será autorizado a exibição das informações de "Casos de atenção" atreladas a um perfil.

### Permissão de captura manual

Para acessar a permissão de captura manual (Griaule Mobile 1.7.0), que permite que o usuário passe pelas validações de sorriso e olhos abertos (necessário para uso necro) é necessário que o usuário tenha atrelado ao seu perfil a permissão

* bcc\_mobile\_manual\_capture

Essa permissão permite que o usuário force manualmente uma captura e revise a foto tirada antes de submetê-la para análise

{% hint style="info" %}
O review da foto é uma funcionalidade disponível apenas no fluxo de captura manual.
{% endhint %}

### Onde cadastrar as permissões?

Contatar o suporte e pedir o cadastro das permissões na conta escolhida


# Instalação do GBS Web Apps

## Introdução

Esse manual descreve o procedimento de instalação e atualização dos servidores Griaule para as Aplicações Web.

Para realizar a instalação, alguns arquivos precisam estar disponíveis na máquina em que a aplicação será instalada:

* Arquivo .war da aplicação, `gbs-<app_name>-web-server-<version>.war`;
* Script de dump do banco de dados, `clear-<app_name>-<DD>-<MM>-<YYYY>.sql`, se estiver instalando;
* Script de atualização do banco de dados, `upgrade-<app_name>-<DD>-<MM>-<YYYY>.sql`, se estiver atualizando;
* Script do banco de dados Sphinx, `clear-sphinx-<DD>-<MM>-<YYYY>.sql`;
* Pacote Apache Tomcat, `tomcats-v7.tar`;
* Script de setup `setup.sh`;
* Script Python auxiliar para configuração `updatescript.py`;
* Scripts de [Pré-Instalação](#pre-instalacao): `setup_webapps.sh` e, opcionalmente, `setup_aliases.sh` se desejar criar [Aliases](#manuseando-as-aplicacoes).

{% hint style="warning" %}
Se algum arquivo estiver faltando, entre em contato com a Equipe de Suporte da Griaule pelo e-mail: <support@griaule.com>.
{% endhint %}

Para fazer uma nova instalação, siga os seguintes passos:

1. Verifique se o seu sistema atende aos [Pré-Requisitos](#pre-requisitos)
2. Faça a [Pré-Instalação](#pre-instalacao) utilizando o script
3. [Instale](#instalacao) a aplicação
4. [Configure](#configuracoes) a aplicação
5. Verifique se a aplicação está sendo executada por meio dos comandos apresentados em [Manuseando as Aplicações](#manuseando-as-aplicacoes)

Para atualizar uma aplicação, siga as etapas:

1. Verifique se o seu sistema atende aos [Pré-Requisitos](#pre-requisitos) da nova versão
2. [Atualize](#atualizacao) a aplicação através dos comandos apresentados
3. Verifique as [Configurações](#configuracoes)
4. Verifique se a aplicação está sendo executada por meio dos comandos apresentados em [Manuseando as Aplicações](#manuseando-as-aplicacoes)

## Pré-Requisitos

* Linux (CentOS 7 / Red Hat 7 / Oracle Linux 7 / Oracle Linux 8);
* Java Development Kit version 1.8+;
* Apache: Tomcat version 7+;
* Database: MySQL/MariaDB 5.7+;
* libusb, libpng12, compat-libtiff3;
* GBDS: API;
* GBDS: Matcher;
* GBDS: Notifier (somente para o [ETR](/aplicacoes/etrweb));
* [Google Tesseract OCR Engine 4.0.0 ou maior](https://github.com/tesseract-ocr/tesseract/releases) (somente para o [CardScan](/aplicacoes/cardscanweb));
* [SmartSense Agent](/instalacao-do-gbds/smartsenseagent) (somente para o [SmartSense](/aplicacoes/smartsense))
* [CUPS](/componentes-web/printconfig#sistemas-de-impressao) (somente para o [Print](/aplicacoes/print))

{% hint style="info" %}
Para saber mais sobre os produtos do Griaule Biometric Suite (GBS), consulte [Visão Geral do GBS](/).
{% endhint %}

## Pré-Instalação

Alguns passos precisam ser feitos antes do processo de instalação.

{% hint style="info" %}
Se o Tomcat não estiver instalado, instale-o com o seguinte comando:

```sh
yum install tomcat -y
```

{% endhint %}

{% hint style="success" %}
Em todos os comandos, lembre-se de substituir `<app_name>` para o nome da aplicação desejada e também `<version>` para a versão correspondente. O `<app_name>` pode ser: `bcc`, `cardscan`, `etr`, `mir`, `best`, `intelligence`, `smart-sense`, `print`, `control-panel` ou `home-screen`.
{% endhint %}

Primeiro, certifique-se de que o pacote Tomcats (arquivo `tomcats-v7.tar`) fornecido esteja disponível na máquina em que a aplicação será instalada.

{% hint style="info" %}
O pacote `tomcats-v7.tar` contém uma pasta para cada aplicação. A estrutura de pastas é a seguinte:

```html
/var/lib/tomcats/
├── bcc
├── best
├── cardscan
├── control-panel
├── etr
├── home-screen
├── intelligence
├── mir
├── print
└── smart-sense
```

Cada pasta contém as seguintes subpastas:

```html
/var/lib/tomcats/<app_name>/
├── conf
├── logs
├── temp
├── webapps
└── work
```

{% endhint %}

{% hint style="danger" %}
Se não estiver realizando uma instalação nova de todas as aplicações, **NÃO** extraia o pacote `tomcats-v7.tar` no diretório `/var/lib/tomcats/` (Passo 1). Em vez disso, extraia o pacote em um diretório temporário e mova apenas a pasta da aplicação que está sendo instalada para o diretório `/var/lib/tomcats/`. Então, continue no **Passo 2**.
{% endhint %}

**Passo 1:** Transfira e descompacte o pacote `tomcats-v7.tar` no diretório `/var/lib/tomcats`.

```sh
mkdir -p /var/lib/tomcats && tar -xf tomcats-v7.tar -C /var/lib/tomcats
```

**Passo 2:** Faça a pré-instalação da aplicação utilizando o script `setup_webapps.sh` fornecido.

Para realizar este procedimento, execute o script de pré-instalação passando o nome da aplicação que se deseja instalar:

```sh
./setup_webapps.sh <app_name>
```

**Passo 3:** Configure os aliases (opcional).

Opcionalmente, se desejar criar [aliases](#manuseando-as-aplicacoes) para facilitar o manuseio da aplicação, execute o seguinte script:

```sh
./setup_aliases.sh <app_name>
```

Então, aplique o arquivo `.bashrc`:

```sh
source ~/.bashrc
```

Esses scripts irão:

* Criar links simbólicos do tomcat para cada serviço
* Atualizar/modificar scripts do servidor tomcat
* Adicionar aliases para facilitar o manuseio da aplicação

{% hint style="info" %}
Após esses passos, se o Cardscan Server e/ou ETR estiverem sendo instalados, siga os passos abaixo.

Abra o arquivo de configuração do banco de dados:

```sh
vim /etc/my.cnf
```

Em `[mysqld]`, se o CardScan estiver sendo instalado, adicione a seguinte linha:

```properties
# CARDSCAN Required
max_allowed_packet=500M
```

Se o ETR estiver sendo instalado, adicione a seguinte linha:

```properties
# ETR Required
sql-mode=""
```

Se já estiver configurado, ignore este passo.
{% endhint %}

Após a conclusão dos procedimentos acima, prossiga para [Instalação](#instalacao).

## Instalação

Antes de iniciar o procedimento de instalação, certifique-se de que o arquivo `.war` da aplicação esteja disponível na máquina em que a aplicação será instalada.

{% hint style="success" %}
Em todos os comandos, lembre-se de substituir `<app_name>` para o nome da aplicação desejada e também `<version>` para a versão correspondente. O `<app_name>` pode ser: `bcc`, `cardscan`, `etr`, `mir`, `best`, `intelligence`, `smart-sense`, `print`, `control-panel` ou `home-screen`.
{% endhint %}

**Passo 1:** Mova o arquivo `.war` da aplicação para o diretório inicial da aplicação:

```sh
mv *.war /var/lib/tomcats/<app_name>/
```

**Passo 2:** Mude para o diretório `webapps` da aplicação:

```sh
cd /var/lib/tomcats/<app_name>/webapps
```

**Passo 3:** Crie um link simbólico no diretório `webapps` para o arquivo `.war` da aplicação.

```sh
ln -s /var/lib/tomcats/<app_name>/gbs-<app_name>-web-server-<version>.war gbs-<app_name>-server.war
```

**Passo 4:** Mude de diretório:

```sh
cd /var/lib/
```

**Passo 5:** Altere a posse dos arquivos no diretório `tomcats` para o usuário `tomcat`:

```sh
chown -R tomcat:tomcat tomcats/
```

Então, prossiga com as [Configurações](#configuracoes) da aplicação.

## Atualização

Para atualizar uma aplicação, prossiga com as seguintes etapas:

{% hint style="success" %}
Em todos os comandos, lembre-se de substituir `<app_name>` para o nome da aplicação desejada e também `<version>` para a versão correspondente. O `<app_name>` pode ser: `bcc`, `cardscan`, `etr`, `mir`, `best`, `intelligence`, `smart-sense`, `print`, `control-panel` ou `home-screen`.
{% endhint %}

**Passo 1:** Pare a aplicação:

```sh
systemctl stop tomcat@<app_name>.service
```

**Passo 2:** Remova os arquivos antigos:

```sh
sudo rm -rf /var/lib/tomcats/<app_name>/webapps/*
```

**Passo 3:** Coloque o arquivo `.war` da aplicação no diretório inicial da aplicação:

```sh
mv *.war /var/lib/tomcats/<app_name>/
```

**Passo 4:** Mude para o diretório `webapps` da aplicação:

```sh
cd /var/lib/tomcats/<app_name>/webapps
```

**Passo 5:** Crie um link simbólico no diretório `webapps` para o arquivo `.war` da aplicação:

```sh
ln -s /var/lib/tomcats/<app_name>/gbs-<app_name>-web-server-<version>.war gbs-<app_name>-server.war
```

**Passo 6:** Execute os dumps de atualização do banco de dados, se a release os incluir:

```sh
mysql -u root -p < <path/to/script>.sql
```

{% hint style="success" %}
O script específico da aplicação geralmente é chamado `upgrade-<app_name>-<DD>-<MM>-<YYYY>.sql`. Pode haver mais de um script. Nesse caso, execute os outros scripts também.
{% endhint %}

**Passo 7:** Inicie a aplicação:

```sh
systemctl start tomcat@<app_name>.service
```

**Passo 8:** Mude para o diretório `tomcats`:

```sh
cd /var/lib/tomcats
```

**Passo 9:** Execute o script de setup:

```sh
/var/lib/tomcats/setup.sh <app_name>
```

## Configurações

Cada componente tem sua configuração individual. Esses são apresentados em seu respectivo manual.

{% hint style="success" %}
Em todos os comandos, lembre-se de substituir `<app_name>` para o nome da aplicação desejada e também `<version>` para a versão correspondente. O `<app_name>` pode ser: `bcc`, `cardscan`, `etr`, `mir`, `best`, `intelligence`, `smart-sense`, `print`, `control-panel` ou `home-screen`.
{% endhint %}

**Passo 1:** Execute o dump do banco de dados:

```sh
mysql -u root -p < <path/to/script>.sql
```

{% hint style="success" %}
O script de dump do banco de dados específico de cada aplicação geralmente é chamado `clear-<app_name>-<DD>-<MM>-<YYYY>.sql`. Pode haver outro script, geralmente chamado `clear-sphinx-<DD>-<MM>-<YYYY>.sql`. Neste, caso, execute-o também.
{% endhint %}

**Passo 2:** Então, edite o arquivo `config.properties`:

```sh
vim /var/lib/tomcats/<app_name>/conf/config.properties
```

Para entender os procedimentos de configuração, consulte o manual de configuração específico:

* [Manual de Configuração do BCC Web Server](/componentes-web/bccwebconfig)
* [Manual de Configuração do Cardscan Web Server](/componentes-web/cardscanwebconfig)
* [Manual de Configuração do ETR Web Server](/componentes-web/etrwebconfig)
* [Manual de Configuração do MIR Web Server](/componentes-web/mirwebconfig)
* [Manual de Configuração do BEST Web Server](/componentes-web/bestwebconfig)
* [Manual de Configuração do Intelligence Web Server](/componentes-web/intelligencewebconfig)
* [Manual de Configuração do SmartSense Server](/componentes-web/smartsenseconfig)
* [Manual de Configuração do Control Panel Web Server](/componentes-web/controlpanelwebconfig)
* [Manual de Configuração do Print Server](/componentes-web/printconfig)
* [Manual de Configuração do Home Screen Server](/componentes-web/homescreenconfig)

{% hint style="info" %}
Certifique-se de que o parâmetro de configuração `Connector port=<port_number>` está especificado corretamente no arquivo `server.xml`, localizado em `/var/lib/tomcats/<app_name>/conf`. Para mais informações, consulte os manuais de configuração específicos para cada aplicação. As portas de conexão (`Connector port=<port_number>`) e shutdown (`Server port=... shutdown=...`) não devem ser iguais entre si ou coincidir com portas usadas por outras aplicações.
{% endhint %}

{% hint style="info" %}
Certifique-se de que os parâmetros de configuração `<app_name>.ip`, `<app_name>.port` e `<app_name>.protocol` estejam corretamente especificados no arquivo `config.properties`. O endereço IP deve coincidir com o configurado no arquivo `server.xml`. Em diversos casos, o IP será o mesmo para diversas aplicações. Contudo, cada aplicação possuirá uma porta **diferente e única**.
{% endhint %}

**Passo 3:** Em seguida, entre no MySQL como root:

```sh
mysql -u root -p
```

**Passo 4:** Rode a seguinte query:

```sql
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
```

**Passo 5:** Saia do MySQL:

```sql
exit
```

**Passo 6:** Então, inicie a aplicação.

```sh
systemctl start tomcat@<app_name>.service
```

**Passo 7:** Mude para o diretório `tomcats`:

```sh
cd /var/lib/tomcats
```

**Passo 8:** Se for a primeira vez rodando a aplicação, execute o script de setup:

```sh
/var/lib/tomcats/setup.sh <app_name>
```

{% hint style="warning" %}
Se estiver instalando o **SmartSense**, certifique-se de que o **ELK** também esteja instalado. Para mais instruções, consulte o [Manual de Instalação do Elastic Stack (ELK)](/ferramentas-auxiliares/elk).
{% endhint %}

## Manuseando as Aplicações

Essa seção apresenta alguns comandos para monitorar e manusear os serviços Griaule, assim como seus respectivos aliases.

### Aliases

Aliases são comandos curtos definidos pelo usuário que servem como substitutos para comandos mais longos ou complexos. Eles são criados para tornar os comandos frequentemente utilizados mais convenientes de executar. Quando um alias é invocado, ele é substituído pelo comando completo que representa antes de ser executado.

Se não estiver utilizando o script `setup_aliases.sh`, como descrito em [Pré-Instalação](#pre-instalacao), é possível adicionar os aliases manualmente. Para fazer isso, edite o arquivo `.bashrc` raiz:

```sh
vim ~/.bashrc
```

E adicione os seguintes alises, de acordo com a aplicação desejada:

```properties
# ETR
alias etrstart='systemctl start tomcat@etr.service'
alias etrstop='systemctl stop tomcat@etr.service'
alias etrstatus='systemctl status tomcat@etr.service'
alias etrhome='cd /var/lib/tomcats/etr'
alias etrconf='vim /var/lib/tomcats/etr/conf/config.properties'
alias etrsetup='/var/lib/tomcats/setup.sh'
alias etrlogt='journalctl -u tomcat@etr -f'
alias etrlog='journalctl -u tomcat@etr | less'

# CARDSCAN
alias csstart='systemctl start tomcat@cardscan.service'
alias csstop='systemctl stop tomcat@cardscan.service'
alias csstatus='systemctl status tomcat@cardscan.service'
alias cshome='cd /var/lib/tomcats/cardscan'
alias csconf='vim /var/lib/tomcats/cardscan/conf/config.properties'
alias cssetup='/var/lib/tomcats/setup.sh'
alias cslogt='journalctl -u tomcat@cardscan -f'
alias cslog='journalctl -u tomcat@cardscan | less'

# BEST
alias beststart='systemctl start tomcat@best.service'
alias beststop='systemctl stop tomcat@best.service'
alias beststatus='systemctl status tomcat@best.service'
alias besthome='cd /var/lib/tomcats/best'
alias bestconf='vim /var/lib/tomcats/best/conf/config.properties'
alias bestsetup='/var/lib/tomcats/setup.sh'
alias bestlogt='journalctl -u tomcat@best -f'
alias bestlog='journalctl -u tomcat@best | less'

# INTELLIGENCE
alias intelstart='systemctl start tomcat@intelligence.service'
alias intelstop='systemctl stop tomcat@intelligence.service'
alias intelstatus='systemctl status tomcat@intelligence.service'
alias intelhome='cd /var/lib/tomcats/intelligence'
alias intelconf='vim /var/lib/tomcats/intelligence/conf/config.properties'
alias intelsetup='/var/lib/tomcats/setup.sh'
alias intellogt='journalctl -u tomcat@intelligence -f'
alias intellog='journalctl -u tomcat@intelligence | less'

# MIR
alias mirstart='systemctl start tomcat@mir.service'
alias mirstop='systemctl stop tomcat@mir.service'
alias mirstatus='systemctl status tomcat@mir.service'
alias mirhome='cd /var/lib/tomcats/mir'
alias mirconf='vim /var/lib/tomcats/mir/conf/config.properties'
alias mirsetup='/var/lib/tomcats/setup.sh'
alias mirlogt='journalctl -u tomcat@mir -f'
alias mirlog='journalctl -u tomcat@mir | less'

# BCC
alias bccstart='systemctl start tomcat@bcc.service'
alias bccstop='systemctl stop tomcat@bcc.service'
alias bccstatus='systemctl status tomcat@bcc.service'
alias bcchome='cd /var/lib/tomcats/bcc'
alias bccconf='vim /var/lib/tomcats/bcc/conf/config.properties'
alias bccsetup='/var/lib/tomcats/setup.sh'
alias bcclogt='journalctl -u tomcat@bcc -f'
alias bcclog='journalctl -u tomcat@bcc | less'

# CONTROL PANEL
alias cpstart='systemctl start tomcat@control-panel.service'
alias cpstop='systemctl stop tomcat@control-panel.service'
alias cpstatus='systemctl status tomcat@control-panel.service'
alias cphome='cd /var/lib/tomcats/control-panel'
alias cpconf='vim /var/lib/tomcats/control-panel/conf/config.properties'
alias cpsetup='/var/lib/tomcats/setup.sh'
alias cplogt='journalctl -u tomcat@control-panel -f'
alias cplog='journalctl -u tomcat@control-panel | less'

# SMARTSENSE
alias smartstart='systemctl start tomcat@smart-sense.service'
alias smartstop='systemctl stop tomcat@smart-sense.service'
alias smartstatus='systemctl status tomcat@smart-sense.service'
alias smarthome='cd /var/lib/tomcats/smart-sense'
alias smartconf='vim /var/lib/tomcats/smart-sense/conf/config.properties'
alias smartsetup='/var/lib/tomcats/setup.sh'
alias smartlogt='journalctl -u tomcat@smart-sense -f'
alias smartlog='journalctl -u tomcat@smart-sense | less'

# PRINT
alias printstart='systemctl start tomcat@print.service'
alias printstop='systemctl stop tomcat@print.service'
alias printstatus='systemctl status tomcat@print.service'
alias printhome='cd /var/lib/tomcats/print'
alias printconf='vim /var/lib/tomcats/print/conf/config.properties'
alias printsetup='/var/lib/tomcats/setup.sh'
alias printlogt='journalctl -u tomcat@print -f'
alias printlog='journalctl -u tomcat@print | less'

# HOME SCREEN
alias homestart='systemctl start tomcat@home-screen.service'
alias homestop='systemctl stop tomcat@home-screen.service'
alias homestatus='systemctl status tomcat@home-screen.service'
alias homehome='cd /var/lib/tomcats/home-screen'
alias homeconf='vim /var/lib/tomcats/home-screen/conf/config.properties'
alias homesetup='/var/lib/tomcats/setup.sh'
alias homelogt='journalctl -u tomcat@home-screen -f'
alias homelog='journalctl -u tomcat@home-screen | less'
```

### Comandos Úteis

* **Iniciar a Aplicação**

```sh
systemctl start tomcat@etr.service
systemctl start tomcat@cardscan.service
systemctl start tomcat@best.service
systemctl start tomcat@intelligence.service
systemctl start tomcat@mir.service
systemctl start tomcat@bcc.service
systemctl start tomcat@control-panel.service
systemctl start tomcat@smart-sense.service
systemctl start tomcat@print.service
systemctl start tomcat@home-screen.service
```

ou com o alias:

```sh
etrstart
csstart
beststart
intelstart
mirstart
bccstart
cpstart
smartstart
printstart
homestart
```

* **Parar a Aplicação**

```sh
systemctl stop tomcat@etr.service
systemctl stop tomcat@cardscan.service
systemctl stop tomcat@best.service
systemctl stop tomcat@intelligence.service
systemctl stop tomcat@mir.service
systemctl stop tomcat@bcc.service
systemctl stop tomcat@control-panel.service
systemctl stop tomcat@smart-sense.service
systemctl stop tomcat@print.service
systemctl stop tomcat@home-screen.service
```

ou com o alias:

```sh
etrstop
csstop
beststop
intelstop
mirstop
bccstop
cpstop
smartstop
printstop
homestop
```

* **Checar o Status da Aplicação**

```sh
systemctl status tomcat@etr.service
systemctl status tomcat@cardscan.service
systemctl status tomcat@best.service
systemctl status tomcat@intelligence.service
systemctl status tomcat@mir.service
systemctl status tomcat@bcc.service
systemctl status tomcat@control-panel.service
systemctl status tomcat@smart-sense.service
systemctl status tomcat@print.service
systemctl status tomcat@home-screen.service
```

ou com o alias:

```sh
etrstatus
csstatus
beststatus
intelstatus
mirstatus
bccstatus
cpstatus
smartstatus
printstatus
homestatus
```

* **Checar os Logs da Aplicação**

```sh
# tail log
journalctl -u tomcat@etr -f
journalctl -u tomcat@cardscan -f
journalctl -u tomcat@best -f
journalctl -u tomcat@intelligence -f
journalctl -u tomcat@mir -f
journalctl -u tomcat@bcc -f
journalctl -u tomcat@control-panel -f
journalctl -u tomcat@smart-sense -f
journalctl -u tomcat@print -f
journalctl -u tomcat@home-screen -f

# full log
journalctl -u tomcat@etr | less
journalctl -u tomcat@cardscan | less
journalctl -u tomcat@best | less
journalctl -u tomcat@intelligence | less
journalctl -u tomcat@mir | less
journalctl -u tomcat@bcc | less
journalctl -u tomcat@control-panel | less
journalctl -u tomcat@smart-sense | less
journalctl -u tomcat@print | less
journalctl -u tomcat@home-screen | less
```

ou com o alias:

```sh
# tail log
etrlogt
cslogt
bestlogt
intellogt
mirlogt
bcclogt
cplogt
smartlogt
printlogt
homelogt

# full log
etrlog
cslog
bestlog
intellog
mirlog
bcclog
cplog
smartlog
printlog
homelog
```


# Configuração do BCC Web Server

## Introdução

Esse manual descreve a configuração dos componentes do lado do servidor da aplicação *GBS BCC*. O GBS BCC é uma aplicação projetada para cadastrar perfis civis e de bebes com seus dados biográficos e biométricos, tal como impressões digitais, face, impressões palmares, íris e outros.

O procedimento de configuração deve ser feito somente depois do passo de instalação. Para mais informações, consulte o [Manual de Instalação do GBS Apps](/componentes-web/gbsappssetup).

## Configuração

Os passos de configuração são:

1. Configure o Tomcat;
2. Configure os Certificados;
3. Gere a senha criptografada;
4. Finalize as configurações no arquivo config.properties.

Todos os passos são descritos abaixo. Um exemplo do arquivo `config.properties` pode ser visto na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="danger" %}
Todas as linhas devem estar presentes no arquivo de configuração. Comentar ou deletar linhas pode causar comportamentos inesperados. Para informações adicionais, contate o Time de Suporte da Griaule.
{% endhint %}

### Configuração do Tomcat

Edite o arquivo de configuração do Tomcat para configurar os certificados e a porta que a aplicação usará.

```sh
vi /var/lib/tomcats/bcc/conf/server.xml
```

Para mudar a porta, procure por `connector port=`. Essa é a porta para operações backend.

### Configuração de Certificados

Para habilitar autenticação SSL, procure por `connector port=` no arquivo `/conf/server.xml`.

Existem duas entradas. A comentada é a configuração para SSL. Remova os delimitadores de comentários `<!--` e `-->`, então ajuste os seguintes parâmetros:

```properties
port="58194"
keystoreFile="/home/griaule/keystore"
keystorePass="password"
keyAlias="1"
clientAuth="true"
truststoreFile="/home/griaule/keystore"
truststorePass="password"
```

O parâmetro `port` deve ser a porta de rede desejada para a aplicação.

Mude o caminho do `keystoreFile` e o `truststoreFile` para os valores apropriados. Faça o mesmo para o `keystorePass` e o `truststorePass`.

O parâmetro `clientAuth="true"` irá requerer autenticação do servidor para o cliente e do cliente para o servidor. Isso significa que o cliente necessitará importar o certificado no navegador para poder acessar a aplicação.

{% hint style="warning" %}
Quando **clientAuth** é definida como *true*, o administrador do sistema deve fornecer o arquivo **certificate.pfx** para os usuários finais.
{% endhint %}

### Criptografia da senha do Banco de Dados

No arquivo `config.properties`, o parâmetro `jdbc.password` é uma senha criptografada. Para gerar a senha criptografada, siga os seguintes passos:

1. Vá para o seguinte diretório:

   ```sh
   cd /var/lib/tomcats/bcc/webapps/gbs-bcc-server/WEB-INF/lib
   ```
2. Execute o comando:

   ```sh
   java -cp gbs-common-db-<versão>.jar com.griaule.commons.util.EncryptUtil <senhaDesejada>
   ```
3. A senha criptografada aparecerá depois da mensagem: *"Encrypted password is:"*

{% hint style="info" %}
Guarde a senha criptografada. Ela será usada em configurações posteriores.
{% endhint %}

### Arquivo de Configuração da Aplicação

Para configurar o arquivo, abra-o com:

```sh
vi /var/lib/tomcats/best/conf/config.properties
```

As mudanças mais importantes nesse arquivo são os parâmetros `jdbc.url`, `jdbc.username`, `jdbc.password` e `gbds.url`. Configure-os de acordo com seu ambiente.

O arquivo de configuração completa é mostrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao)

{% hint style="info" %}
Lembre-se de substituir a senha criptografada gerada na seção [Criptografia da senha do Banco de Dados](#criptografia-da-senha-do-banco-de-dados) neste arquivo.
{% endhint %}

#### Configuração do BCC

O último passo é configurar o IP e a porta da aplicação que o usuário final irá acessar. Ele deve ser o mesmo IP e porta configurado na seção [Configuração do Tomcat](#configuracao-do-tomcat).

```properties
bcc.ip=<ip>
bcc.port=<port>
bcc.protocol=<protocol>
```

{% hint style="warning" %}
Certifique-se de que os parâmetros de configuração `bcc.ip`, `bcc.port` e `bcc.protocol` estejam corretamente especificados no arquivo `config.properties`. Em diversos casos, o IP será o mesmo para diversas aplicações. Contudo, cada aplicação possuirá uma porta **diferente e única**.
{% endhint %}

## Finalizando as Configurações

Após completar todos os passos de configuração, volte para o [Manual de Instalação do GBS Apps - Seção de Configuração](/componentes-web/gbsappssetup#configuracoes).

## Exemplo do Arquivo de Configuração

Essa seção mostra um exemplo do arquivo `config.properties`.

```properties
# GBS BCC Server

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.0.189:3306/bcc
jdbc.username=root
jdbc.password=CDrt8vbewA2YAubPNOLZkw==
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=false

locale=en_us

gbds.url=http://192.168.0.105:8085
gbds.user=gbds.authenticate
gbds.key=griaule.123
gbds.logLevel=DEBUG
gbds.timeout=300
gbds.enroll.priority=DEFAULT_PRIORITY
gbds.search.priority=DEFAULT_PRIORITY
gbds.mock=false

queuePooling=true

bcc.localPort=64041
minimumBiometrics=1
sequenceControlType=NONE
listFields=BIOGRAPHIC:birthDate

databaseProfileDays=30
operationMode=ONLINE

saveDirectory=C:/Users/griaule/Documents

sequenceControlType=CTRL_442
fingerprint.useSDK=true

bcc.ip=
bcc.port=
bcc.protocol=

bccService.location=
```


# Configuração do Cardscan Web Server

## Introdução

Esse manual descreve a configuração dos componentes do lado do servidor do *GBS CardScan*. O GBS Cardscan é uma aplicação que permite o usuário criar layouts e processar fichas com informações biométricas e biográficas.

O procedimento de configuração deve ser feito somente depois do passo de instalação. Para mais informações, consulte o [Manual de Instalação do GBS Apps](/componentes-web/gbsappssetup).

## Configuração

Os passos de configuração são:

1. Configure o Tomcat;
2. Configure os Certificados;
3. Gere a senha criptografada;
4. Finalize as configurações no arquivo config.properties.

Todos os passos são descritos abaixo. Um exemplo do arquivo `config.properties` pode ser visto na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="danger" %}
Todas as linhas devem estar presentes no arquivo de configuração. Comentar ou deletar linhas pode causar comportamentos inesperados. Para informações adicionais, contate o Time de Suporte da Griaule.
{% endhint %}

### Configuração do Tomcat

Edite o arquivo de configuração do Tomcat para configurar os certificados e a porta que a aplicação usará.

```sh
vi /var/lib/tomcats/cardscan/conf/server.xml
```

Para mudar a porta, procure por `connector port=`. Essa é a porta para operações backend.

A porta padrão do GBS CardScan é `8087`.

### Configuração de Certificados

Para habilitar autenticação SSL, procure por `connector port=` no arquivo `/conf/server.xml`.

Existem duas entradas. A comentada é a configuração para SSL. Remova os delimitadores de comentários `<!--` e `-->`, então ajuste os seguintes parâmetros:

```properties
port="58194"
keystoreFile="/home/griaule/keystore"
keystorePass="password"
keyAlias="1"
clientAuth="true"
truststoreFile="/home/griaule/keystore"
truststorePass="password"
```

O parâmetro `port` deve ser a porta de rede desejada para a aplicação.

Mude o caminho do `keystoreFile` e o `truststoreFile` para os valores apropriados. Faça o mesmo para o `keystorePass` e o `truststorePass`.

O parâmetro `clientAuth="true"` irá requerer autenticação do servidor para o cliente e do cliente para o servidor. Isso significa que o cliente necessitará importar o certificado no navegador para poder acessar a aplicação.

{% hint style="warning" %}
Quando **clientAuth** é definida como *true*, o administrador do sistema deve fornecer o arquivo **certificate.pfx** para os usuários finais.
{% endhint %}

### Criptografia da senha do Banco de Dados

No arquivo `config.properties`, o parâmetro `jdbc.password` é uma senha criptografada. Para gerar a senha criptografada, siga os seguintes passos:

1. Vá para o seguinte diretório:

   ```sh
   cd /var/lib/tomcats/cardscan/webapps/gbs-cardscan-server/WEB-INF/lib
   ```
2. Execute o comando:

   ```sh
   java -cp gbs-common-db-<versão>.jar com.griaule.commons.util.EncryptUtil <senhaDesejada>
   ```
3. A senha criptografada aparecerá depois da mensagem: *"Encrypted password is:"*

{% hint style="info" %}
Guarde a senha criptografada. Ela será usada em configurações posteriores.
{% endhint %}

### Arquivo de Configuração da Aplicação

Para configurar o arquivo, abra-o com:

```sh
vi /var/lib/tomcats/cardscan/conf/config.properties
```

As mudanças mais importantes nesse arquivo são os parâmetros `jdbc.url`, `jdbc.username`, `jdbc.password` e `gbds.url`. Configure-os de acordo com seu ambiente.

O arquivo de configuração completa é mostrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao)

{% hint style="info" %}
Lembre-se de substituir a senha criptografada gerada na seção [Criptografia da senha do Banco de Dados](#criptografia-da-senha-do-banco-de-dados) neste arquivo.
{% endhint %}

#### Configurando a checagem de números de ID lidos por OCR

Ao importar cartões de uma pasta de um servidor, é possível verificar se o número de ID lido por OCR do cartão está dentro de um intervalo indicado pelo nome da pasta do servidor.

Para fazer isso, no servidor, nomeie a pasta de acordo com o seguinte padrão:

```html
<nome_da_pasta>_<id_inicial>_<id_final>
```

Por exemplo, se o nome da pasta for `cartoes_1000_2000`, o sistema verificará se o número de ID lido por OCR está entre 1000 e 2000. Os que não estiverem dentro desse intervalo receberão o status `Revisão manual pendente` e aguardarão a revisão manual.

Para habilitar esse recurso, no arquivo `config.properties`, adicione:

```properties
findRgInRegion=true
check.folder=true
keyId=<nome_chave>
remove.point.character=true
```

Isso fará:

* `findRgInRegion`: Otimizar o OCR para ler uma região maior e procurar pela chave desejada.
* `check.folder`: Validar se o número de ID está dentro do intervalo esperado. Caso não esteja, o cartão será marcado para revisão manual.
* `keyId`: Nome da chave que o sistema procurará. Exemplo: `RG`.
* `remove.point.character`: Remover todos os pontos `.` e hífens `-` do número de ID.

#### Configurações do CardScan

O último passo é configurar o IP e a porta da aplicação que o usuário final irá acessar. Ele deve ser o mesmo IP e porta configurado na seção [Configuração do Tomcat](#configuracao-do-tomcat).

```properties
cardscan.ip=<ip>
cardscan.port=<port>
cardscan.protocol=<protocol>
```

{% hint style="warning" %}
Certifique-se de que os parâmetros de configuração `cardscan.ip`, `cardscan.port` e `cardscan.protocol` estejam corretamente especificados no arquivo `config.properties`. Em diversos casos, o IP será o mesmo para diversas aplicações. Contudo, cada aplicação possuirá uma porta **diferente e única**.
{% endhint %}

## Finalizando as Configurações

Após completar todos os passos de configuração, volte para o [Manual de Instalação do GBS Apps - Seção de Configuração](/componentes-web/gbsappssetup#configuracoes).

## Exemplo do Arquivo de Configuração

Essa seção mostra um exemplo do arquivo `config.properties`.

```properties
# GBS Cardscan Server

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.0.200:3306
jdbc.username=root
#jdbc.password=CDrt8vbewA2YAubPNOLZkw==
#jdbc.password=SescVYZrpjEiiqEdviFwiQ==
jdbc.password=CDrt8vbewA2YAubPNOLZkw==
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=false

gbds.url=http://192.168.0.200:8085
gbds.user=ranger
gbds.key=Griaule.123
gbds.logLevel=DEBUG
gbds.timeout=300

bcc.localPort=64041

fingerprint.useSDK=true

locale=en_us

segmentation.debug=true
segmentation.sizeFactor=2000.0
segmentation.fingerprint.minQuality=10
segmentation.fingerprint.extraction=false
segmentation.finishAction=CHECK

config.saveOriginalImagesOnDatabase=true
config.saveOriginalImagesOnGBDS=true
config.keepDatabaseOriginalImagesOnGBDSOK=true
config.keepDatabaseBiometricsOnGBDSOK=true
config.jpegQuality=95
config.threadNumber=8
config.maxZipFileSize=2048000000

# 2GB
config.useNSOCR=false

# Face quality warnings and errors
faceQuality.NO_EYES_AND_MOUTH=error
faceQuality.NO_CROP=error
faceQuality.NOT_SATURATED=error
faceQuality.FACE_TURNED_DOWN=error
faceQuality.FACE_TURNED_UP=error
faceQuality.FACE_TURNED_LEFT=error
faceQuality.FACE_TURNED_RIGHT=error
faceQuality.LOOKING_DOWN=error
faceQuality.LOOKING_UP=error
faceQuality.LOOKING_LEFT=error
faceQuality.LOOKING_RIGHT=error
faceQuality.USING_HEAVY_GLASSES=error
faceQuality.EYE_OBSTRUCTION=error
faceQuality.FACE_CORRECT_POSITION=error
faceQuality.NUMBER_OF_FACES=error
faceQuality.SHOULDER_CORRECT_POSITION=error
faceQuality.SHOULDER_TURNED_LEFT=error
faceQuality.SHOULDER_TURNED_RIGHT=error
faceQuality.TOO_CLOSED_EYES=error
faceQuality.TOO_OPENED_EYES=error
faceQuality.OPENED_MOUTH=error
faceQuality.SHOWING_TEETH=error
faceQuality.SMILING=error
faceQuality.RED_EYE=error
faceQuality.BLURRED_PICTURE=error
faceQuality.BUSY_BACKGROUND=error
faceQuality.CROP_OUT_OF_ORIGINAL_PICTURE=error
faceQuality.qtdeMinErrors=0

# Turns on face ICAO analysis
useICAO=true

zip.baseDir=/home/griaule

server.id=cardscan3
config.send.searchType=ALL_FINGERS
label.cardscan.use=true

cardscan.ip=192.168.0.189
cardscan.port=8087
cardscan.protocol=http

findRgInRegion=false
remove.point.character=false
```


# Configuração do ETR Web Server

## Introdução

Esse manual descreve a configuração dos componentes do lado do servidor do *GBS ETR*. O GBS ETR é uma aplicação que permite o usuário analisar e tratar exceções geradas pelo GBDS.

O procedimento de configuração deve ser feito somente depois do passo de instalação. Para mais informações, consulte o [Manual de Instalação do GBS Apps](/componentes-web/gbsappssetup).

## Configuration

Os passos de configuração são:

1. Configure o [Tomcat](#configuracao-do-tomcat);
2. Configure os [Certificados](#configuracao-de-certificados);
3. Gere a [Senha Criptografada](#criptografia-da-senha-do-banco-de-dados);
4. Habilite o [Best of Biometrics](#habilitando-o-best-of-biometrics);
5. Configure as [Chaves e Biográficos mostrados](#configurando-chaves-e-biograficos-para-aparecerem-na-lista-de-excecoes);
6. Configure o [Destaque de Rótulos](#configuracao-de-destaque-de-rotulo);
7. Configure os [Tratamentos Permitidos](#configuracao-de-tratamentos-permitidos);
8. Configure o [Acesso Web](#configuracao-do-etr);
9. Configure o [Ambiente PSBIO](#configuracao-especifica-para-ambiente-psbio);
10. Configure o [Lights Out](#lights-out);
11. Configure outras [propriedades do config.properties](#configuracoes-finais);

Todos os passos são descritos abaixo.

### Configuração do Tomcat

Edite o arquivo de configuração do Tomcat para configurar os certificados e a porta que a aplicação usará.

```bash
vi /var/lib/tomcats/etr/conf/server.xml
```

Para mudar a porta, procure por `connector port=`. Essa é a porta para operações backend.

### Configuração de Certificados

Para habilitar autenticação SSL, procure por `connector port=` no arquivo `/conf/server.xml`.

Existem duas entradas. A comentada é a configuração para SSL. Remova os delimitadores de comentários `<!--` e `-->`, então ajuste os seguintes parâmetros:

```properties
port="58194"
keystoreFile="/home/griaule/keystore"
keystorePass="password"
keyAlias="1"
clientAuth="true"
truststoreFile="/home/griaule/keystore"
truststorePass="password"
```

O parâmetro `port` deve ser a porta de rede desejada para a aplicação.

Mude o caminho do `keystoreFile` e o `truststoreFile` para os valores apropriados. Faça o mesmo para o `keystorePass` e o `truststorePass`.

O parâmetro `clientAuth="true"` irá requerer autenticação do servidor para o cliente e do cliente para o servidor. Isso significa que o cliente necessitará importar o certificado no navegador para poder acessar a aplicação.

{% hint style="warning" %}
Quando **clientAuth** é definida como *true*, o administrador do sistema deve fornecer o arquivo **certificate.pfx** para os usuários finais.
{% endhint %}

### Criptografia da senha do Banco de Dados

No arquivo `config.properties`, o parâmetro `jdbc.password` é uma senha criptografada. Para gerar a senha criptografada, siga os seguintes passos:

1. Vá para o seguinte diretório:

   ```bash
   cd /var/lib/tomcats/etr/webapps/gbs-etr-server/WEB-INF/lib
   ```
2. Execute o comando:

   ```bash
   java -cp gbs-common-db-<versão>.jar com.griaule.commons.util.EncryptUtil <senhaDesejada>
   ```
3. A senha criptografada aparecerá depois da mensagem: *"Encrypted password is:"*

{% hint style="info" %}
Guarde a senha criptografada. Ela será usada em configurações posteriores.
{% endhint %}

### Habilitando o Best of Biometrics

O Best of Biometrics é uma operação aplicada quando dois ou mais perfis são mesclados ou vinculados.

Quando aplicado, o Best of Biometrics avalia cada template de impressão digital e palmar individualmente e seleciona os templates com a mais alta qualidade em cada dedo e/ou posição da palma entre todas as transações mescladas. Em seguida, atualiza o perfil da pessoa para unificar a "melhor" biometria em uma única transação ativa que será utilizada para comparação biométrica. Esta operação não se aplica aos templates de Face e Iris, nos quais as imagens mais recentes substituirão as mais antigas, independentemente da qualidade.

{% hint style="danger" %}
O Best of Biometrics é um recurso disponível para GBDS e para o ETR. Apesar de cumprirem a mesma função, eles **NÃO** são o mesmo processo e **NÃO DEVEM** estar juntos.

Para mais informações, entre em contato com o time de Suporte da Griaule.
{% endhint %}

Para habilitar o Best of Biometrics no ETR, o banco de dados deve ter os parâmetros `treat.multiMerge.consolidation` e `bob.trustedUpdate.active` definidos como `true`.

Para criar e habilitar os parâmetros:

```sql
INSERT INTO `sphinx`.`settings` (`name`, `type`, `val`) VALUES ('treat.multiMerge.consolidation', 'ETR', 'true');
INSERT INTO `sphinx`.`settings` (`name`, `type`, `val`) VALUES ('bob.trustedUpdate.active', 'ETR', 'true');
```

Para habilitar parâmetros existentes:

```sql
UPDATE `sphinx`.`settings` SET `val`='false' WHERE  `name`='treat.multiMerge.consolidation' AND `type`='ETR';
UPDATE `sphinx`.`settings` SET `val`='false' WHERE  `name`='bob.trustedUpdate.active' AND `type`='ETR';
```

Se o Best of Biometrics estiver ativo e for necessário desativá-lo, use a seguinte query:

```sql
UPDATE `sphinx`.`settings` SET `val`='false' WHERE  `name`='bob.trustedUpdate.active' AND `type`='ETR';
```

### Configurando Chaves e Biográficos para Aparecerem na Lista de Exceções

A aplicação mostra chaves e biográficos na tela de lista de exceções. É possível configurar os campos que serão exibidos (até dois campos), por exemplo: CPF, idn, documentID, nome e qualquer outro campo desejado.

Para configurar um novo campo, é necessário que este campo seja adicionado ao banco de dados MySQL. FaçA login no servidor MySQL usando:

```bash
mysql -u<user> -p
```

Execute a seguinte instrução para verificar os campos existentes:

```sql
use sphinx;

select * from field;
```

Verifique o número de campos que retornam na consulta. Se você já possui 7 campos, a ordem do novo deve ser 8 por exemplo.

Execute a seguinte instrução, alterando os valores de acordo:

```sql
INSERT INTO `sphinx`.`field` (`name`, `description_en_us`, `description_pt_br`, `description_es_es`, `field_type`, `field_kind`, `field_order`, `cardscan`) VALUES ('newField', 'descriptionEN', 'descriptionBR', 'descriptionES', 'string', 'KEY', '8', '1');
```

* newField = nome do campo a ser usado
* descriptionEN = descrição em inglês
* descriptionBR = descrição em português
* descriptionES = descrição em espanhol
* string = o tipo do valor (string ou integer) – chaves e biográficos podem usar string
* KEY = o tipo do campo: `KEY` ou `BIOGRAPHIC`
* 8 = É a ordem dos campos. Basta aumentar o número de campos que já existem (o número atual foi retornado na consulta anterior)
* 1 = habilitar o campo para cardscan. Não é necessário alterar este valor

Execute uma solicitação de **GET** para a URL do endpoint `IP:port/config`.

Copie a resposta (tudo dentro de showFields).

Envie uma solicitação **POST** para a mesma URL do endpoint com as configurações de JSON modificadas (todos os campos desejados devem ser informados - campos antigos e campos novos, caso contrário apenas os campos informados serão considerados):

```json
{
	"showFields": [
		{
			"name": "newField",
			"descriptionEnUs": "descriptionEN",
			"descriptionPtBr": "descriptionBR",
			"required": false,
			"type": "string",
			"kind": "KEY",
			"order": 0,
			"cardscan": true,
			"candidate-list": false
		},
		{
			"name": "name",
			"descriptionEnUs": "Name",
			"descriptionPtBr": "Nome",
			"required": false,
			"type": "string",
			"kind": "BIOGRAPHIC",
			"order": 0,
			"cardscan": true,
			"candidate-list": false
		}
	]
}
```

A resposta correta deve ser:

```json
{
	"status": "OK"
}
```

### Configuração de Destaque de Rótulo

O aplicativo mostra rótulos quando o usuário está analisando uma exceção. É possível configurar a cor de destaque desses rótulos.

Execute uma solicitação de **GET** para o endpoint `IP:port/config`.

Copie a resposta (tudo dentro da configuração do sistema).

Envie uma solicitação **POST** para o mesmo URL do endpoint, alterando o seguinte item no JSON copiado:

```json
{
	"highlightLabels": [
		{
			"label": "OWNED",
			"color": "#ff00f0"
		}
	]
}
```

Neste caso, o rótulo *OWNED* será destacada com a cor especificada.

### Configuração de Tratamentos Permitidos

O ETR usa o arquivo `/var/lib/tomcats/etr/conf/treatments.json` para exibir os tratamentos que estarão disponíveis para o tratamento de exceções:

```default
SAME_FINGERS, DIFFERENT_FINGERS, INCORRECT_ENROLL, MERGE, and RECOLLECT
```

Exemplo:

```json
{
	"key": "enroll.merge",
	"type": "ENROLL",
	"status": "MERGE_TRANSACTIONS",
	"enabled": true,
	"match-person-effect": "MERGE",
	"enroll-effect": "MERGE"
}
```

* O valor da chave com tipo ENROLL pode ser: enroll.same\_fingers, enroll.different\_fingers, enroll.recollect, enroll.merge
* O valor da chave com tipo UPDATE pode ser: update.same\_fingers, update.different\_fingers, update.incorrect\_enroll, update.recollect, update.merge

Para habilitá-lo: defina o valor como `true`. Caso contrário, use `false`.

* O match-person-effect é o efeito que será exibido na tela do ETR para a pessoa de referência no banco de dados. Valores disponíveis: KEEP, DISCARD, MERGE, and BLACKLIST.
* O enroll-effect é o efeito que será exibido na teal do ETR para a pessoa entrante via cadastro no banco de dados. Valores disponíveis: KEEP, DISCARD, MERGE, and BLACKLIST.

## Arquivo de Configuração da Aplicação

Essa seção descreve as possíveis configurações do arquivo `config.properties`. Para acessá-lo, abra-o com:

```bash
vi /var/lib/tomcats/etr/conf/config.properties
```

Um exemplo do arquivo `config.properties` pode ser visto na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="danger" %}
Todas as linhas devem estar presentes no arquivo de configuração. Comentar ou deletar linhas pode causar comportamentos inesperados. Para informações adicionais, contate o Time de Suporte da Griaule.
{% endhint %}

### Configuração do ETR

Esta seção mostrará algumas configurações específicas para o ETR e a configuração do IP e porta da aplicação que o usuário final acessará. O IP e a porta devem ser os mesmos configurados na seção de [Configuração do Tomcat](#configuracao-do-tomcat).

```properties
etr.ip=<ip>
etr.port=<port>
etr.protocol=<protocol>
```

{% hint style="warning" %}
Certifique-se de que os parâmetros de configuração `etr.ip`, `etr.port` e `etr.protocol` estejam corretamente especificados no arquivo `config.properties`. Em diversos casos, o IP será o mesmo para diversas aplicações. Contudo, cada aplicação possuirá uma porta **diferente e única**.
{% endhint %}

O recurso de verificação dupla para o ETR pode ser desabilitado executando a seguinte consulta no banco de dados relacional: ``UPDATE `sphinx`.`settings` SET `val`='false' WHERE `name`='etr.doubleCheck' AND `type`='ETR';``

#### Configuração específica para ambientes extras do ETR

É possível ter mais de uma instância do ETR em execução. É essencial permitir que apenas um ETR escute a notificação de exceção para evitar duplicar as exceções no banco de dados.

O parâmetro de configuração `notification.active` define se o ETR escutará as notificações. Apenas um ETR deve tê-lo como `true`, enquanto todas as outras instâncias devem ser definidas como `false`.

#### Configuração específica para ambiente PSBIO

Para configurar o ambiente para PSBIO:

```properties
gbds.listExceptions.labels=COMMON_NAME_OF_CERTIFICATE
filter.people.pguid=ALL
getMatchedPersonWithTguid=false
```

A configuração `getMatchedPersonWithTguid` define os critérios para recuperar dados em exceções de cadastro (enroll).

* Quando definido como `true`, o perfil de referência será recuperando usando o **Transaction GUID (TGUID)**
* Quando definido como `false`, o perfil de referência será recuperando usando o **Person GUID (PGUID)**

Ao definir esse valor de configuração como `true`, a recuperação do perfil não será afetada por nenhuma atualização da pessoa de referência.

{% hint style="info" %}
Essa configuração não tem efeito nas exceções de **atualização**.
{% endhint %}

{% hint style="danger" %}
É estritamente recomendado não alterar a configuração `filter.people.pguid` sem a devida orientação, sob o risco de comprometer o funcionamento do ETR. Para mais informações, entre em contato com o Time de Suporte da Griaule.
{% endhint %}

### Lights Out

O Lights Out é um recurso que permite que exceções de cadastro e atualização sejam tratadas automaticamente de acordo com os parâmetros configurados. Para permitir que o lightsOut trate uma exceção, os parâmetros `lightsOut.enroll.active` e `lightsOut.update.active` devem ser definidos como verdadeiros. Os valores possíveis são `true` ou `false`.

{% hint style="danger" %}
Para que o Lights Out funcione corretamente, **TODOS** os parâmetros de configuração do Lights Out no arquivo `config.properties` devem estar presentes, conforme descrito no arquivo de exemplo na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao). A falta ou exclusão de alguns parâmetros de configuração pode causar problemas de comportamento inesperados.
{% endhint %}

Além disso, o usuário pode personalizar o Lights Out para cada operação de cadastro ou atualização para usar outras informações biométricas ou biográficas. As opções personalizáveis referem-se a impressões digitais, face, íris, informações biográficas e rótulos e estão descritas abaixo.

{% hint style="warning" %}
Todos os parâmetros abaixo estão disponíveis para as operações de cadastro e atualização, portanto, em `*lightsOut.{operação}.*`, o texto `{operação}` deve ser substituído por `enroll` ou `update`, como exemplo o parâmetro `lightsOut.{operação}.minimum.fingerprints` pode ser `lightsOut.update.minimum.fingerprints` ou `lightsOut.enroll.minimum.fingerprints`.
{% endhint %}

#### Configuração de Rótulo

A configuração do rótulo pode ser definida em `lightsOut.{operação}.disabled.labels`, ele aceita mais de um rótulo por vez e o valor padrão é vazio. A escolha de um ou mais valores desativará o Lights Out se pelo menos um deles estiver presente no perfil do participante.

#### Configuração de Digitais

Para impressões digitais, existem três parâmetros disponíveis, são eles:

* `lightsOut.{operação}.minimum.fingerprints`, que define as correspondências mínimas de impressão digital que devem ocorrer para permitir que Lights Out execute o tratamento;
* `lightsOut.{operação}.fingerScore.any_finger`, que define o limite para todos os dedos;
* `lightsOut.{operação}.fingerScore.{lado}_{dedo}`, que define o limite para um dedo especificado. {lado} é para a esquerda ou direita e {dedo} é o nome do dedo. Os possíveis valores são:
  * {lado}: left or right.
  * {dedo}: little, ring, middle, index, and thumb.

O parâmetro `.any_finger` será ignorado para um dedo se o limite do dedo específico for diferente de zero, por exemplo, se `lightsOut.{operação}.fingerScore.right_ring=80`, o limite para o dedo anelar direito será 80 em vez do definido em `lightsOut.{operação}.fingerScore.any_finger`.

Todos esses parâmetros de operação são definidos por `lightsOut.{operação}.fingerScoresRule`, que pode ter os valores `AT_LEAST_MINIMUM`, onde é necessário atingir pelo menos o limite no número de impressões digitais configurado em `lightsOut.{operação}.minimum.fingerprints` para que o Lights Out trate a exceção, ou `ALL`, onde todas as pontuações de impressão digital devem atingir o limite de pontuação.

#### Configuração de Face

Os parâmetros configuráveis de face são: `lightsOut.{operação}.useFace` para habilitar o uso de face e é `lightsOut.{operação}.faceScore` para definir o limiar de qualidade.

#### Configuração de Íris

Os parâmetros configuráveis de íris são:

* `lightsOut.{operação}.useIris` que define se a íris será usada;
* `lightsOut.{operação}.minimum.irises`, que define a quantidade mínima de íris necessária;
* `lightsOut.{operação}.irisScore.any_iris` define o limiar de qualidade para todas as íris;

  > Esse valor será usado se `lightsOut.{operação}.irisScore.left_iris` ou `lightsOut.enroll.irisScore.right_iris` estiverem definidas como 0, senão, o valor dos últimos dois parâmetros será usado.

#### Configuração Biográfica

As informações biográficas para Lights Out podem ser ativadas no parâmetro `lightsOut.{operação}.useBiographics`, os valores possíveis para esses parâmetros são `true` ou `false`.

As chaves biográficas que precisam estar presentes podem ser listadas no parâmetro `lightsOut.{operação}.biographicRules` para `key:MATCH` ou `key:NOT_MATCH`. Esta configuração aceita mais de um parâmetro por vez, por exemplo:

O parâmetro de configuração `lightsOut.enroll.biographicRules=key1:MATCH, key2:MATCH, key3:NOT_MATCH` só aplicará o tratamento Lights Out à operação de registro se key1 e key2 corresponderem em ambos os perfis, key3 não corresponder e as outras regras pré-definidas, como useFace, useIris, limiar de dedos e número mínimo de correspondências de digitais também forem válidas.

{% hint style="info" %}
Se alguma dessas informações biométricas e/ou biográficas for escolhida para ser usada no Lights Out e o perfil não possuir essa informação, por exemplo, não possuir captura de íris e `lightsOut.{operação}.useIris=true`, o Lights Out não realizará o tratamento.
{% endhint %}

A ação executada para o tratamento automático de exceções pode ser definida através do parâmetro `lightsOut.{operação}.treatStatus`, os valores possíveis são os mesmos valores possíveis para o tratamento da exceção pelo ETR. Além disso, um comentário para o tratamento escolhido pode ser personalizado no parâmetro `lightsOut.{operação}.treatComments`.

### Configurações de Pooling

A configuração de pooling controla o comportamento de paginação do ETR. Duas configurações o controlam: `pollingPaginationMode` e `pollingPagination.size`. A primeira controla se está ativo ou não, a segunda controla quantas exceções serão exibidas por paginação. A paginação padrão do GBDS é 1000.

### Configurações de Transações Recusadas

As configurações de transações recusadas controlam se o ETR deve reenviar uma transação recusada após todas as exceções que geraram essa transação serem resolvidas.

Uma transação recusada é uma transação que gerou uma exceção com outra transação que também tem uma exceção. Exemplo:

```default
1 - O Perfil A está no GBDS
2 - Você enviou uma Transação A e essa transação gerou uma exceção com o Perfil A
3 - Depois, você enviou uma Transação B e essa transação gerou uma exceção com a Transação A.
4 - O GBDS marcará a Transação B como RECUSADA.
```

Este recurso reenviará a Transação B após a exceção gerada pela Transação A ser tratada. Para habilitar este recurso, defina `refused.active` como verdadeiro. O parâmetro `resend.tries` define o número máximo de vezes que o ETR tentará reenviar uma transação recusada.

Outras configurações controlam o atraso na operação. Estes são `updateStatusDelay`, `verifyStatusDelay`, `listRefusedDelay` e `deleteRefusedDelay`. O tempo de atraso é definido em **segundos**.

### Configurações finais

As configurações finais que requerem atenção e devem ser editadas para corresponder a cada implementação específica são `jdbc.url`, `jdbc.username`, `jdbc.password` e `gbds.url`. Configure os parâmetros de acordo com o ambiente.

Alguns detalhes de propriedades são mostrados na subseção abaixo.

{% hint style="info" %}
Lembre-se de substituir a senha criptografada gerada na seção [Criptografia da senha do Banco de Dados](#criptografia-da-senha-do-banco-de-dados) neste arquivo.
{% endhint %}

#### Descrição de Configurações

**listAnalysisTreatments.initialTimestamp**

> O ETR atualiza a lista de exceções pendentes por meio de consultas ao GBDS que são restritas por um intervalo de tempo. Este parâmetro define o início deste intervalo de tempo, expresso no formato **DD/MM/AAAA HH:MM:SS**. Exceções pendentes anteriores a este valor **não** serão listadas nos clientes ETR.

**listAnalysisTreatments.offset**

> Essa propriedade controla a duração do intervalo de tempo usado para consultar o GBDS para exceções pendentes, conforme descrito em **listAnalysisTreatments.initialTimestamp.** O valor pode ser expresso em dias, horas, minutos ou segundos: `1d`, `5h`, `30m` ou `460s`.

**listTreatedTreatments.initialTimestamp**

> O ETR atualiza a lista de exceções tratadas por meio de consultas ao GBDS que são restritas por um intervalo de tempo. Este parâmetro define o início deste intervalo de tempo, expresso no formato **DD/MM/AAAA HH:MM:SS**. Exceções tratadas antes desse valor não serão listadas nos clientes ETR.

**listTreatedTreatments.offset**

> Essa propriedade controla a duração do intervalo de tempo usado para consultar o GBDS para exceções tratadas, conforme descrito em **listTreatedTreatments.initialTimestamp**. O valor pode ser expresso em dias, horas, minutos ou segundos: `1d`, `5h`, `30m` ou `460s`.

**listTreatments.analysisAndTreated.synchronized**

> Esta propriedade define a listagem de tratamentos na ETR. Se `true`, o aplicativo listará primeiro todas as análises não tratadas e depois as tratadas. Se `false`, o aplicativo listará com base no intervalo de tempo da análise.

**listTreatments.offsetDelay.milliseconds**

> Esta propriedade controla a duração do atraso entre cada chamada do GBDS.

## Finalizando as Configurações

Após completar todos os passos de configuração, volte para o [Manual de Instalação do GBS Apps - Seção de Configuração](/componentes-web/gbsappssetup#configuracoes).

## Double Blind

A análise de Double Blind é usada quando há necessidade de cada decisão passar por uma segunda análise para confirmar a decisão. Se a segunda decisão for diferente da primeira, haverá um terceiro e último veredito de um supervisor.

Para ativar ou desativar o Double Blind, a instalação do ETR Server deve estar completa. Para alterar seu status, proceda da seguinte forma:

1. Entre no MySQL
2. Atualize a configuração da tabela de banco de dados sphinx com uma das seguintes queries:

   ```sql
   #DEACTIVATE

   UPDATE `sphinx`.`settings` SET `val`='false' WHERE  `name`='etr.doubleCheck' AND `type`='ETR';
   commit;

   #ACTIVATE

   UPDATE `sphinx`.`settings` SET `val`='true' WHERE  `name`='etr.doubleCheck' AND `type`='ETR';
   commit;
   ```
3. Reset ETR Server

## Exemplo do Arquivo de Configuração

Essa seção mostra um exemplo do arquivo `config.properties`.

```properties
#     /$$$$$$$$ /$$$$$$$$ /$$$$$$$
#    | $$_____/|__  $$__/| $$__  $$
#    | $$         | $$   | $$  \ $$
#    | $$$$$      | $$   | $$$$$$$/
#    | $$__/      | $$   | $$__  $$
#    | $$         | $$   | $$  \ $$
#    | $$$$$$$$   | $$   | $$  | $$
#    |________/   |__/   |__/  |__/

# **************************************************************************************************************
# DATABASE (RDB)

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/etr?useSSL=false
jdbc.username=griaule
jdbc.password=CDrt8vbewA2YAubPNOLZkw==
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=false

# **************************************************************************************************************
# GBDS CONNECTION (& AUTHENTICATION LDAP ONLY)

gbds.url=http://localhost:8085
gbds.user=gbds_bind
gbds.key=Griaule.123
gbds.logLevel=INFO
gbds.timeout=300
gbds.listExceptions.label=

# **************************************************************************************************************
# ETR * GUI

etr.ip=127.0.0.1
etr.port=8089
etr.protocol=http
locale=en_us

# **************************************************************************************************************
# ETR * CONFIGURATION

biometric.modules=FINGERPRINT,FACE
faceQuality.qtdeMinErrors=2
filter.people.pguid=ALL
fingerprint.useSDK=true
gbds.etrUser=etr_server
getMatchedPersonWithTguid.enroll=true
getMatchedPersonWithTguid.update=true
highlight.labels=
listFields=KEY:documentID,BIOGRAPHIC:name
notification.active=true
pollingPagination.size=20
pollingPaginationMode=true
profile.cacheSize=100
profile.cacheTime=5m
same.user.simultaneous.login=false
showField.tguid=true
sync.logLevel=INFO

# **************************************************************************************************************
# ETR * SEND TREATMENTS

sendTreatments.active=true

# **************************************************************************************************************
# ETR * SEARCH TREATMENTS

verifyTreatments.active=true
verifyTreatments.interval.seconds=5
verifyTreatments.maxTries=5

# **************************************************************************************************************
# ETR * POLL ANALYSIS

listAnalysisTreatments.active=true
listAnalysisTreatments.interval.minutes=30
listAnalysisTreatments.delay.minutes=5
listAnalysisTreatments.initialTimestamp=01/01/2020 00:00:00
listAnalysisTreatments.offset=1d

# **************************************************************************************************************
# ETR * POLL TREATED

listTreatedTreatments.active=true
listTreatedTreatments.interval.minutes=120
listTreatedTreatments.initialTimestamp=01/01/2020 00:00:00
listTreatedTreatments.offset=1d

# **************************************************************************************************************
# ETR * LIST TREATED

listTreatments.analysisAndTreated.synchronized=true
listTreatments.offsetDelay.milliseconds=0

# **************************************************************************************************************
# ETR * LO (ENABLE/DISABLE)

lightsOut.enroll.active=false
lightsOut.enroll.disabled.labels=

lightsOut.update.active=false
lightsOut.update.disabled.labels=

# **************************************************************************************************************
# ETR * LO FINGERPRINT

lightsOut.enroll.minimum.fingerprints=12
lightsOut.enroll.fingerScore.any_finger=50
lightsOut.enroll.fingerScore.left_little=60
lightsOut.enroll.fingerScore.left_ring=80
lightsOut.enroll.fingerScore.left_middle=0
lightsOut.enroll.fingerScore.left_index=0
lightsOut.enroll.fingerScore.left_thumb=0
lightsOut.enroll.fingerScore.right_little=0
lightsOut.enroll.fingerScore.right_ring=0
lightsOut.enroll.fingerScore.right_middle=0
lightsOut.enroll.fingerScore.right_index=0
lightsOut.enroll.fingerScore.right_thumb=0
lightsOut.enroll.fingerScoresRule=AT_LEAST_MINIMUM

lightsOut.update.minimum.fingerprints=10
lightsOut.update.fingerScore.any_finger=100
lightsOut.update.fingerScore.left_little=100
lightsOut.update.fingerScore.left_ring=100
lightsOut.update.fingerScore.left_middle=0
lightsOut.update.fingerScore.left_index=0
lightsOut.update.fingerScore.left_thumb=0
lightsOut.update.fingerScore.right_little=0
lightsOut.update.fingerScore.right_ring=0
lightsOut.update.fingerScore.right_middle=0
lightsOut.update.fingerScore.right_index=0
lightsOut.update.fingerScore.right_thumb=0
lightsOut.update.fingerScoresRule=ALL

# **************************************************************************************************************
# ETR * LO OTHER (FACE/IRIS/BIOGRAPHIC)

lightsOut.enroll.useFace=false
lightsOut.enroll.faceScore=70
lightsOut.enroll.useIris=false
lightsOut.enroll.minimum.irises=0
lightsOut.enroll.irisScore.any_iris=0
lightsOut.enroll.irisScore.left_iris=0
lightsOut.enroll.irisScore.right_iris=0
lightsOut.enroll.useBiographics=false
lightsOut.enroll.biographicRules=name:MATCH

lightsOut.update.useFace=false
lightsOut.update.faceScore=100
lightsOut.update.useIris=false
lightsOut.update.minimum.irises=0
lightsOut.update.irisScore.any_iris=0
lightsOut.update.irisScore.left_iris=0
lightsOut.update.irisScore.right_iris=0
lightsOut.update.useBiographics=false
lightsOut.update.biographicRules=name:MATCH

# **************************************************************************************************************
# ETR * LO TREATMENT

lightsOut.enroll.treatStatus=MERGE_TRANSACTIONS
lightsOut.enroll.treatComments=Treated by ETR Lights Out

lightsOut.update.treatStatus=SAME_FINGERS
lightsOut.update.treatComments=Treated by ETR Lights Out

# **************************************************************************************************************
# ETR * Refused Thread

refused.active=true
updateStatusDelay=60
verifyRefusedDelay=60
listRefusedDelay=60
deleteRefusedDelay=60
resend.tries=3

# *************************************************************************************************************
# ADDITIONAL CONFIGURATION
#gbds.additionalHeaders={}
#gbds.flushDebugRequests=false
#gbds.proxy.url=
#gbds.proxy.port=
#gbds.enroll.priority=DEFAULT_PRIORITY
#gbds.trustedEnroll.priority=DEFAULT_PRIORITY
#externalIdName=null
```


# Configuração do MIR Web Server

## Introdução

Esse manual descreve a configuração dos componentes do lado do servidor da aplicação *GBS MIR*. O GBS MIR é uma aplicação projetada para auxiliar examinadores no tratamento biométrico de transações de cadastro que requerem revisão manual.

O procedimento de configuração deve ser feito somente depois do passo de instalação. Para mais informações, consulte o [Manual de Instalação do GBS Apps](/componentes-web/gbsappssetup).

## Configuração

Os passos de configuração são:

1. Configure o Tomcat;
2. Configure os Certificados;
3. Gere a senha criptografada;
4. Finalize as configurações no arquivo config.properties.

Todos os passos são descritos abaixo. Um exemplo do arquivo `config.properties` pode ser visto na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="danger" %}
Todas as linhas devem estar presentes no arquivo de configuração. Comentar ou deletar linhas pode causar comportamentos inesperados. Para informações adicionais, contate o Time de Suporte da Griaule.
{% endhint %}

### Configuração do Tomcat

Edite o arquivo de configuração do Tomcat para configurar os certificados e a porta que a aplicação usará.

```sh
vi /var/lib/tomcats/mir/conf/server.xml
```

Para mudar a porta, procure por `connector port=`. Essa é a porta para operações backend.

### Configuração de Certificados

Para habilitar autenticação SSL, procure por `connector port=` no arquivo `/conf/server.xml`.

Existem duas entradas. A comentada é a configuração para SSL. Remova os delimitadores de comentários `<!--` e `-->`, então ajuste os seguintes parâmetros:

```properties
port="58194"
keystoreFile="/home/griaule/keystore"
keystorePass="password"
keyAlias="1"
clientAuth="true"
truststoreFile="/home/griaule/keystore"
truststorePass="password"
```

O parâmetro `port` deve ser a porta de rede desejada para a aplicação.

Mude o caminho do `keystoreFile` e o `truststoreFile` para os valores apropriados. Faça o mesmo para o `keystorePass` e o `truststorePass`.

O parâmetro `clientAuth="true"` irá requerer autenticação do servidor para o cliente e do cliente para o servidor. Isso significa que o cliente necessitará importar o certificado no navegador para poder acessar a aplicação.

{% hint style="warning" %}
Quando **clientAuth** é definida como *true*, o administrador do sistema deve fornecer o arquivo **certificate.pfx** para os usuários finais.
{% endhint %}

### Criptografia da senha do Banco de Dados

No arquivo `config.properties`, o parâmetro `jdbc.password` é uma senha criptografada. Para gerar a senha criptografada, siga os seguintes passos:

1. Vá para o seguinte diretório:

   ```sh
   cd /var/lib/tomcats/mir/webapps/gbs-mir-server/WEB-INF/lib
   ```
2. Execute o comando:

   ```sh
   java -cp gbs-common-db-<versão>.jar com.griaule.commons.util.EncryptUtil <senhaDesejada>
   ```
3. A senha criptografada aparecerá depois da mensagem: *"Encrypted password is:"*

{% hint style="info" %}
Guarde a senha criptografada. Ela será usada em configurações posteriores.
{% endhint %}

### Arquivo de Configuração da Aplicação

Para configurar o arquivo, abra-o com:

```sh
vi /var/lib/tomcats/best/conf/config.properties
```

As mudanças mais importantes nesse arquivo são os parâmetros `jdbc.url`, `jdbc.username`, `jdbc.password` e `gbds.url`. Configure-os de acordo com seu ambiente.

O arquivo de configuração completa é mostrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao)

{% hint style="info" %}
Lembre-se de substituir a senha criptografada gerada na seção [Criptografia da senha do Banco de Dados](#criptografia-da-senha-do-banco-de-dados) neste arquivo.
{% endhint %}

#### Configuração do MIR

O último passo é configurar o IP e a porta da aplicação que o usuário final irá acessar. Ele deve ser o mesmo IP e porta configurado na seção [Configuração do Tomcat](#configuracao-do-tomcat).

```properties
mir.ip=<ip>
mir.port=<port>
mir.protocol=<protocol>
```

{% hint style="warning" %}
Certifique-se de que os parâmetros de configuração `mir.ip`, `mir.port` e `mir.protocol` estejam corretamente especificados no arquivo `config.properties`. Em diversos casos, o IP será o mesmo para diversas aplicações. Contudo, cada aplicação possuirá uma porta **diferente e única**.
{% endhint %}

## Finalizando as Configurações

Após completar todos os passos de configuração, volte para o [Manual de Instalação do GBS Apps - Seção de Configuração](/componentes-web/gbsappssetup#configuracoes).

## Exemplo do Arquivo de Configuração

Essa seção mostra um exemplo do arquivo `config.properties`.

```properties
# GBS MIR Server

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.0.200:3306/etr?useSSL=false
jdbc.username=root
jdbc.password=CDrt8vbewA2YAubPNOLZkw==
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=false

locale=en_us

gbds.url=http://192.168.0.200:8085
gbds.user=gbds.authenticate
gbds.key=Griaule.123
gbds.logLevel=INFO
gbds.timeout=300
gbds.listExceptions.label=

fingerprint.useSDK=true

listFields=KEY:RG

gbds.mirUser=mir_server
sync.logLevel=INFO
same.user.simultaneous.login=false

server.standalone.port=8185

biometric.modules=FINGERPRINT,FACE
highlight.labels=

profile.cacheSize=100

mir.ip=127.0.0.1
mir.port=8120
mir.protocol=http
```


# Configuração do BEST Web Server

## Introdução

Esse manual descreve a configuração dos componentes do lado do servidor do *GBS BEST Server*.

O procedimento de configuração deve ser feito somente depois do passo de instalação. Para mais informações, consulte o [Manual de Instalação do GBS Apps](/componentes-web/gbsappssetup).

## Configuração

Os passos de configuração são:

1. Configure o Tomcat;
2. Configure os Certificados;
3. Gere a senha criptografada;
4. Finalize as configurações no arquivo config.properties.

Todos os passos são descritos abaixo. Um exemplo do arquivo `config.properties` pode ser visto na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="danger" %}
Todas as linhas devem estar presentes no arquivo de configuração. Comentar ou deletar linhas pode causar comportamentos inesperados. Para informações adicionais, contate o Time de Suporte da Griaule.
{% endhint %}

### Configuração do Tomcat

Edite o arquivo de configuração do Tomcat para configurar os certificados e a porta que a aplicação usará.

```sh
vi /var/lib/tomcats/best/conf/server.xml
```

Para mudar a porta, procure por `connector port=`. Essa é a porta para operações backend.

### Configuração de Certificados

Para habilitar autenticação SSL, procure por `connector port=` no arquivo `/conf/server.xml`.

Existem duas entradas. A comentada é a configuração para SSL. Remova os delimitadores de comentários `<!--` e `-->`, então ajuste os seguintes parâmetros:

```properties
port="58194"
keystoreFile="/home/griaule/keystore"
keystorePass="password"
keyAlias="1"
clientAuth="true"
truststoreFile="/home/griaule/keystore"
truststorePass="password"
```

O parâmetro `port` deve ser a porta de rede desejada para a aplicação.

Mude o caminho do `keystoreFile` e o `truststoreFile` para os valores apropriados. Faça o mesmo para o `keystorePass` e o `truststorePass`.

O parâmetro `clientAuth="true"` irá requerer autenticação do servidor para o cliente e do cliente para o servidor. Isso significa que o cliente necessitará importar o certificado no navegador para poder acessar a aplicação.

{% hint style="warning" %}
Quando **clientAuth** é definida como *true*, o administrador do sistema deve fornecer o arquivo **certificate.pfx** para os usuários finais.
{% endhint %}

### Criptografia da senha do Banco de Dados

No arquivo `config.properties`, o parâmetro `jdbc.password` é uma senha criptografada. Para gerar a senha criptografada, siga os seguintes passos:

1. Vá para o seguinte diretório:

   ```sh
   cd /var/lib/tomcats/best/webapps/gbs-best-server/WEB-INF/lib
   ```
2. Execute o comando:

   ```sh
   java -cp gbs-common-db-<versão>.jar com.griaule.commons.util.EncryptUtil <senhaDesejada>
   ```
3. A senha criptografada aparecerá depois da mensagem: *"Encrypted password is:"*

{% hint style="info" %}
Guarde a senha criptografada. Ela será usada em configurações posteriores.
{% endhint %}

### Filtro de Busca por Rótulos

Algumas configurações BEST podem ser feitas através dos bancos de dados, como os dos rótulos para filtro de pesquisa. Essa configuração é uma lista de rótulos que o usuário pode selecionar na configuração de pesquisa de fragmentos para restringir a lista de candidatos.

Para configurar os rótulos desejados, você precisa incluir os rótulos na linha `search.labels` na tabela `sphinx.settings`. Observe que os rótulos devem ser separados por vírgula.

Esses rótulos ficarão visíveis para todos os usuários do BEST.

### Arquivo de Configuração da Aplicação

Para configurar o arquivo, abra-o com:

```sh
vi /var/lib/tomcats/best/conf/config.properties
```

As mudanças mais importantes nesse arquivo são os parâmetros `jdbc.url`, `jdbc.username`, `jdbc.password` e `gbds.url`. Configure-os de acordo com seu ambiente.

O arquivo de configuração completa é mostrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao)

{% hint style="info" %}
Lembre-se de substituir a senha criptografada gerada na seção [Criptografia da senha do Banco de Dados](#criptografia-da-senha-do-banco-de-dados) neste arquivo.
{% endhint %}

#### Rótulo de Segregação de Caso

É possível segregar os casos que um usuário vê no software. Para fazer isso, você precisa adicionar uma permissão nas configurações do LDAP.

Dentro de um grupo de usuários no LDAP, adicione o rótulo no formato `best_org_{rotulo}`, ex. `best_org__MG`. Novos casos criados por usuários deste grupo terão este rótulo e o caso será visível apenas para usuários com as permissões corretas para visualizar casos com esse rótulo.

{% hint style="info" %}
Casos criados antes da adição dos rótulos não serão modificados.
{% endhint %}

#### Uso de vários nós

O BEST pode ser usado em mais de um nó de servidor. Para permitir isso, o servidor mestre deve ter a configuração `poolingUL.active` definido como `true`, e outros nós devem tê-la definido como `false`.

{% hint style="warning" %}
Lembre-se de definir um balanceamento de carga entre os nós se estiver usando este método.
{% endhint %}

#### Configurações do BEST

O último passo é configurar o IP e a porta da aplicação que o usuário final irá acessar. Ele deve ser o mesmo IP e porta configurado na seção [Configuração do Tomcat](#configuracao-do-tomcat).

```properties
best.ip=<ip>
best.port=<port>
best.protocol=<protocol>
```

{% hint style="warning" %}
Certifique-se de que os parâmetros de configuração `best.ip`, `best.port` e `best.protocol` estejam corretamente especificados no arquivo `config.properties`. Em diversos casos, o IP será o mesmo para diversas aplicações. Contudo, cada aplicação possuirá uma porta **diferente e única**.
{% endhint %}

## Finalizando as Configurações

Após completar todos os passos de configuração, volte para o [Manual de Instalação do GBS Apps - Seção de Configuração](/componentes-web/gbsappssetup#configuracoes).

## Exemplo do Arquivo de Configuração

Essa seção mostra um exemplo do arquivo `config.properties`.

```properties
# GBS BEST Server

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.0.200:3306/forensic?useSSL=false
jdbc.username=root
jdbc.password=CDrt8vbewA2YAubPNOLZkw==
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=false

# GBDS connection
gbds.url=http://192.168.0.200:8085
gbds.user=admin
gbds.key=griaule123
gbds.logLevel=DEBUG

session.expirationTime=8h
same.user.simultaneous.login=true

locale=en_us

fingerprint.useSDK=true
useLatentExtrator.fingerprint=true
useLatentExtrator.palmprint=false

image.convert.useJnbis=false

poolingSearch.active=true
poolingSearch.time=5

poolingUL.active=true
poolingUL.time=300

extratorServer.firstPort=8100
extratorServer.processNumber=4

faceQuality.qtdeMinErrors=2

session.expirationTime=8h

server.standalone.port=8085

best.ip=127.0.0.1
best.port=8123
best.protocol=http

# Path to save the videos (the face detection and extraction service needs to access this path)
fileDir=/var/lib/apache-tomcat-best/videos

# Endpoint for face detection/extraction service
detect.group.url=http://172.16.0.70:8127/v1/detection/

# Number of best faces desired for each identify (at least 1)
detect.numberBestFaces=5

# Number of threads (BEST server will import and search the faces in parallel)
identity.threadSize=4

# Frame detection step. If 3, only 1 out of 3 frames will be considered
detect.framesStep=3

# Faces must appear in at least this number of frames to be considered valid
detect.framesAppearingFilter=30

# Facelib match threshold
detect.matchThreshold=65
```


# Configuração do Intelligence Web Server

## Introdução

Esse manual descreve a configuração dos componentes do lado do servidor da aplicação *GBS Intelligence*. O Intelligence é uma aplicação que realiza buscas no banco de dados do GBDS com valores textuais como identificadores.

O procedimento de configuração deve ser feito somente depois do passo de instalação. Para mais informações, consulte o [Manual de Instalação do GBS Apps](/componentes-web/gbsappssetup).

## Configuração

Os passos de configuração são:

1. Configure o Tomcat;
2. Configure os Certificados;
3. Gere a senha criptografada;
4. Finalize as configurações no arquivo config.properties.

Todos os passos são descritos abaixo. Um exemplo do arquivo `config.properties` pode ser visto na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="danger" %}
Todas as linhas devem estar presentes no arquivo de configuração. Comentar ou deletar linhas pode causar comportamentos inesperados. Para informações adicionais, contate o Time de Suporte da Griaule.
{% endhint %}

### Configuração do Tomcat

Edite o arquivo de configuração do Tomcat para configurar os certificados e a porta que a aplicação usará.

```sh
vi /var/lib/tomcats/intelligence/conf/server.xml
```

Para mudar a porta, procure por `connector port=`. Essa é a porta para operações backend.

### Configuração de Certificados

Para habilitar autenticação SSL, procure por `connector port=` no arquivo `/conf/server.xml`.

Existem duas entradas. A comentada é a configuração para SSL. Remova os delimitadores de comentários `<!--` e `-->`, então ajuste os seguintes parâmetros:

```properties
port="58194"
keystoreFile="/home/griaule/keystore"
keystorePass="password"
keyAlias="1"
clientAuth="true"
truststoreFile="/home/griaule/keystore"
truststorePass="password"
```

O parâmetro `port` deve ser a porta de rede desejada para a aplicação.

Mude o caminho do `keystoreFile` e o `truststoreFile` para os valores apropriados. Faça o mesmo para o `keystorePass` e o `truststorePass`.

O parâmetro `clientAuth="true"` irá requerer autenticação do servidor para o cliente e do cliente para o servidor. Isso significa que o cliente necessitará importar o certificado no navegador para poder acessar a aplicação.

{% hint style="warning" %}
Quando **clientAuth** é definida como *true*, o administrador do sistema deve fornecer o arquivo **certificate.pfx** para os usuários finais.
{% endhint %}

### Criptografia da senha do Banco de Dados

No arquivo `config.properties`, o parâmetro `jdbc.password` é uma senha criptografada. Para gerar a senha criptografada, siga os seguintes passos:

1. Vá para o seguinte diretório:

   ```sh
   cd /var/lib/tomcats/intelligence/webapps/gbs-intelligence-server/WEB-INF/lib
   ```
2. Execute o comando:

   ```sh
   java -cp gbs-common-db-<versão>.jar com.griaule.commons.util.EncryptUtil <senhaDesejada>
   ```
3. A senha criptografada aparecerá depois da mensagem: *"Encrypted password is:"*

{% hint style="info" %}
Guarde a senha criptografada. Ela será usada em configurações posteriores.
{% endhint %}

### Arquivo de Configuração da Aplicação

Para configurar o arquivo, abra-o com:

```sh
vi /var/lib/tomcats/intelligence/conf/config.properties
```

As mudanças mais importantes nesse arquivo são os parâmetros `jdbc.url`, `jdbc.username`, `jdbc.password` e `gbds.url`. Configure-os de acordo com seu ambiente.

O arquivo de configuração completo é mostrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="info" %}
Lembre-se de substituir a senha criptografada gerada na seção [Criptografia da senha do Banco de Dados](#criptografia-da-senha-do-banco-de-dados) neste arquivo.
{% endhint %}

#### Configurações do Intelligence

O último passo é configurar o IP e a porta da aplicação que o usuário final irá acessar. Ele deve ser o mesmo IP e porta configurado na seção [Configuração do Tomcat](#configuracao-do-tomcat).

```properties
intelligence.ip=<ip>
intelligence.port=<port>
intelligence.protocol=<protocol>
```

{% hint style="warning" %}
Certifique-se de que os parâmetros de configuração `intelligence.ip`, `intelligence.port` e `intelligence.protocol` estejam corretamente especificados no arquivo `config.properties`. Em diversos casos, o IP será o mesmo para diversas aplicações. Contudo, cada aplicação possuirá uma porta **diferente e única**.
{% endhint %}

## Finalizando as Configurações

Após completar todos os passos de configuração, volte para o [Manual de Instalação do GBS Apps - Seção de Configuração](/componentes-web/gbsappssetup#configuracoes).

## Exemplo do Arquivo de Configuração

Essa seção mostra um exemplo do arquivo `config.properties`.

```properties
#  /$$$$$$ /$$   /$$ /$$$$$$$$ /$$$$$$$$ /$$       /$$       /$$$$$$  /$$$$$$  /$$$$$$$$ /$$   /$$  /$$$$$$  /$$$$$$$$
# |_  $$_/| $$$ | $$|__  $$__/| $$_____/| $$      | $$      |_  $$_/ /$$__  $$| $$_____/| $$$ | $$ /$$__  $$| $$_____/
#   | $$  | $$$$| $$   | $$   | $$      | $$      | $$        | $$  | $$  \__/| $$      | $$$$| $$| $$  \__/| $$
#   | $$  | $$ $$ $$   | $$   | $$$$$   | $$      | $$        | $$  | $$ /$$$$| $$$$$   | $$ $$ $$| $$      | $$$$$
#   | $$  | $$  $$$$   | $$   | $$__/   | $$      | $$        | $$  | $$|_  $$| $$__/   | $$  $$$$| $$      | $$__/
#   | $$  | $$\  $$$   | $$   | $$      | $$      | $$        | $$  | $$  \ $$| $$      | $$\  $$$| $$    $$| $$
#  /$$$$$$| $$ \  $$   | $$   | $$$$$$$$| $$$$$$$$| $$$$$$$$ /$$$$$$|  $$$$$$/| $$$$$$$$| $$ \  $$|  $$$$$$/| $$$$$$$$
# |______/|__/  \__/   |__/   |________/|________/|________/|______/ \______/ |________/|__/  \__/ \______/ |________/

# ***********************************************************************************************************************
# DATABASE (RDB)

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://<db-ip>:3306/sphinx?useSSL=false
jdbc.username=<db-username>
jdbc.password=<db-password>
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=false

# ***********************************************************************************************************************
# GBDS CONNECTION (& AUTHENTICATION LDAP ONLY)

gbds.url=http://<gbds-ip>:8085
gbds.user=<gbds-username>
gbds.key=<gbds-password>
gbds.logLevel=INFO
gbds.timeout=300
gbds.intelligenceUser=intelligence_server

# ***********************************************************************************************************************
# INTELLIGENCE * GUI

intelligence.ip=<intelligence-ip>
intelligence.port=8122
intelligence.protocol=http
locale=en_us

# ***********************************************************************************************************************
# INTELLIGENCE * CONFIGURATION

biometric.modules=FINGERPRINT,FACE
fingerprint.useSDK=true
highlight.labels=
listFields=KEY:documentID
pollingPagination.size=20
pollingPaginationMode=true
profile.cacheSize=100
same.user.simultaneous.login=false
server.standalone.port=8085
sync.logLevel=INFO

# ***********************************************************************************************************************
# ADDITIONAL CONFIGURATION

listFields=KEY:documentID
alwaysSearchExternalIDS=false
```


# Configuração do SmartSense Server

## Introdução

Esse manual descreve a configuração dos componentes do lado do servidor da aplicação *GBS SmartSense*. O GBS SmartSense é uma aplicação desenvolvida para monitorar Clusters GBDS, permitindo ao usuário visualizar relatórios em tempo real sobre a saúde e o desempenho do ambiente.

O procedimento de configuração deve ser feito somente depois do passo de instalação. Para mais informações, consulte o [Manual de Instalação do GBS Apps](/componentes-web/gbsappssetup).

## Configuração

Os passos de configuração são:

1. Configure o Tomcat;
2. Configure os Certificados;
3. Gere a senha criptografada;
4. Instale o Elastic Stack (ELK);
5. Finalize as configurações no arquivo config.properties.

Todos os passos são descritos abaixo. Um exemplo do arquivo `config.properties` pode ser encontrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="danger" %}
Todas as linhas devem estar presentes no arquivo de configuração. Comentar ou deletar linhas pode causar comportamentos inesperados. Para informações adicionais, contate o Time de Suporte da Griaule.
{% endhint %}

### Configuração do Tomcat

Edite o arquivo de configuração do Tomcat para configurar os certificados e a porta que a aplicação usará.

```sh
vi /var/lib/tomcats/smart-sense/conf/server.xml
```

Para mudar a porta, procure por `Connector port=`. Essa é a porta para operações backend.

### Configuração de Certificados

Para habilitar autenticação SSL, procure por `connector port=` no arquivo `/conf/server.xml`.

Existem duas entradas. A comentada é a configuração para SSL. Remova os delimitadores de comentários `<!--` e `-->`, então ajuste os seguintes parâmetros:

```properties
port="58194"
keystoreFile="/home/griaule/keystore"
keystorePass="password"
keyAlias="1"
clientAuth="true"
truststoreFile="/home/griaule/keystore"
truststorePass="password"
```

O parâmetro `port` deve ser a porta de rede desejada para a aplicação.

Mude o caminho do `keystoreFile` e o `truststoreFile` para os valores apropriados. Faça o mesmo para o `keystorePass` e o `truststorePass`.

O parâmetro `clientAuth="true"` irá requerer autenticação do servidor para o cliente e do cliente para o servidor. Isso significa que o cliente necessitará importar o certificado no navegador para poder acessar a aplicação.

{% hint style="warning" %}
Quando **clientAuth** é definida como *true*, o administrador do sistema deve fornecer o arquivo **certificate.pfx** para os usuários finais.
{% endhint %}

### Criptografia da senha do Banco de Dados

No arquivo `config.properties`, o parâmetro `jdbc.password` é uma senha criptografada. Para gerar a senha criptografada, siga os seguintes passos:

1. Vá para o seguinte diretório:

   ```sh
   cd /var/lib/tomcats/smart-sense/webapps/gbs-smart-sense-server/WEB-INF/lib
   ```
2. Execute o comando:

   ```sh
   java -cp gbs-common-db-<versão>.jar com.griaule.commons.util.EncryptUtil <senhaDesejada>
   ```
3. A senha criptografada aparecerá depois da mensagem: *"Encrypted password is:"*

{% hint style="info" %}
Guarde a senha criptografada. Ela será usada em configurações posteriores.
{% endhint %}

### Arquivo de Configuração da Aplicação

Para configurar o arquivo, abra-o com:

```sh
vi /var/lib/tomcats/smart-sense/conf/config.properties
```

As mudanças mais importantes nesse arquivo são os parâmetros `jdbc.url`, `jdbc.username`, `jdbc.password` e `gbds.url`. Configure-os de acordo com seu ambiente.

O arquivo de configuração completo é mostrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="info" %}
Lembre-se de substituir a senha criptografada gerada na seção [Criptografia da senha do Banco de Dados](#criptografia-da-senha-do-banco-de-dados) neste arquivo.
{% endhint %}

#### Configurações do SmartSense

O último passo é configurar o IP e a porta da aplicação que o usuário final irá acessar. Ele deve ser o mesmo IP e porta configurado na seção [Configuração do Tomcat](#configuracao-do-tomcat).

```properties
smart-sense.ip=<ip>
smart-sense.port=<port>
smart-sense.protocol=<protocol>
```

{% hint style="warning" %}
Certifique-se de que os parâmetros de configuração `smart-sense.ip`, `smart-sense.port` e `smart-sense.protocol` estejam corretamente especificados no arquivo `config.properties`. Em diversos casos, o IP será o mesmo para diversas aplicações. Contudo, cada aplicação possuirá uma porta **diferente e única**.
{% endhint %}

#### Nós (opcional)

Opcionalmente, em vez de usar a [interface gráfica do SmartSense](/aplicacoes/smartsense), você pode configurar os nós que serão monitorados inserindo-os diretamente na tabela `smartsense.hosts` no banco de dados. Para fazer isso, execute o seguinte comando no banco de dados, substituindo os *placeholders* pelos valores corretos:

```sql
INSERT INTO smartsense.hosts (hostname,ip,port,active) VALUES ('<server_hostname>','<ip>','<smartsense agent port>',1);
COMMIT;
```

## Instalando o Elastic Stack (ELK)

Siga para o [Manual de Instalação do ELK](/ferramentas-auxiliares/elk) para instruções detalhadas de como instalar e configurar o Elastic Stack.

## Finalizando as Configurações

Após completar todos os passos de configuração, volte para o [Manual de Instalação do GBS Apps - Seção de Configuração](/componentes-web/gbsappssetup#configuracoes).

## Exemplo do Arquivo de Configuração

Essa seção mostra um exemplo do arquivo `config.properties`.

```properties
# *********************************************************************
#
#         /$$$$$$  /$$      /$$  /$$$$$$  /$$$$$$$  /$$$$$$$$
#        /$$__  $$| $$$    /$$$ /$$__  $$| $$__  $$|__  $$__/
#       | $$  \__/| $$$$  /$$$$| $$  \ $$| $$  \ $$   | $$
#       |  $$$$$$ | $$ $$/$$ $$| $$$$$$$$| $$$$$$$/   | $$
#        \____  $$| $$  $$$| $$| $$__  $$| $$__  $$   | $$
#        /$$  \ $$| $$\  $ | $$| $$  | $$| $$  \ $$   | $$
#       |  $$$$$$/| $$ \/  | $$| $$  | $$| $$  | $$   | $$
#        \______/ |__/     |__/|__/  |__/|__/  |__/   |__/
#
#
#
#         /$$$$$$  /$$$$$$$$ /$$   /$$  /$$$$$$  /$$$$$$$$
#        /$$__  $$| $$_____/| $$$ | $$ /$$__  $$| $$_____/
#       | $$  \__/| $$      | $$$$| $$| $$  \__/| $$
#       |  $$$$$$ | $$$$$   | $$ $$ $$|  $$$$$$ | $$$$$
#        \____  $$| $$__/   | $$  $$$$ \____  $$| $$__/
#        /$$  \ $$| $$      | $$\  $$$ /$$  \ $$| $$
#       |  $$$$$$/| $$$$$$$$| $$ \  $$|  $$$$$$/| $$$$$$$$
#        \______/ |________/|__/  \__/ \______/ |________/
#
# *********************************************************************

# DATABASE (RDB)
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://<host-ip>:3306/smartsense?useSSL=false
jdbc.username=griaule
jdbc.password=CDrt8vbewA2YAubPNOLZkw==
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=false

# GBDS CONNECTION
gbds.url=http://<host-ip>:8085
gbds.user=gbds.authenticate
gbds.key=Griaule.123
gbds.logLevel=INFO
gbds.timeout=300

# SMARTSENSE - GUI
smart-sense.ip=<host-ip>
smart-sense.port=8126
smart-sense.protocol=http
locale=en_us

# SMARTSENSE - CONFIGURATION

fingerprint.useSDK=true
useLatentExtrator.fingerprint=true
useLatentExtrator.palmprint=false
image.convert.useJnbis=true
server.standalone.port=8085

gbds.smartSenseUser=smart_sense_server
sync.logLevel=INFO
same.user.simultaneous.login=false
notification.delay=5

poolingLoadBalancing.time=60
poolingLoadBalancing.active=true
poolingLoadBalancing.last=

# SMARTSENSE - ELK CONFIGURATION

linkEnroll=
linkIdentify=
linkIdentifyLatent=
linkUpdate=
linkVerify=

consumerQueue.active=true
```


# Configuração do Control Panel Web Server

## Introdução

Esse manual descreve a configuração dos componentes do lado do servidor da aplicação *GBS Control Panel*. O Control Panel fornece uma interface visual onde o usuário controla os valores de parâmetros do GBDS e compara os valores entre diferentes versões.

O procedimento de configuração deve ser feito somente depois do passo de instalação. Para mais informações, consulte o [Manual de Instalação do GBS Apps](/componentes-web/gbsappssetup).

## Configuração

Os passos de configuração são:

1. Configure o Tomcat;
2. Configure os Certificados;
3. Gere a senha criptografada;
4. Finalize as configurações no arquivo config.properties.

Todos os passos são descritos abaixo. Um exemplo do arquivo `config.properties` pode ser visto na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="danger" %}
Todas as linhas devem estar presentes no arquivo de configuração. Comentar ou deletar linhas pode causar comportamentos inesperados. Para informações adicionais, contate o Time de Suporte da Griaule.
{% endhint %}

### Configuração do Tomcat

Edite o arquivo de configuração do Tomcat para configurar os certificados e a porta que a aplicação usará.

```sh
vi /var/lib/tomcats/control-panel/conf/server.xml
```

Para mudar a porta, procure por `connector port=`. Essa é a porta para operações backend.

### Configuração de Certificados

Para habilitar autenticação SSL, procure por `connector port=` no arquivo `/conf/server.xml`.

Existem duas entradas. A comentada é a configuração para SSL. Remova os delimitadores de comentários `<!--` e `-->`, então ajuste os seguintes parâmetros:

```properties
port="58194"
keystoreFile="/home/griaule/keystore"
keystorePass="password"
keyAlias="1"
clientAuth="true"
truststoreFile="/home/griaule/keystore"
truststorePass="password"
```

O parâmetro `port` deve ser a porta de rede desejada para a aplicação.

Mude o caminho do `keystoreFile` e o `truststoreFile` para os valores apropriados. Faça o mesmo para o `keystorePass` e o `truststorePass`.

O parâmetro `clientAuth="true"` irá requerer autenticação do servidor para o cliente e do cliente para o servidor. Isso significa que o cliente necessitará importar o certificado no navegador para poder acessar a aplicação.

{% hint style="warning" %}
Quando **clientAuth** é definida como *true*, o administrador do sistema deve fornecer o arquivo **certificate.pfx** para os usuários finais.
{% endhint %}

### Criptografia da senha do Banco de Dados

No arquivo `config.properties`, o parâmetro `jdbc.password` é uma senha criptografada. Para gerar a senha criptografada, siga os seguintes passos:

1. Vá para o seguinte diretório:

   ```sh
   cd /var/lib/tomcats/control-panel/webapps/gbs-control-panel-server/WEB-INF/lib
   ```
2. Execute o comando:

   ```sh
   java -cp gbs-common-db-<versão>.jar com.griaule.commons.util.EncryptUtil <senhaDesejada>
   ```
3. A senha criptografada aparecerá depois da mensagem: *"Encrypted password is:"*

{% hint style="info" %}
Guarde a senha criptografada. Ela será usada em configurações posteriores.
{% endhint %}

### Arquivo de Configuração da Aplicação

Para configurar o arquivo, abra-o com:

```sh
vi /var/lib/tomcats/control-panel/conf/config.properties
```

As mudanças mais importantes nesse arquivo são os parâmetros `jdbc.url`, `jdbc.username`, `jdbc.password` e `gbds.url`. Configure-os de acordo com seu ambiente.

O arquivo de configuração completa é mostrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao)

{% hint style="info" %}
Lembre-se de substituir a senha criptografada gerada na seção [Criptografia da senha do Banco de Dados](#criptografia-da-senha-do-banco-de-dados) neste arquivo.
{% endhint %}

#### Configurações do Control Panel

O último passo é configurar o IP e a porta da aplicação que o usuário final irá acessar. Ele deve ser o mesmo IP e porta configurado na seção [Configuração do Tomcat](#configuracao-do-tomcat).

```properties
control-panel.ip=<ip>
control-panel.port=<port>
control-panel.protocol=<protocol>
```

{% hint style="warning" %}
Certifique-se de que os parâmetros de configuração `control-panel.ip`, `control-panel.port` e `control-panel.protocol` estejam corretamente especificados no arquivo `config.properties`. Em diversos casos, o IP será o mesmo para diversas aplicações. Contudo, cada aplicação possuirá uma porta **diferente e única**.
{% endhint %}

## Finalizando as Configurações

Após completar todos os passos de configuração, volte para o [Manual de Instalação do GBS Apps - Seção de Configuração](/componentes-web/gbsappssetup#configuracoes).

## Exemplo do Arquivo de Configuração

Essa seção mostra um exemplo do arquivo `config.properties`.

```properties
# GBS Control Panel Server

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.0.189:3306/controlpanel?useSSL=false
jdbc.username=root
jdbc.password=CDrt8vbewA2YAubPNOLZkw==
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=true

locale=en_us

gbds.url=http://192.168.0.189:8085
gbds.user=gbds.authenticate
gbds.key=Griaule.123
gbds.logLevel=INFO
gbds.timeout=300

fingerprint.useSDK=false

gbds.controlPanelUser=control_panel_server
sync.logLevel=INFO
same.user.simultaneous.login=false
notification.delay=5

server.standalone.port=8185

control-panel.ip=127.0.0.1
control-panel.port=8121
control-panel.protocol=http
```


# Configuração do Print Server

## Introdução

Esse manual descreve a configuração dos componentes do lado do servidor da aplicação *GBS Print*.

O procedimento de configuração deve ser realizado somente após a etapa de instalação. Para mais informações, consulte o [Manual de Instalação do GBS Apps](/componentes-web/gbsappssetup).

## Configuração

Os passos para configuração são:

1. [Configure o Tomcat](#configuracao-do-tomcat);
2. [Configure os certificados](#configuracao-de-certificados);
3. [Gere a senha criptografada](#criptografia-da-senha-do-banco-de-dados);
4. [Configure outras propriedades no arquivo config.properties](#arquivo-de-configuracao-da-aplicacao);
5. [Instale e configure os sistemas de impressão](#sistemas-de-impressao);
6. [Instale as fontes](#instalacao-de-fontes);

Todos os passos estão descritos abaixo. Um exemplo do arquivo `config.properties` pode ser encontrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="danger" %}
Todas as linhas devem estar presentes no arquivo de configuração. Comentar ou deletar linhas pode causar comportamentos inesperados. Para informações adicionais, contate o Time de Suporte da Griaule.
{% endhint %}

### Configuração do Tomcat

Edite o arquivo de configuração do Tomcat para configurar os certificados e a porta que a aplicação usará.

```sh
vi /var/lib/tomcats/print/conf/server.xml
```

Para mudar a porta, procure por `Connector port=`. Essa é a porta para operações backend.

A porta padrão do GBS Print é `8127`.

### Configuração de Certificados

Para habilitar autenticação SSL, procure por `Connector port=` no arquivo `/conf/server.xml`.

Há várias entradas. Procure pela que define um *SSL HTTP/1.1 Connector*. Se necessário, remova os delimitadores de comentário `<!--` e `-->`. Em seguida, ajuste as seguintes configurações:

```properties
port="58194"
keystoreFile="/home/griaule/keystore"
keystorePass="password"
keyAlias="1"
clientAuth="true"
truststoreFile="/home/griaule/keystore"
truststorePass="password"
```

O parâmetro `port` deve ser a porta de rede desejada para a aplicação.

Mude o caminho de `keystoreFile` e `truststoreFile` para os valores corretos. Faça o mesmo para `keystorePass` e `truststorePass`.

O parâmetro `clientAuth="true"` irá requerer autenticação do servidor para o cliente e do cliente para o servidor. Isso significa que o cliente necessitará importar o certificado no navegador para poder acessar a aplicação.

{% hint style="warning" %}
Quando `clientAuth` está definido como `true`, o administrador do sistema deve fornecer o arquivo `certificate.pfx` para os usuários finais.
{% endhint %}

### Criptografia da senha do Banco de Dados

No arquivo `config.properties`, o parâmetro `jdbc.password` é uma senha criptografada. Para gerar a senha criptografada, siga os passos abaixo:

1. Vá para o seguinte diretório:

   ```sh
   cd /var/lib/tomcats/print/webapps/gbs-print-server/WEB-INF/lib
   ```
2. Execute o comando:

   ```sh
   java -cp gbs-common-db-<version>.jar com.griaule.commons.util.EncryptUtil <desiredPassword>
   ```
3. A senha criptografada aparecerá depois da mensagem: *"Encrypted password is:"*

{% hint style="info" %}
Guarde a senha criptografada. Ela será usada no próximo passo.
{% endhint %}

### Arquivo de Configuração da Aplicação

Para configurar o arquivo, abra-o com:

```sh
vi /var/lib/tomcats/print/conf/config.properties
```

As mudanças mais importantes nesse arquivo são os parâmetros `jdbc.url`, `jdbc.username`, `jdbc.password` e `gbds.url`. Configure-os de acordo com seu ambiente.

O arquivo de configuração completo é mostrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="info" %}
Lembre-se de substituir a senha criptografada gerada na seção [Criptografia da senha do Banco de Dados](#criptografia-da-senha-do-banco-de-dados) neste arquivo.
{% endhint %}

#### Configurações do Print

O último passo é configurar o IP e a porta da aplicação que o usuário final irá acessar. Ele deve ser o mesmo IP e porta configurado na seção [Configuração do Tomcat](#configuracao-do-tomcat).

```properties
print.ip=<ip>
print.port=<port>
print.protocol=<protocol>
```

{% hint style="warning" %}
Certifique-se de que os parâmetros de configuração `print.ip`, `print.port` e `print.protocol` estejam corretamente especificados no arquivo `config.properties`. Em diversos casos, o IP será o mesmo para diversas aplicações. Contudo, cada aplicação possuirá uma porta **diferente e única**.
{% endhint %}

{% hint style="warning" %}
Certifique-se de que o parâmetro de configuração `resizeFloat=0.3` esteja presente no arquivo de configuração (`config.properties`). Ela determina a porcentagem de compressão da imagem do documento a ser salva no banco de dados ao final do processo. O valor padrão é `0.3` (30% de compressão).
{% endhint %}

### Sistemas de Impressão

#### Instalação do CUPS

O *Common UNIX Printing System (CUPS)* é um sistema de impressão para sistemas operacionais baseados em UNIX. Ele permite que um computador atue como um servidor de impressão, recebendo trabalhos de impressão de computadores clientes e enviando-os para a impressora apropriada. Para instalar o CUPS, siga os seguintes passos:

Instale o CUPS:

```sh
sudo yum install cups -y
```

Habilite e inicie o serviço CUPS:

```sh
sudo systemctl enable cups
sudo systemctl start cups
```

Então, instale a interface gráfica para o CUPS:

```sh
sudo yum install system-config-printer -y
```

{% hint style="success" %}
Se o comando de instalação falhar, tente limpar o cache do *yum*:

```sh
sudo yum clean all
```

{% endhint %}

#### Configuração do CUPS

Para configurar o CUPS, edite o arquivo de configuração:

```sh
sudo vim /etc/cups/cupsd.conf
```

Para permitir acesso de outros computadores ao servidor CUPS, altere a seguinte linha, de:

```properties
Listen localhost:631
```

Para:

```properties
Listen 0.0.0.0:631
```

Então, para permitir acesso ao servidor, adicione a permissão `Allow from all` para `<Location />`. Para fazer isso, procure pelas seguintes linhas e mude-as da seguinte forma:

```apacheconf
# Restrict access to the server...
<Location />
   Order allow,deny
   Allow from all
</Location>
```

Além disso, para permitir acesso às páginas de administração, adicione a permissão `Allow from all` para `<Location /admin>`. Para fazer isso, procure pelas seguintes linhas e mude-as da seguinte forma:

```apacheconf
# Restrict access to the admin pages...
<Location /admin>
   Order allow,deny
   Allow from all
</Location>
```

Então, salve e feche o arquivo de configuração.

Finalmente, para aplicar as mudanças, reinicie o serviço CUPS:

```sh
sudo systemctl restart cups
```

#### Instalação do HPLIP (Driver de Impressoras HP)

O *HP Linux Imaging and Printing (HPLIP)* é uma solução gratuita e de código aberto desenvolvida pela HP para impressão no Linux usando impressoras HP. Para instalar o HPLIP, execute:

```sh
sudo yum install hplip -y
```

Então, crie um grupo para administração de impressoras:

```sh
sudo groupadd lpadmin
```

Finalmente, adicione o usuário `root` ao grupo `lpadmin`:

```sh
sudo usermod -a -G lpadmin root
```

#### Configuração de Impressoras

Primeiro, inicie o serviço de busca de impressoras da rede executando:

```sh
sudo systemctl enable cups-browsed.service
sudo systemctl start cups-browsed.service
sudo systemctl status cups-browsed.service
```

Em seguida, acesse a interface web do CUPS em `http://<server_ip>:631` usando um navegador.

![](/files/KwievGU4MhihIDi7549d)

No menu superior, clique na aba `Administration` e depois no botão Add Printer.

![](/files/LH9t5QlkURoGuAwEX6rS)

Se uma mensagem aparecer dizendo que uma atualização é necessária, clique na URL exibida, depois no botão Advanced e em `Proceed to https://<server_ip>:631 (unsafe)`.

![](/files/tsHkE57yM6pZT0QfLc0s)

Ao retornar à interface web do CUPS, clique no botão Add Printer novamente e, se solicitado, faça login com as credenciais de usuário `root` do servidor.

![](/files/3izamLYd2uLzqiXkGTpU)

Na página **Add Printer**, na seção **Local Printers**, selecione `HP Printer (HPLIP)` e clique no botão Continue.

![](/files/LMYMvnHMJ2YyhZXpwfhG)

Em seguida, na seção **Connection**, insira `socket://<printer_IP>` e clique no botão Continue.

![](/files/DS2NGuNmsI2YWuZ6NLKw)

Então, insira um `Name`, `Description` e `Location` para a impressora, seguindo as instruções na página para cada campo, e clique no botão Continue.

![](/files/H9AiEwhpwzuYFYi4LGQI)

Na seção **Make**, selecione o fabricante da impressora e clique no botão Continue.

![](/files/ADJSwANm1eL1AOhn6Giu)

Em seguida, na seção **Model**, selecione o modelo da impressora na lista e clique no botão Add Printer.

![](/files/Q7J1idqu6r5VtWD0U1sl)

Então, verifique as configurações padrão da impressora e certifique-se de que elas se adequam ao ambiente.

{% hint style="success" %}
Certifique-se de selecionar o tamanho de papel correto na seção **General / Media Size**.
{% endhint %}

![](/files/Ulj5WzLqcMUwIw52JqHa)

Finalmente, clique no botão Set Default Options para salvar as configurações da impressora. Se tudo funcionar como esperado, uma mensagem aparecerá dizendo que a impressora foi adicionada com sucesso e você será redirecionado para a página da impressora.

![](/files/da2CN3FvPi0gke676hGo)

#### CUPS PDF (opcional)

O CUPS PDF fornece uma maneira de imprimir em um arquivo PDF. É recomendado para fins de teste.

Para instalar o CUPS PDF, execute:

```sh
sudo yum install cups-pdf -y
```

O caminho padrão para salvar os arquivos PDF é `/root`. Para mudar o caminho, edite o arquivo de configuração do CUPS PDF:

Então, edite o arquivo de configuração do CUPS PDF:

```sh
vim /etc/cups/cups-pdf.conf
```

Em `Path Settings`, mude o parâmetro `Out <path>` para o caminho desejado.

Em seguida, acesse a interface web do CUPS em `http://<server_ip>:631` usando um navegador.

No menu superior, clique na aba `Administration` e depois no botão Add Printer.

![](/files/LH9t5QlkURoGuAwEX6rS)

Na página **Add Printer**, na seção **Local Printers**, selecione `CUPS-PDF (Virtual PDF Printer)` e clique no botão Continue.

![](/files/d0P4fNC7wdFiGS7bdW10)

Então, insira um `Name`, `Description` e `Location` para a impressora, seguindo as instruções na página para cada campo, e clique no botão Continue.

![](/files/mP8vJ1XZjHBrejeN4JQT)

Em seguida, na seção **Or Provide a PPD File**, clique no botão Choose File e selecione o arquivo `Cups-PDF.ppd`. Esse arquivo `.ppd` pode ser encontrado no diretório `/etc/cups/ppd/` do servidor onde o CUPS PDF está instalado. Então, clique no botão Add Printer.

![](/files/BxqDz3XKGKTYpQtAhov3)

Verifique as configurações padrão da impressora e certifique-se de que elas se adequam ao ambiente.

{% hint style="success" %}
Certifique-se de selecionar o tamanho de papel correto na seção **General / Media Size**.
{% endhint %}

![](/files/siNOEkUMB8ItTQQS1yDU)

Finalmente, clique no botão Set Default Options para salvar as configurações da impressora. Se tudo funcionar como esperado, uma mensagem aparecerá dizendo que a impressora foi adicionada com sucesso e você será redirecionado para a página da impressora.

![](/files/Af0b58sjgqfUPkEgYi7p)

### Instalação de Fontes

A aplicação utiliza três fontes que devem ser instaladas: `Arial`, `OCR-B-10 BT` e `Tahoma Bold`.

#### Arial

Primeiro, verifique se a fonte já está instalada:

```sh
fc-list | grep arial
```

Se a fonte não estiver instalada (resultado vazio), baixe a fonte:

```sh
wget http://www.itzgeek.com/msttcore-fonts-2.0-3.noarch.rpm
```

Em seguida, instale-a:

```sh
rpm -Uvh msttcore-fonts-2.0-3.noarch.rpm
```

Verifique se a fonte foi instalada com sucesso:

```sh
fc-list | grep arial
```

Você pode então remover o arquivo `.rpm` baixado:

```sh
rm msttcore-fonts-2.0-3.noarch.rpm
```

#### OCR-B-10 BT

Primeiro, certifique-se de estar logado como *root*.

Em seguida, verifique se a fonte já está instalada:

```sh
fc-list | grep ocr
```

Se a fonte não estiver instalada (resultado vazio), crie um diretório `ocrb` em `/usr/share/fonts/`:

```sh
mkdir /usr/share/fonts/ocrb
```

{% hint style="warning" %}
Para os passos seguintes, você deve ter o arquivo `.ttf` da fonte `OCR-B-10 BT`. Baixe-o de uma fonte confiável ou copie-o de outra máquina.
{% endhint %}

Transfira o arquivo da fonte para o servidor e mova-o para o diretório `/usr/share/fonts/ocrb`.

Em seguida, execute:

```sh
fc-cache -f /usr/share/fonts/
```

Finalmente, verifique se a fonte foi instalada com sucesso:

```sh
fc-list | grep ocr
```

#### Tahoma Bold

Primeiro, certifique-se de estar logado como *root*.

Em seguida, verifique se a fonte já está instalada:

```sh
fc-list | grep tahoma
```

O resultado deve incluir `Tahoma:style=Bold`. Se a fonte não estiver instalada, crie um diretório `tahomabd` em `/usr/share/fonts/`:

```sh
mkdir /usr/share/fonts/tahomabd
```

{% hint style="warning" %}
Para os passos seguintes, você deve ter o arquivo `.ttf` da fonte `Tahoma Bold`. Baixe-o de uma fonte confiável ou copie-o de outra máquina.
{% endhint %}

Transfira o arquivo da fonte para o servidor e mova-o para o diretório `/usr/share/fonts/tahomabd`.

Em seguida, execute:

```sh
fc-cache -f /usr/share/fonts/
```

Finalmente, verifique se a fonte foi instalada com sucesso:

```sh
fc-list | grep tahoma
```

O resultado deve incluir `Tahoma:style=Bold`.

## Finalizando as Configurações

Após todos os passos de configuração estarem completos, retorne ao [Manual de Instalação do GBS Apps - Seção de Configuração](/componentes-web/gbsappssetup#configuracoes).

## Exemplo do Arquivo de Configuração

Essa seção mostra um exemplo do arquivo `config.properties`.

{% hint style="warning" %}
Os parâmetros `<rdb_ip>`, `<rdb_username>`, `<rdb_encrypted_password>`, `<gbds_ip>`, `<gbds_username>`, `<gbds_password>`, `<ldap_ip>`, `<ldap_username>`, `<ldap_password>`, `<email_password>`, `<print_ip>` e `<print_service_ip>` devem ser substituídos pelos valores corretos.
{% endhint %}

```properties
# ************************************************************
#
#        /$$$$$$$  /$$$$$$$  /$$$$$$ /$$   /$$ /$$$$$$$$
#       | $$__  $$| $$__  $$|_  $$_/| $$$ | $$|__  $$__/
#       | $$  \ $$| $$  \ $$  | $$  | $$$$| $$   | $$
#       | $$$$$$$/| $$$$$$$/  | $$  | $$ $$ $$   | $$
#       | $$____/ | $$__  $$  | $$  | $$  $$$$   | $$
#       | $$      | $$  \ $$  | $$  | $$\  $$$   | $$
#       | $$      | $$  | $$ /$$$$$$| $$ \  $$   | $$
#       |__/      |__/  |__/|______/|__/  \__/   |__/
#
# ************************************************************

# GBS Print Server

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://<rdb_ip>:3306/print
jdbc.username=<rdb_username>
jdbc.password=<rdb_encrypted_password>
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=false

locale=en_us

gbds.url=http://<gbds_ip>:8085
gbds.user=<gbds_username>
gbds.key=<gbds_password>
gbds.logLevel=INFO
gbds.additionalHeaders={}
gbds.flushDebugRequests=false
gbds.timeout=300
gbds.listExceptions.labels=

gbds.latent.search.url=null
gbds.proxy.url=null
gbds.proxy.port=0

keystore.path=null
keystore.password=null
truststore.path=null
truststore.password=null

same.user.simultaneous.login=true
fingerprint.useSDK=false
image.convert.useJnbis=false
filter.people.pguid=ALL
faceQuality.qtdeMinErrors=2

session.expirationTime.server=8h
session.expirationTime.web=8h

notification.last.timestamp=15

ldap.url=ldap://<ldap_ip>:389
ldap.user=<ldap_username>
ldap.password=<ldap_password>

codeValidTime=10
deviceTime=6

email.host=smtp.gmail.com
email.host.port=587
email.password=<email_password>
email.from=bravonotifier@gmail.com
email.python.path=python
email.use.script.python=true

# Print back on front/back layouts
ci.printBack=true

# Timeout in seconds to force a print job even if queue has not enough cis to print
queue.timeout=-1

# Station
station.initials=SEDE

batchSizes=FOUR_CI:8

defaultStation=SEDE
forceDefaultStationPrinting=true
print.service.on=true
print.mirror.page=true

#printService.url=http://<print_service_ip>:8090/gbs-print-service/service/
printService.logLevel=DEBUG
printService.timeout=300

#autoPrint=FOUR_CI:true,TWO_CF:false,ONE_CI:true,TWO_CA:false,TWO_CC:false,ONE_CS:false

print.ip=<print_ip>
print.port=8127
print.protocol=http

resizeFloat=0.3
```


# Configuração do Home Screen Server

## Introdução

Esse manual descreve a configuração dos componentes do lado do servidor da aplicação *GBS Home Screen*.

O procedimento de configuração deve ser realizado somente após a etapa de instalação. Para mais informações, consulte o [Manual de Instalação do GBS Apps](/componentes-web/gbsappssetup).

## Configuração

Os passos para configuração são:

1. [Configure o Tomcat](#configuracao-do-tomcat);
2. [Configure os certificados](#configuracao-de-certificados);
3. [Gere a senha criptografada](#criptografia-da-senha-do-banco-de-dados);
4. [Configure outras propriedades no arquivo config.properties](#arquivo-de-configuracao-da-aplicacao);
5. [Instale e configure o Nginx](#nginx);
6. [Configure as permissões](#permissoes);
7. [Configure o logotipo do cliente](#logotipo-do-cliente);

Todos os passos estão descritos abaixo. Um exemplo do arquivo `config.properties` pode ser encontrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="danger" %}
Todas as linhas devem estar presentes no arquivo de configuração. Comentar ou deletar linhas pode causar comportamentos inesperados. Para informações adicionais, contate o Time de Suporte da Griaule.
{% endhint %}

### Configuração do Tomcat

Edite o arquivo de configuração do Tomcat para configurar os certificados e a porta que a aplicação usará.

```sh
vim /var/lib/tomcats/home-screen/conf/server.xml
```

Para mudar a porta, procure por `Connector port=`. Essa é a porta para operações backend.

A porta padrão do GBS Home Screen é `8128`.

### Configuração de Certificados

Para habilitar autenticação SSL, procure por `Connector port=` no arquivo `/conf/server.xml`.

Há várias entradas. Procure pela que define um *SSL HTTP/1.1 Connector*. Se necessário, remova os delimitadores de comentário `<!--` e `-->`. Em seguida, ajuste as seguintes configurações:

```properties
port="8127"
keystoreFile="/home/griaule/keystore"
keystorePass="password"
keyAlias="1"
clientAuth="true"
truststoreFile="/home/griaule/keystore"
truststorePass="password"
```

O parâmetro `port` deve ser a porta de rede desejada para a aplicação.

Mude o caminho de `keystoreFile` e `truststoreFile` para os valores corretos. Faça o mesmo para `keystorePass` e `truststorePass`.

O parâmetro `clientAuth="true"` irá requerer autenticação do servidor para o cliente e do cliente para o servidor. Isso significa que o cliente necessitará importar o certificado no navegador para poder acessar a aplicação.

{% hint style="warning" %}
Quando `clientAuth` está definido como `true`, o administrador do sistema deve fornecer o arquivo `certificate.pfx` para os usuários finais.
{% endhint %}

### Criptografia da senha do Banco de Dados

No arquivo `config.properties`, o parâmetro `jdbc.password` é uma senha criptografada. Para gerar a senha criptografada, siga os passos abaixo:

{% hint style="info" %}
Se o diretório `/var/lib/tomcats/home-screen/webapps/gbs-home-screen-server/WEB-INF/lib` não existir, **inicie** a aplicação (`systemctl start tomcat@home-screen.service`) uma vez para que o diretório seja criado. Em seguida, **pare** a aplicação (`systemctl stop tomcat@home-screen.service`) e continue o procedimento de configuração.
{% endhint %}

1. Acesse o seguinte diretório:

   ```sh
   cd /var/lib/tomcats/home-screen/webapps/gbs-home-screen-server/WEB-INF/lib
   ```
2. Execute o comando:

   ```sh
   java -cp gbs-common-db-<version>.jar com.griaule.commons.util.EncryptUtil <desiredPassword>
   ```
3. A senha criptografada aparecerá após a mensagem: *"Encrypted password is:"*

{% hint style="info" %}
Guarde a senha criptografada. Ela será usada no próximo passo.
{% endhint %}

### Arquivo de Configuração da Aplicação

Abra o arquivo de configuração:

```sh
vim /var/lib/tomcats/home-screen/conf/config.properties
```

Algumas mudanças importantes nesse arquivo são os parâmetros `jdbc.url`, `jdbc.username`, `jdbc.password` e `gbds.url`. Configure-os de acordo com seu ambiente.

Um exemplo do arquivo de configuração completo é mostrado na seção [Exemplo do Arquivo de Configuração](#exemplo-do-arquivo-de-configuracao).

{% hint style="info" %}
Lembre-se de substituir a senha criptografada gerada na seção [Criptografia da senha do Banco de Dados](#criptografia-da-senha-do-banco-de-dados) neste arquivo.
{% endhint %}

#### Configurações do Home Screen

Em seguida, configure o IP, a porta e o protocolo de acesso à aplicação. O IP e porta devem ser os mesmos configurados na seção [Configuração do Tomcat](#configuracao-do-tomcat).

```properties
home-screen.ip=<ip>
home-screen.port=<port>
home-screen.protocol=<protocol>
```

{% hint style="warning" %}
Certifique-se de que os parâmetros de configuração `home-screen.ip`, `home-screen.port` e `home-screen.protocol` estejam corretamente especificados no arquivo `config.properties`. Em diversos casos, o IP será o mesmo para diversas aplicações. Contudo, cada aplicação possuirá uma porta **diferente e única**.
{% endhint %}

### Nginx

Instale e configure o Nginx para que o GBS Home Screen funcione com login único (SSO) junto às demais aplicações.

#### Instalação do Nginx

{% hint style="info" %}
Se o Nginx já estiver instalado, pule para a seção [Configuração do Nginx](#configuracao-do-nginx).
{% endhint %}

Instale o Nginx:

```sh
sudo yum install nginx -y
```

Inicie o Nginx:

```sh
sudo systemctl start nginx
```

#### Configuração do Nginx

Habilite o Nginx para iniciar com o sistema:

```sh
sudo systemctl enable nginx
```

{% hint style="danger" %}
Se o Nginx já estava instalado, verifique se um arquivo de configuração já existe no diretório `/etc/nginx/conf.d/`. Se existir, verifique no arquivo se o *server block* está configurado para a **porta 80** (`listen 80`) e para o **mesmo** `server_name` do host do GBS Home Screen. Em caso afirmativo, pule as instruções de criação de um novo arquivo de configuração e adicione as configurações abaixo ao arquivo existente.
{% endhint %}

Em seguida, crie um arquivo de configuração para o Nginx:

```sh
sudo vim /etc/nginx/conf.d/web-apps.conf
```

Adicione as seguintes informações ao arquivo. Em *server*, substitua `<ip_hostname_or_domain>` pelo IP, hostname ou domínio do servidor:

```nginx
server {
   listen 80;
   server_name <ip_hostname_or_domain>;
   client_max_body_size 50M;
}
```

Em seguida, ainda em *server*, adicione um bloco de configuração para cada aplicação, mapeando-a para seu IP e porta. Substitua `<app_name>`, `<protocol>`, `<app_name_ip>` e `<app_name_port>` pelos valores corretos:

{% hint style="success" %}
O `<app_name>` pode ser: `bcc`, `cardscan`, `etr`, `mir`, `best`, `intelligence`, `smart-sense`, `print`, `control-panel` ou `home-screen`.
{% endhint %}

```nginx
location /gbs-<app_name>-server {
   proxy_pass <protocol>://<app_name_ip>:<app_name_port>;
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
}
```

Exemplo de arquivo de configuração completo do Nginx, contendo rotas para todas as aplicações, utilizando suas portas padrão. Substitua `<ip_hostname_or_domain>`, `<protocol>` e `<app_name_ip>` pelos valores corretos:

```nginx
server {
   listen 80;
   server_name <ip_hostname_or_domain>;
   client_max_body_size 50M;

   # HOME SCREEN:
   location /gbs-home-screen-server {
      proxy_pass <protocol>://<home-screen_ip>:8128;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }

   # BCC
   location /gbs-bcc-server {
      proxy_pass <protocol>://<bcc_ip>:8124;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }

   # CARDSCAN
   location /gbs-cardscan-server {
      proxy_pass <protocol>://<cardscan_ip>:8087;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }


   # ETR
   location /gbs-etr-server {
      proxy_pass <protocol>://<etr_ip>:8089;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }

   # MIR
   location /gbs-mir-server {
      proxy_pass <protocol>://<mir_ip>:8120;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }

   # BEST
   location /gbs-best-server {
      proxy_pass <protocol>://<best_ip>:8123;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }

   # INTELLIGENCE
   location /gbs-intelligence-server {
      proxy_pass <protocol>://<intelligence_ip>:8122;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }

   # SMART SENSE
   location /gbs-smart-sense-server {
      proxy_pass <protocol>://<smart-sense_ip>:8127;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }

   # PRINT
   location /gbs-print-server {
      proxy_pass <protocol>://<print_ip>:8127;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }

   # CONTROL PANEL
   location /gbs-control-panel-server {
      proxy_pass <protocol>://<control-panel_ip>:8121;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }
}
```

Salve e feche o arquivo de configuração.

Finalmente, recarregue as configurações do Nginx:

```sh
sudo systemctl reload nginx
```

### Permissões

Para que os ícones das aplicações apareçam na Home Screen, é necessário que o usuário possua as permissões necessárias. Cada permissão concedida ao usuário (via integração LDAP) corresponde a uma aplicação, conforme a tabela abaixo:

| Aplicação     | Permissão                  |
| ------------- | -------------------------- |
| BCC           | bccdesktop\_user           |
| CardScan      | cardscan\_user             |
| ETR           | exception\_treatment\_user |
| MIR           | quality\_control\_user     |
| BEST          | forensic\_user             |
| Intelligence  | intelligence\_user         |
| SmartSense    | smartsense\_user           |
| Print         | printservice\_user         |
| Control Panel | controlpanel\_user         |

### Logotipo do cliente

No canto superior direito dos web apps, é possível adicionar o logotipo do cliente.

{% hint style="info" %}
Isso é uma configuração de ambiente. Assim, todos os usuários que acessarem a aplicação verão o mesmo logotipo.
{% endhint %}

![](/files/hSFB4DwgAcRunalb3E0Y)

Para isso, na tabela `sphinx.settings` do banco de dados, crie ou altere a configuração `organization.logo` (type `APPS`) para o caminho do logotipo desejado. É necessário que a aplicação (usuário `tomcat`) tenha acesso de leitura ao arquivo para poder carregá-lo.

{% hint style="warning" %}
As **dimensões** do logotipo devem ser de **320x132** pixels para que toda a área seja preenchida. Se a imagem for maior, menor ou em outra proporção, ela será redimensionada e a área restante será preenchida com a cor branca.

O formato de imagem deve ser preferencialmente **PNG** ou **JPG**.
{% endhint %}

![](/files/ogvNtr15GQYfH9C6I2qv)

## Acesso à aplicação

O GBS Home Screen, assim como as demais aplicações, deve ser acessado sem o uso da porta, uma vez que o Nginx irá redirecionar automaticamente a requisição para a porta correta. Assim, ao realizar um único login (SSO), o usuário terá acesso a todas as aplicações que possui permissão para utilizar.

O formato da URL de acesso é:

```html
<protocol>://<ip_or_domain>/gbs-<app_name>-server/react/
^^^^^^^^^^   ^^^^^^^^^^^^^^     ^^^^^^^^^^
```

{% hint style="success" %}
O `<app_name>` pode ser: `bcc`, `cardscan`, `etr`, `mir`, `best`, `intelligence`, `smart-sense`, `print`, `control-panel` ou `home-screen`.
{% endhint %}

Exemplos:

* GBS Home Screen: <http://172.16.0.185/gbs-home-screen-server/react/>
* GBS BCC: <http://172.16.0.185/gbs-bcc-server/react/>
* GBS ETR: <http://172.16.0.185/gbs-etr-server/react/>

***

* GBS Home Screen: <https://my.server.com/gbs-home-screen-server/react/>
* GBS CardScan: <https://my.server.com/gbs-cardscan-server/react/>
* GBS MIR: <https://my.server.com/gbs-mir-server/react/>

{% hint style="danger" %}
Caso as aplicações não sejam acessadas pela URL no formato descrito acima (sem porta), isto é, se forem acessadas usando suas portas diretamente, o **login único** (SSO) **não funcionará** e deverá ser feito login em cada aplicação separadamente.
{% endhint %}

## Finalizando as Configurações

Após finalizar todos os passos de configuração, retorne ao [Manual de Instalação do GBS Apps - Seção de Configuração](/componentes-web/gbsappssetup#configuracoes).

## Exemplo do Arquivo de Configuração

Essa seção mostra um exemplo do arquivo `config.properties`.

{% hint style="warning" %}
Os parâmetros `<rdb_ip>`, `<rdb_username>`, `<rdb_encrypted_password>`, `<gbds_ip>`, `<gbds_username>`, `<gbds_password>`, `<home_screen_ip>`, `<protocol>`, `<keystore_path>`, `<keystore_password>`, `<truststore_path>`, `<truststore_password>`, `<ldap_ip>`, `<ldap_username>`, `<ldap_password>`, `<email_password>` e `<email_address>` devem ser substituídos pelos valores adequados.
{% endhint %}

```properties
# **********************************************************************************************
#
#      /$$   /$$  /$$$$$$  /$$      /$$ /$$$$$$$$
#     | $$  | $$ /$$__  $$| $$$    /$$$| $$_____/
#     | $$  | $$| $$  \ $$| $$$$  /$$$$| $$
#     | $$$$$$$$| $$  | $$| $$ $$/$$ $$| $$$$$
#     | $$__  $$| $$  | $$| $$  $$$| $$| $$__/
#     | $$  | $$| $$  | $$| $$\  $ | $$| $$
#     | $$  | $$|  $$$$$$/| $$ \/  | $$| $$$$$$$$
#     |__/  |__/ \______/ |__/     |__/|________/
#
#       /$$$$$$   /$$$$$$  /$$$$$$$  /$$$$$$$$ /$$$$$$$$ /$$   /$$
#      /$$__  $$ /$$__  $$| $$__  $$| $$_____/| $$_____/| $$$ | $$
#     | $$  \__/| $$  \__/| $$  \ $$| $$      | $$      | $$$$| $$
#     |  $$$$$$ | $$      | $$$$$$$/| $$$$$   | $$$$$   | $$ $$ $$
#      \____  $$| $$      | $$__  $$| $$__/   | $$__/   | $$  $$$$
#      /$$  \ $$| $$    $$| $$  \ $$| $$      | $$      | $$\  $$$
#     |  $$$$$$/|  $$$$$$/| $$  | $$| $$$$$$$$| $$$$$$$$| $$ \  $$
#      \______/  \______/ |__/  |__/|________/|________/|__/  \__/
#
# **********************************************************************************************
# DATABASE (RDB)
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://<rdb_ip>:3306/sphinx?useSSL=false
jdbc.username=<rdb_username>
jdbc.password=<rdb_encrypted_password>
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=false

# **********************************************************************************************
# GBDS CONNECTION (& AUTHENTICATION LDAP ONLY)
gbds.url=http://<gbds_ip>:8085
gbds.user=<gbds_username>
gbds.key=<gbds_password>
gbds.logLevel=INFO
gbds.additionalHeaders={}
gbds.flushDebugRequests=false
gbds.timeout=300
gbds.listExceptions.labels=

# **********************************************************************************************
# GUI SETTINGS
home-screen.ip=<home_screen_ip>
home-screen.port=8128
home-screen.protocol=<protocol>
locale=en_us

# **********************************************************************************************
# OTHER SETTINGS
gbds.latent.search.url=null
gbds.proxy.url=null
gbds.proxy.port=0

keystore.path=<keystore_path>
keystore.password=<keystore_password>
truststore.path=<truststore_path>
truststore.password=<truststore_password>

# **********************************************************************************************
# SESSION SETTINGS
same.user.simultaneous.login=true
fingerprint.useSDK=false
image.convert.useJnbis=false
filter.people.pguid=ALL
faceQuality.qtdeMinErrors=2
session.expirationTime.server=8h
session.expirationTime.web=8h
notification.last.timestamp=15

ldap.url=http://<ldap_ip>:8082/
ldap.user=<ldap_username>
ldap.password=<ldap_password>
codeValidTime=10
deviceTime=6

# **********************************************************************************************
# EMAIL
email.host=smtp.gmail.com
email.host.port=587
email.from=<email_address>
email.password=<email_password>
email.python.path=python
email.use.script.python=true

profile.cacheSize=100
profile.cacheTime=5m
locale=pt_br
```


# Criação de usuários do GBS SMART

## Visão Geral

Este manual detalha o procedimento para criação de usuários do GBS SMART.

* Todo usuário deve ter uma conta no LDAP para login.
* Todas as configurações e dados do GBS Smart ficam dentro do schema *SMART*.
* A tabela `User` contém informações básicas sobre o usuário.
* A tabela `UserPermission` relaciona usuários com suas permissões através dos campos `UserId` e `PermissionId` (ver [Lista de Permissões Disponíveis](#lista-de-permissoes-disponiveis)).
* A tabela `UserStation` relaciona usuários com estações através dos campos `UserId` e `StationId`.

## Procedimento

### Criar um novo posto de trabalho na tabela *Station*

Para criar um novo posto de trabalho, ou estação, insira um registro na tabela `SMART.Station` preenchendo as seguintes colunas:

* `StationId`: Preencha com um ID incremental da estação.
* `Description`: Preencha com o nome da estação.
* `MandatoryConference`: Indique se as transações do posto deverão ir para conferência obrigatória (`1` para sim, `0` para não).
* `CityId`: Indique o ID da cidade em que a estação se localiza.

{% hint style="info" %}
O ID da estação (`StationId`) será usado nos próximos passos.
{% endhint %}

### Criar um novo usuário na tabela *User*

Para criar um novo usuário, insira um registro na tabela `SMART.User` preenchendo as seguintes colunas:

* `CPF`: Preencha com o CPF do usuário.
* `Username`: Preencha com o nome de usuário.
* `Admin`: Indique se o usuário é administrador (`1` para sim, `0` para não).
* `Active`: Indique se o usuário está ativo (`1` para ativo, `0` para inativo). O valor padrão é `1`.
* `Pguid` (opcional): Preencha com o PGUID do usuário na base biométrica.

{% hint style="info" %}
A coluna `UserId` é auto incremental. O ID do usuário será ser usado nos próximos passos.
{% endhint %}

### Atribuir permissões ao usuário na tabela *UserPermission*

Após criar o usuário, é preciso atribuir suas permissões. Para isso, insira um registro na tabela `SMART.UserPermission` para cada permissão que o usuário deve ter, relacionando o `UserId` com o `PermissionId`.

#### Lista de permissões disponíveis

O `PermissionId` está especificado na tabela a seguir:

<table><thead><tr><th width="120">PermissionId</th><th>Descrição</th><th width="150">PermissionName</th></tr></thead><tbody><tr><td>1</td><td>Permissão de listagem de cadastro civil, 2º via, etc.</td><td>CIVIL</td></tr><tr><td>2</td><td>Permissão de listagem de cadastro criminal.</td><td>CRIMINAL</td></tr><tr><td>3</td><td>Permissão de visualização da tela de layout.</td><td>LAYOUT</td></tr><tr><td>4</td><td>Permissão de visualização da tela de busca avançada.</td><td>PESQUISA</td></tr><tr><td>5</td><td>Permissão para realizar captura de biometrias.</td><td>CAPTURA</td></tr><tr><td>6</td><td>Permissão para realizar download de biometrias, impressão de protocolo e prontuário.</td><td>DOWNLOAD</td></tr><tr><td>7</td><td>Permissão para realizar conferência de biográficos.</td><td>CONFERENCE</td></tr><tr><td>8</td><td>Permissão para realizar a baixa de malotes.</td><td>PACKAGE</td></tr></tbody></table>

### Associar o usuário a uma estação na tabela *UserStation*

Insira um registro na tabela `UserStation` relacionando o `UserId` com o `StationId`. A estação deve estar configurada previamente na tabela `SMART.Station`, como explicado anteriormente.

* `UserId`: Utilize o `UserId` do usuário, como consta na tabela `SMART.User`.
* `StationId`: Preencha com o ID da estação à qual o usuário será associado, como consta na tabela `SMART.Station`.

### *Procedure* de criação de Usuário, alocação de posto e permissões

```sql
DELIMITER //
CREATE PROCEDURE InsertNewUser(
	IN p_CPF VARCHAR(14),
	IN p_Username VARCHAR(64),
	IN p_Admin TINYINT(1),
	IN p_Active TINYINT(1),
	IN p_Pguid VARCHAR(100),
	IN p_StationId INT,
	IN p_Permissions VARCHAR(100) -- Permissões separadas por vírgula (ex: '1,4,5,6,7')
)
BEGIN
	DECLARE user_id INT;
	DECLARE perm_pos INT DEFAULT 1;
	DECLARE perm_length INT;
	DECLARE current_permission VARCHAR(10);
	DECLARE done INT DEFAULT 0;

	-- Insere um novo usuário na tabela User
	INSERT INTO `User` (`CPF`, `Username`, `Admin`, `Active`, `Pguid`)
	VALUES (p_CPF, p_Username, p_Admin, p_Active, p_Pguid);

	-- Obtém o último ID inserido na tabela User
	SET user_id = LAST_INSERT_ID();

	-- Loop para inserir as permissões
	read_loop: LOOP
		SET perm_length = LOCATE(',', p_Permissions, perm_pos) - perm_pos;
		IF perm_length < 0 THEN
			SET perm_length = LENGTH(p_Permissions) - perm_pos + 1;
			SET done = 1;
		END IF;
		SET current_permission = SUBSTRING(p_Permissions, perm_pos, perm_length);

		-- Inserir permissão na tabela UserPermission
		INSERT INTO `UserPermission` (`UserId`, `PermissionId`)
		VALUES (user_id, current_permission);

		IF done = 1 THEN
			LEAVE read_loop;
		END IF;

		SET perm_pos = LOCATE(',', p_Permissions, perm_pos) + 1;
	END LOOP read_loop;

	-- Insere associação do novo usuário com uma estação na tabela UserStation
	INSERT INTO `UserStation` (`UserId`, `StationId`)
	VALUES (user_id, p_StationId);
END //
DELIMITER ;
```

#### Exemplo de chamada do *procedure*

**Argumentos:**

* **CPF** (somente números)
* **Username** (igual ao LDAP)
* **Admin** (`0`: false, `1`: true)
* **Ativo** (`0`: false, `1`: true)
* **PGUID** do GBDS (procurar CPF no GBDS)
* **ID da estação**
* **Permissões** separadas por vírgula

Chamar o procedimento armazenado para inserir um novo usuário:

```sql
CALL InsertNewUser('12345678900', 'new_user', 0, 1, NULL, 1,'1,4,5,6,7');
```

O exemplo acima cria um novo usuário com CPF `123.456.789-00`, nome de usuário `new_user`, não administrador, ativo, sem PGUID, associado à estação com ID `1` e com as permissões `1,4,5,6,7`.


# Requisitos de Hardware

## Hospedagem

O GBDS pode ser hospedado como uma solução de software *on-premises* usando uma estrutura física determinada, ou em um ambiente virtualizado, local ou remotamente (nuvem). O GBDS requer um cluster com, ao menos, três nós para funcionar corretamente e prover a redundância correta para tolerância a falhas, de acordo com seu fator de replicação.

{% hint style="info" %}
Os nós do GBDS devem compartilhar informação dentro do cluster. Logo, a infraestrutura de rede é um item extremamente importante para a correta operação da aplicação, especialmente em ambientes virtualizados, e um switch dedicado deve ser providenciado para comunicação interna entre os nós de cluster.
{% endhint %}

As necessidades de hardware para a aplicação devem ser medidas de acordo com as particularidades de projeto, tais como as modalidades biométricas a serem usadas, tempo de resposta, volume de transações, etc. Sendo o GBDS uma aplicação que faz alto uso de recursos de CPU e Memória, é mandatório que, em ambientes virtualizados, cada CPU virtual represente uma CPU física não-compartilhada, de modo a evitar mal funcionamento devido a compartilhamento de recursos.

## Necessidades Específicas de Hardware

O GBDS é baseado no framework open-source Hadoop e não demanda nenhum hardware específico para funcionamento, tal como GPUs, etc.

O uso de Discos de Estado Sólido (SSDs) é altamente recomendado para armazenamento do sistema e de informações biométricas, de forma a acelerar o processo de inicialização e prevenir qualquer mal funcionamento de escrita ou leitura. CPUs que permitem Hyper-Threading também são recomendadas para melhorar as capacidades de processamento.


# Requisitos de Software

## Sistema Operacional

O GBDS pode ser instalado nos seguintes sistemas operacionais:

* CentOS 7
* Red Hat 7
* Red Hat 8
* Oracle Linux 7
* Oracle Linux 8

## Hadoop

O GBDS é baseado no Apache Hadoop versão 3.1, que é uma coleção de softwares de código aberto. O Hadoop provê ferramentas multi-propósito para sistemas paralelos e escaláveis. Atualmente, o GBDS está integrado com os seguintes componentes do Hadoop:

* **Ambari**: Provisionamento, gerenciamento e monitoramento de um cluster Hadoop.
* **Kafka**: Sistema de fluxo distribuído para integração de dados em tempo real.
* **Zookeeper**: Sistema de coordenação que permite sincronização entre um cluster.
* **HBase**: Sistema de gerenciamento de banco de dados não-relacional.
* **HDFS**: Sistema de arquivos distribuídos projetado para rodar em *commodity hardware*.

## Banco de Dados

O GBDS usa dois diferentes sistemas de banco de dados, relacional e não-relacional:

* **HBase** Para imagens biométricas e templates.
* **MySQL** para metadata, como transações, exceções, casos criminais, perfis biométricos e latentes não resolvidas.

{% hint style="success" %}
O MySQL é recomendado, pois alguns componentes do Hadoop contam com ele internamente, o que facilita a interoperabilidade entre eles, mas é possível a adaptação a qualquer outro sistema de banco de dados SQL.
{% endhint %}

## Balanceamento Local

O modelo de extração de templates a partir de uma imagem requer mais recursos que a comparação biométrica entre templates e é realizada noo *GBDS API handler*. Para otimizar o uso de hardware, o GBDS é altamente paralelizado e cada nó em um cluster deve ser capaz de receber requisições da API, caso configurado para tal, então, é recomendado o uso de um balanceador de carga para distribuir os pedidos igualmente entre os nós, visando alcançar a melhor performance. Desse modo, não haverá nenhum nó sobrecarregado no cluster.

É possível usar balanceadores de carga tanto em hardware como em software. Uma solução simples de software para balanceamento de carga é o HAProxy, um software de código-aberto e gratuito que provê ferramentas de balanceamento de carga e proxy de servidor.


# Instalação com Ansible

## Introdução

Este manual descreve os procedimentos de instalação do GBDS.

## Preparativos para Instalação

Esta seção abrange as etapas essenciais necessárias para a instalação do GBDS.

{% hint style="warning" %}
Todas as etapas devem ser executadas com privilégios de root em todos os nós, salvo indicação em contrário.
{% endhint %}

Para instalar totalmente o GBDS, você precisará de:

* Permissão de root no servidor
* Link do pacote de ferramentas GBDS
* Link do pacote Ambari Ansible
* Link do pacote OpenCV
* Arquivos .rpm e .sql do GBDS
* Arquivos .war e .sql dos softwares do Griaule Biometric Suite (opcional)

{% hint style="info" %}
Caso não tenha os links do repositório ou os arquivos, entre em contato com a equipe de suporte da Griaule.
{% endhint %}

Em seguida, você deve seguir os passos apresentados abaixo. Essas etapas serão totalmente descritas em suas seções.

1. Faça login no servidor como root
2. [Instale o GBDS Tools](#instalando-o-gbds-tools)
3. [Configure os arquivos de configuração do GBDS Tools](#configurando-o-gbds-tools)
4. [Execute a configuração automática do ambiente GBDS Tools](#executando-a-configuracao-automatica-do-ambiente)
5. [Instale o RDB](#instalando-o-rdb)
6. [Instale o Ambari via Ansible](#instalando-o-ambari)
7. [Instale o GBDS](#instalando-o-gbds)
8. [Instale as aplicações GBS (opcional)](#instalando-as-aplicacoes-gbs)

{% hint style="success" %}
Antes de começar, certifique-se de que o `hostname` da máquina está correto. Para verificar, execute o comando:

```shell
hostname
```

Se não estiver correto, rode o comando:

```shell
hostnamectl set-hostname <hostname-desejado>
                         ^^^^^^^^^^^^^^^^^^^
```

{% endhint %}

Se o hostname for modificado, reinicie a máquina antes de prosseguir.

## GBDS Tools

GBDS Tools é uma compilação de scripts bash com características específicas e usabilidade dinâmica. O objetivo principal da ferramenta é facilitar, aprimorar e acelerar a criação, configuração e gerenciamento de aplicações do ambiente.

Todos os scripts usam um único arquivo de configuração chamado `properties.ini` e um único arquivo de lista chamado `cluster.list`, que deve conter todas as informações do grupo de servidores.

{% hint style="success" %}
Antes de começar, certifique-se de que o `wget` está instalado:

```shell
wget --version
```

Se não estiver, rode o comando:

```shell
yum install wget -y
```

{% endhint %}

### Instalando o GBDS Tools

Você tem dois métodos para escolher instalar o GBDS Tools, um se tiver o repositório Griaule já configurado no seu servidor e outro se não tiver. Estes são explicados abaixo.

{% hint style="info" %}
Escolha apenas uma alternativa. Após terminar um, não há necessidade de realizar o outro.
{% endhint %}

#### Repositório já configurado

Se você já configurou o repositório Griaule no seu servidor, você pode concluir todas as instalações com apenas um comando.

```shell
yum install gbds-tools
```

{% hint style="danger" %}
Se o repositório Griaule não estiver configurado, rodar o comando acima resultará no seguinte erro:

```default
No package gbds-tools available
Error: Nothing to do
```

Neste caso, prossiga para [Repositório não configurado](#repositorio-nao-configurado).
{% endhint %}

#### Repositório não configurado

Caso não tenha o repositório configurado, você deve garantir o bom funcionamento da ferramenta. Para fazer isso, você **DEVE** inserir a ferramenta no diretório `/opt/griaule`.

Inicie criando o diretório:

```shell
mkdir -p /opt/griaule
```

Entre no diretório criado:

```shell
cd /opt/griaule
```

Em seguida, baixe o pacote de ferramentas GBDS:

```shell
wget <link do pacote de ferramentas GBDS>
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```

{% hint style="info" %}
Caso não tenha o link, entre em contato com a Equipe de Suporte da Griaule.
{% endhint %}

{% hint style="success" %}
Nos comandos abaixo, certifique-se de substituir `<versão>` pela versão do pacote que foi baixado.
{% endhint %}

Então, instale-o:

```shell
rpm -ivh gbds-tools-<versão>.el7.noarch.rpm
                    ^^^^^^^^
```

E crie um link simbólico:

```shell
ln -s /opt/griaule/gbds-tools-<versão>/ /opt/griaule/tools
                              ^^^^^^^^
```

Após uma instalação bem-sucedida, siga para a [seção de configuração](#configurando-o-gbds-tools).

### Configurando o GBDS Tools

Os arquivos de configuração utilizados pelo GBDS Tools se encontram no diretório: `/opt/griaule/tools/shared`. Neste diretório, há três arquivos que devem ser editados:

* `properties.ini` - arquivo de configuração principal
* `cluster.list` - arquivo principal de lista de nomes de host
* `ip.list`- arquivo secundário de nomes de host

Os arquivos são pré-configurados com valores padrão na maioria dos parâmetros. Observe se algo precisa ser alterado para atender às necessidades do seu ambiente.

{% hint style="warning" %}
Alterar os **nomes de host** nos arquivos para corresponder aos do ambiente é imperativo.
{% endhint %}

{% hint style="success" %}
No arquivo `properties.ini`, procure as configurações `SPECIFIC TO` e execute as alterações necessárias para corresponder ao seu ambiente.

Na seção `SPECIFIC TO AUTO_ENVSETUP`, certifique-se de que o **nome de usuário** e **senha** estejam configurados corretamente em `usernm`, `userpw` e `rootpw`.

Na seção `SPECIFIC TO INSTALL_MYSQL`, anote a **senha do RDB**, configurada em `dbuspw`, pois ela [será usada posteriormente](#configurando-a-senha-do-rdb).
{% endhint %}

{% hint style="success" %}
No arquivo `cluster.list`, certifique-se de mudar os **nomes de host** e de adaptar o **número de hosts** em cada componente para que corresponda ao ambiente.

Por padrão, o arquivo é configurado para um cluster de **três** nós. Se o ambiente tiver, por exemplo, somente **um nó**, remova as menções aos nós 2 e 3 e substitua todos os nomes pelo nome de host do seu servidor.
{% endhint %}

{% hint style="success" %}
No arquivo `ip.list`, certifique-se de mudar os **nomes de host** e os **endereços IP** para corresponder ao ambiente, seguindo o formato `<nome de host>|<endereço IP>` em cada linha.
{% endhint %}

### Executando a configuração automática do ambiente

A configuração automática do ambiente, denominada `auto_envsetup.sh`, é a automação para configurar o ambiente. Você precisa executar este script ao construir um novo servidor do zero.

Para executar o script, execute o seguinte comando:

```shell
/opt/griaule/tools/auto_envsetup/auto_envsetup.sh --all
```

Em seguida, é recomendável atualizar todos os pacotes, se possível:

```shell
yum update -y
```

## Instalando o RDB

Para usar o GBDS, você precisará de um banco de dados relacional instalado e configurado. Você pode escolher entre [MySQL Server](#mysql-server) ou [NDB Cluster](#ndb-cluster).

{% hint style="warning" %}
Você só precisa executar **uma** instalação do RDB.
{% endhint %}

### MySQL Server

{% hint style="warning" %}
Recomenda-se instalar o MySQL no nó mestre.
{% endhint %}

Para instalar o MySQL Server, execute:

```shell
/opt/griaule/tools/install_mysql/install_mysql.sh --single
```

Então, siga para [Configurando a senha do RDB](#configurando-a-senha-do-rdb).

### NDB Cluster

{% hint style="warning" %}
A instalação do NDB **DEVE** ser no nó **MESTRE**.
{% endhint %}

**Ou**, se você optar por instalar o NDB Cluster, execute:

```shell
/opt/griaule/tools/install_mysql/install_mysql.sh --cluster
```

Então, siga para [Configurando a senha do RDB](#configurando-a-senha-do-rdb).

### Configurando a senha do RDB

Após a instalação, tente logar no MySQL executando o comando:

```shell
mysql -u root -p
```

E inserindo a senha configurada no arquivo `properties.ini` em `dbuspw`, como mencionado na [etapa anterior](#configurando-o-gbds-tools).

Se for possível logar, a instalação e configuração da senha foram bem sucedidas e você pode prosseguir para [Configurando o MySQL](#configurando-o-mysql).

***

Se não for possível logar e você ver o seguinte erro:

```html
Error: Access denied for user '<username>'@'<host>' (using password: YES)
```

Será preciso modificar a senha manualmente. Para fazer isso, use o seguinte comando para obter a senha temporária criada durante a instalação:

```shell
grep "temporary password" /var/log/mysqld.log
```

Copie a senha temporária mostrada.

Então, mude a senha usando o seguinte comando:

{% hint style="info" %}
Certifique-se de substituir `<senha_desejada>` pela senha desejada. Mantenha as apas.
{% endhint %}

```shell
mysqladmin -u root -p password "<senha_desejada>"
                                ^^^^^^^^^^^^^^^^
```

Quando solicitado, insira a senha temporária.

Então, tente logar no MySQL novamente usando a nova senha.

Se for possível logar, a instalação e configuração da senha foram bem sucedidas e você pode prosseguir para [Configurando o MySQL](#configurando-o-mysql).

### Configurando o MySQL

Finalmente, configure o banco de dados para seu ambiente.

O arquivo de configuração encontra-se em: `/etc/my.cnf`.

{% hint style="warning" %}
As configurações padrão da instalação do RDB podem não ser as configurações desejadas. Verifique-as no arquivo de configuração `my.cnf` e adapte-as para atender às necessidades do ambiente.
{% endhint %}

Após realizar as alterações necessárias, aplique-as reiniciando o serviço:

```shell
systemctl restart mysqld
```

## Instalando o Ambari

Para instalar o Ambari via Ansible, é necessário acessar o repositório Griaule.

{% hint style="warning" %}
Se o seu GBDS RDB não estiver no nó **MESTRE**, é recomendável iniciar outra instância RDB para o Ambari.
{% endhint %}

{% hint style="info" %}
A instalação requer uma conexão com a internet e pode levar 45 minutos para ser concluída sem erros. Antes de instalar, verifique se sua conexão está estável.
{% endhint %}

Para iniciar a instalação do Ambari, entre no diretório do Ansible:

```shell
cd /etc/ansible
```

Então, baixe o pacote:

```shell
wget <link do pacote Ambari Ansible>
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```

{% hint style="info" %}
Caso não tenha o link, entre em contato com a Equipe de Suporte da Griaule.
{% endhint %}

Em seguida, extraia os arquivos no diretório principal do Ansible, `/etc/ansible`, com o seguinte comando:

{% hint style="success" %}
No comando abaixo, certifique-se de substituir `<versão>` pela versão do pacote que foi baixado.
{% endhint %}

```shell
tar -xvf ansible_hdp-<versão>.tar
                     ^^^^^^^^
```

Entre no diretório extraído:

```shell
cd /etc/ansible/ansible-hadoop
```

{% hint style="success" %}
Como o processo leva algum tempo para ser concluído, é recomendável executar o script de instalação usando o `screen` para evitar interrupções.

Para isso, instale o *screen*:

```shell
yum install screen -y
```

Inicie uma nova sessão no *screen*:

```shell
screen -S ambari-install
```

Então, siga para a execução do script de instalação conforme descrito abaixo.

—

Caso a conexão com o servidor seja perdida, o script não será interrompido e você poderá retomar a sessão reconectando-se ao servidor e executando:

```shell
screen -r ambari-install
```

{% endhint %}

Então, execute o script de instalação:

```shell
./full-hadoop.sh
```

Responda às perguntas de instalação e prossiga até terminar.

{% hint style="warning" %}
Uma vez iniciado, **NÃO interrompa** nenhum dos scripts. Caso ocorra algum problema, entre em contato com a equipe de suporte da Griaule.
{% endhint %}

## Instalando o GBDS

Para instalar o GBDS, você precisará de:

* .rpm do GBDS Cluster
* .rpm do GBDS Distribution
* .sql do script de dump do RDB do GBDS
* Link do pacote OpenCV

Comece movendo os dois arquivos `.rpm` para o diretório `/opt/griaule/tools/deploy_application/files`.

O arquivo `.sql` do script de dump do RDB deve ser salvo em outro diretório.

{% hint style="warning" %}
Após a execução do script a seguir, todo o conteúdo do diretório `/opt/griaule/tools/deploy_application/files` será excluído.
{% endhint %}

Então, execute o seguinte comando para instalar o GBDS:

```shell
/opt/griaule/tools/deploy_application/deploy_application.sh --gbds
```

{% hint style="info" %}
Após tentar executar o script acima, se você receber o erro:

```
[ERROR] No OPENCV RPM found to be deployed. Make sure to stage the desired RPM
```

Entre no diretório `files`:

```shell
cd /opt/griaule/tools/deploy_application/files
```

E faça o download do pacote OpenCV:

```shell
wget <OpenCV package link>
     ^^^^^^^^^^^^^^^^^^^^^
```

Então, tente executar o script `deploy_application.sh` novamente.
{% endhint %}

Em seguida, execute o script de dump do RDB no servidor SQL.

```shell
mysql -u root -p < /PATH/DO/ARQUIVO/clear-rdb-<versão>.sql
                   ^^^^^^^^^^^^^^^^^          ^^^^^^^^
```

{% hint style="success" %}
A senha do RDB foi configurada [aqui](#configurando-a-senha-do-rdb).
{% endhint %}

Após terminar a instalação do GBDS, configure-o executando:

```shell
/opt/griaule/tools/auto_appconfig/auto_appconfig.sh --gbds
```

Para revisar ou alterar manualmente as configurações, edite o arquivo de configuração localizado em: `/etc/griaule/conf/gbds/application.conf`. Para mais informações sobre as configurações, consulte o [Manual de Configuração do GBDS](/configuracao-do-gbds/gbds4conf).

{% hint style="warning" %}
Certifique-se de que o **hostname** no arquivo de configuração (`application.conf`) corresponde ao **hostname** do servidor.
{% endhint %}

Então, inicie a API do GBDS:

```shell
service gbsapid start
```

Teste se a API está em execução:

```shell
curl http://<host-ip>:8085/gbds/v2/operations/ping
            ^^^^^^^^^
```

A resposta esperada é:

```json
{
	"data": "pong!"
}
```

Finalmente, inicie o GBDS:

```shell
gbdsstart
```

E acompanhe o *log* de execução:

```shell
gbdslogt
```

## Instalando as aplicações GBS

Para instalar as Aplicações GBS, você precisará de:

* Arquivo *.war* para cada aplicação
* Script de dump *.sql* para cada aplicação

Primeiro, instale e configure o Tomcat para as aplicações web. Isto deve ser feito somente no servidor que hospedará as aplicações web. Use o seguinte comando:

```shell
/opt/griaule/tools/install_services/install_services.sh
```

Em seguida, mova os arquivos `.war` para o diretório `/opt/griaule/tools/deploy_application/files` e execute o comando:

```shell
/opt/griaule/tools/deploy_application/deploy_application.sh --services
```

Depois disso, configure as aplicações com o seguinte comando:

```shell
/opt/griaule/tools/auto_appconfig/auto_appconfig.sh --services
```

{% hint style="info" %}
Para explorar as configurações individuais de cada aplicação, consulte os manuais de configuração correspondentes listados [aqui](/componentes-web/gbsappssetup).
{% endhint %}


# Backup

## Introdução

Esse manual descreve os processos para gerar backups da HBase e restaurar a database a partir desses backups. O processo para fazer backup da Hbase está descrito no [Manual do Apache HBase](https://hbase.apache.org/book.html#backuprestore), e esse documento ressalta as particularidades requeridas para realizar os backups do HBase do servidor GBDS.

## Configurações

Os primeiros passos para realizar o backup do banco de dados começa em [Seção 83](https://hbase.apache.org/book.html#br.overview).

Na [seção 86](https://hbase.apache.org/book.html#br.initial.setup), atente-se as configurações, que são pre-requisitos para o procedimento.

Os procedimentos na [seção 86.2](https://hbase.apache.org/book.html#_hbase_specific_changes) devem ser executados através da página de administração do Ambari:

> `http://<ambari-server>:8080/#/main/services/HBASE/configs`

Para configurar o ambiente para o backup, acesse o **HBase** através da página principal do **Ambari**, então acesse a aba de **Configs** e o menu **Advanced** para fazer as seguintes configurações:

1. Entre no menu **Advanced hbase-site** e defina o valor da propriedade `hbase.coprocessor.region.classes` para `org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint,org.apache.hadoop.hbase.backup.BackupObserver`
2. Entre no menu **Custom hbase-site** e através da opção **Add Property** option, adicione as seguintes propriedades:

   **hbase.backup.enable**

   > Valor: `true`

   **hbase.master.logcleaner.plugins**

   > Valor: `org.apache.hadoop.hbase.backup.master.BackupLogCleaner`

   **hbase.procedure.master.classes**

   > Valor: `org.apache.hadoop.hbase.backup.master.LogRollMasterProcedureManager`

   **hbase.procedure.regionserver.classes**

   > Valor: `org.apache.hadoop.hbase.backup.regionserver.LogRollRegionServerProcedureManager`

   **hbase.master.hfilecleaner.plugins**

   > Valor: `org.apache.hadoop.hbase.backup.BackupHFileCleaner`

   **hbase.regionserver.thread.compaction.small**

   > Valor: `3`

## Criando Backups

A [Seção 87.1](https://hbase.apache.org/book.html#br.creating.complete.backup) descreve a criação do arquivo de backup, que é criado inicialmente dentro do HDFS e deve ser movido para um local fora das pastas do HBase.

O seguinte comando é usado para criar o arquivo de backup, sendo completo ou incremental:

```shell
hbase backup create <type> hdfs://<NAME-NODE-SERVER>:8020/<HDFS BACKUP DIR> -t anomalies,people,transactions,uls,unresolvedlatent,quality,transactionkeys -w 3
```

As seguintes variáveis devem ser mudadas de acordo com seu ambiente antes de realizar o comando acima:

* **type**

  > Essa variável define se o backup que será criado será `full` ou `incremental`.
* **NAME-NODE-SERVER**

  > Essa variável refere-se ao Name-node server do atual ambiente onde o backup será criado. O mesmo ocorre com a exportação e restauração de backups.
* **HDFS BACKUP DIR**

  > Esta variável se refere ao diretório HDFS onde o arquivo de backup será armazenado.
* **-t**

  > Esse token se refere e deve ser seguido pelas tabelas do HBase que será incluída no arquivo de backup. O exemplo acima contém as tabelas padrão que devem ser incluidos no arquivo de backup do GBDS.
* **-w**

  > Esse token se refere e deve ser seguido pelo número de trabalhadores que irão ser dedicados na realização do backup.

{% hint style="info" %}
O número padrão de réplicas que serão criadas do arquivo de backup é `3`. Para mudar esse valor, execute o seguinte comando:

```shell
hdfs dfs -setrep -R 2 hdfs://<NAME-NODE-SERVER>:8020/<HDFS BACKUP DIR>
```

{% endhint %}

O **HDFS BACKUP DIR** deve ter o mesmo caminho usado como destino ao criar o arquivo de backup.

O token **-setrep** se refere ao novo fator de replicação sendo definido para o arquivo de backup, e é seguido pelo token **-R**, que define a operação como recursiva (a mesma operação será realizada para qualquer arquivo ou pasta dentro do caminho especificado), e o novo número de réplicas (neste caso, `2`).

## Exportando o Arquivo de Backup

Para exportar um arquivo de backup, o seguinte comando deve ser usado par amover o arquivo de backup para a unidade local, para então ser movido para uma fonte externa:

```shell
hdfs dfs -get hdfs://<NAME-NODE-SERVER>:8020/<HDFS> /<LOCAL-DRIVE-DIR>
```

As variáveis desse comando são descritas em [Criando Backups](#criando-backups).

A variável **LOCAL-DRIVE-DIR** deve ser mudada de acordo com o caminho na unidade local onde o arquivo de backup será movido.

## Restaurando Backups

A [Seção 87.2](https://hbase.apache.org/book.html#br.restoring.backup) descreve o processo para restaurar o banco de dados para o estado antes do backup.

Há duas opções para restaurar um arquivo de backup: para o mesmo ambiente (sem exportar o arquivo de backup do HDFS) e para um ambiente diferente (importando um arquivo de backup externo). As seções seguintes detalham ambos casos.

### Restaurando ao Mesmo Ambiente

The following command is used to restore a backup within the same HDFS:

```shell
hbase backup history
hbase restore hdfs://<NAME-NODE-SERVER>:8020/<HDFS BACKUP DIR> <backup-id> -o -t anomalies,people,transactions,uls,unresolvedlatent,quality,transactionkeys
```

No comando acima, o **HDFS BACKUP DIR** deve ser mudado de acordo com o caminho para o arquivo de backup que será restaurado. O **backup-id** deve ser o identificador único do backup que será restaurado.

O token **-o** define se os dados atuais devem ser sobrescritos pela restauração e o token **-t** refere-se às tabelas HBase que devem ser restaurado a partir do backup.

### Resutanrando para um Ambiente Diferente

Para restaurar o backup com um ambiente diferente, o backup deve ser previamente exportado do ambiente original de acordo com o processo descrito na seção [Exportando o Arquivo de Backup](#exportando-o-arquivo-de-backup). Uma vez que é movido a unidade local do novo ambiente, ele deve ser colocado no HDFS através do seguinte comando:

```shell
hdfs dfs -put <LOCAL DRIVE BACKUP DIR> hdfs://<NAME-NODE-SERVER>:8020/<HDFS BACKUP DIR>
```

O **LOCAL DRIVE BACKUP DIR** deve ser o caminho dentro da unidade local onde o arquivo de backup está localizado e o **HDFS BACKUP DIR** deve ser o caminho dentro do HDFS local onde o backup será armazenado. Uma vez que o backup é importado, o processo de restauração é o mesmo descrito em [Restaurando ao Mesmo Ambiente](#restaurando-ao-mesmo-ambiente).


# Segurança

## Visão Geral de Segurança do GBDS

O GBDS possui um módulo de segurança que usa tokens JWT para realizar autenticação e autorização do usuário. O GBDS pode ser integrado com qualquer diretório de usuários compatível com LDAP para autenticação, e com o Apache Ranger para prover auditoria de autorização e acesso.

### Componentes

Há quatro componentes principais que trabalham juntos para prover segurança às operações do GBDS: Módulo de Segurança do API, Ranger, Solr e o Armazenamento de Credenciais LDAP.

* Módulo de Segurança do API

  > Todas requisições da API primeiro passam pelo módulo de segurança, que impõe autenticação e autorização para recursos protegidos.
* Armazenamento de Credenciais LDAP

  > Uma instância LDAP (como Active Dicertory, OpenLDAP), mantém informação sobre usuários e grupos de usuários, e provê autenticação para o acessar o GBDS API e autorizar as transações da API.
* Ranger

  > Apache Ranger é um framework de segurança que provê um controle de acesso refinado ao GBDS API. Políticas de segurança podem ser criadas para barrar ou permitir acessos aos *endpoints* da API baseado em critérios como grupo de usuário, nome de usuário, recursos requeridos, métodos HTTP usados e endereço de IP.
* Solr

  > O GBDS usa Solr para armazenar logs de acesso para todos pedidos de API, através do painel de controle do Ranger, esses logs podem ser vistos, buscados e exportador.

### Fluxos de Trabalho Habilitados para Segurança

#### Autenticação

Há dois métodos para autenticar com a API. Quando o cliente não possui um token válido, deve ser usada autenticação por credenciais. Nesse caso, o cliente faz um pedido para o endpoint de criação de token, passando um *payload* JSON com as credenciais válidas para um usuário no registrado no LDAP. Em seguida, o Módulo de Segurança cria um vínculo com o diretório LDAP, usando as credenciais do usuário de vinculação (Bind User, veja abaixo), e realiza a autenticação. Então, cria um Sujeito Autenticado: um usuário associado com todos os grupos a que ele pertence. Finalmente, o Módulo de Segurança constrói um token JWT, assina-o digitalmente e o retorna para o cliente. Este token pode ser usado para realizar requisições subsequentes à API do GBDS.

![Authentication Flow](/files/wyapDUKgibF65OxI9T2q)

Quando o cliente já tem um token válido, mas próximo de expirar, é possível usar este token para criar um novo com um tempo de expiração posterior. Primeiro o cliente faz uma requisição para o endpoint de criação de token com o token válido. O Módulo de Segurança validará o token e criará um novo, usando o mesmo Sujeito Autenticado, mas com um novo *expirationTime*. O novo token será enviado ao usuário. Como esse fluxo não exige a consulta ao diretório LDAP, ele é muito mais rápido. Aplicações cliente devem ser projetadas para usar a renovação de token sempre que possível.

![Authentication Flow](/files/OrTIBCv88BLI7pIqmCLn)

#### Realizando uma Requisição de API

Quando um token JWT válido é adquirido, ele é enviado à API do GBDS com toda requisição, seguindo o padrão JWT. A requisição terá um cabeçalho de autorização com o esquema *Bearer*, isso é, `Authorization: Bearer <token>`. Para recursos protegidos, o Módulo de Segurança extrairá o token do cabeçalho e validará sua assinatura usando a Chave de Assinatura original. Se o token for válido, a requisição é autenticada. A seguir, o Módulo de Segurança construirá um *AuthorizationContext* com o nome do sujeito, grupo do sujeito, recursos da requisição, endereço de IP e método HTTP. Este *AuthorizationContext* será enviado ao Ranger para autorizar ou negar a requisição e será gravado pelo Solr, junto de seus resultados: *Allowed* ou *Denied*. Finalmente, se a requisição for autorizada, será encaminhada para a API do GBDS para processamento.

![Making an API Request](/files/5fXJ1wd3RUwhViDgkJ4f)

### Configurações

#### Arquivos

O módulo de segurança usa quatro arquivos de configuração diferentes:

* `/etc/griaule/conf/gbscluster.properties`: Arquivo primário de configuração do GBDS. Quando a segurança está ativa, opções de segurança são configuradas neste arquivo.
* `/etc/griaule/conf/gbsapi/keystore.jks`: *Keystore* protegida por senha contendo o **Ldap Bind User Password** e **JWT Signing Key**. Somente acessível pelo usuário griaule.
* `/etc/griaule/conf/gbsapi/truststore`: *Truststore* protegida por senha contendo o **Ldap Server Certificate** para permitir conexões LDAP. Somente acessível pelo usuário griaule.
* `/etc/griaule/conf/gbsapi/.password`: Arquivo de senhas contendo as senhas de *keystore* e *truststore*. As senhas são armazenadas em texto claro, e só deve ser acessível pelo usuário griaule.

#### Opções de Segurança

O GBDS pode funcionar com ou sem a segurança ativada, e isso é controlado pela chave de configuração booleana: `gbscluster.api.security.enabled`. Quando essa chave é definida como *false*, toda segurança é desabilitada e todas as outras chaves de segurança são ignoradas. Se for definida como *true*, as seguintes chaves de configuração **DEVEM** também ser configuradas:

**Gerais**

* `gbscluster.api.security.keystore`: caminho para o *keystore* gerado a partir do script de geração do *keystore*
* `gbscluster.api.security.truststore`: caminho para o *truststore* que possui o certificado do servidor LDAP. Requerido para usar LDAPs.
* `gbscluster.api.security.passwords`: caminho para o arquivo contendo as senhas do *truststore* e *keystore*. Esse arquivo deve ter acesso restrito ao usuário griaule.

**Autenticação**

* `gbscluster.api.security.ldap.url`: URL de conexão ao servidor de armazenamento de usuário LDAP.
* `gbscluster.api.security.ldap.userSearchBase`: Nome Distinto/Distinguished Name (DN) do repositório de usuários no servidor LDAP. Exemplo: `ou=Users,dc=pd,dc=griaule`
* `gbscluster.api.security.ldap.userSearchAttribute`: Atributo de usuário que será usado como nome de usuário durante a autenticação. Exemplo: `sAMAccountName`, `uid`
* `gbscluster.api.security.ldap.userGroupMembershipAttribute`: Atributo de usuário contendo as informações de associação de grupo. Exemplo: `memberOf`
* `gbscluster.api.security.ldap.bindUserDN` Nome distinto do usuário de vinculação (Bind User). O usuário de vinculação é uma conta de usuário usada pelo GBDS para vincular ao servidor LDAP, autenticar usuários e buscar seus grupos.

**Token**

* `gbscluster.api.security.token.ttlInMilliseconds`: Tempo de vida, em milissegundos, do token JWT. Valores válidos: entre 30 minutos e 3 horas.

**Autorização**

* `gbscluster.api.security.authorization.ranger.configurationDirectory`: Diretório com as configurações específicas do ranger do GBDS.

## Integrando com o Diretório Ativo

### Verificando Resolução de DNS

Antes de iniciar, certifique-se que a resolução de nome para o domínio em que as máquinas de cluster serão integradas está funcionando corretamente. Para o domínio chamado de pd.griaule, use o seguinte comando:

```sh
dig -t SRV _ldap._tcp.pd.griaule
```

{% hint style="info" %}
Certifique-se que a SEÇÃO DE RESPOSTA está presente e contém o hostname e o endereço IP do controlador do domínio.
{% endhint %}

{% hint style="warning" %}
**Resolva qualquer problema na resolução de DNS antes de continuar.**
{% endhint %}

### Instalando os Pacotes Necessários

```sh
sudo yum install realmd sssd oddjob oddjob-mkhomedir adcli sssd-ad sssd-tools
```

### Integrando com o DA

Usar o utilitário *realm* é a forma mais conveniente de integrar SSSD com DA. Execute o seguinte comando para mostrar as informações básicas sobre o domínio:

```sh
realm discover <domain_name>
```

#### Entre no Domínio

Para entrar, você necessitará de uma conta que pertença ao grupo de administradores do domínio.

```sh
sudo realm join -U <username> <domain_name>
```

Depois, habilite NSS e PAM com:

```sh
authconfig --enablesssd --update
```

E, finalmente, verifique se a máquina ingressou no domínio com sucesso consultando um usuário no domínio:

```sh
id <username>@<domain_name>
```

#### Solucionando Erros

Se algum problema surgir, use as seguintes dicas:

* Verifique novamente a resolução de nomes do DNS. Esta é a causa mais frequente de erros.
* Certifique-se que os diretórios `/etc/sssd/` e `/etc/sssd/conf.d` existem e ambos possuem permissão 0600.
* Aumente o debug\_level em `/etc/sssd/sssd.conf` em todas as sessões, isto é, `[sssd]`, `[nss]`, `[pam]`, `[domain]`. Então, reinicie o serviço sssd: `sudo service sssd restart`. Os logs serão gerados na pasta `/var/log/sssd/`
* No caso do erro `Insufficient permission to join the domain ...`: o usuário usado para entrar no domínio não possui permissão. Verifique se o usuário faz parte do `Domain Admins group`

## Integrando com o OpenLdap

Esse guia explica como realizar a instalação **mínima** do OpenLDAP que será compatível com o GBDS para autenticação e autorização.

### Instale o OpenLdap

#### Dependências

Conecte-se ao host LDAP e instale os pacotes necessários:

```sh
sudo yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel
```

#### Inicie Ldap Daemon

Seguindo, inicie o LDAP Daemon e configure para que ele inicialize automaticamente no boot do sistema:

```sh
systemctl start slapd.service

systemctl enable slapd.service
```

#### Gere a senha de root

Execute o comando `ldappasswd` para criar uma senha root do LDAP. Escreva tanto a senha normal como a versão codificada retornada pelo `ldappasswd`.

```sh
sudo slappasswd
```

#### Crie o hdb-database

O *hdb* é uma variante hierárquica do backend de banco de dados bdb. No modelo de configuração abaixo, defina as seguintes variáveis de acordo com seu caso de uso:

* **olcSuffix**: Representa o nome de domínio para qual o o LDAP ira fornecer a informação da conta. Adicionalmente, esse nome distinto irá ser adicionado às *queries* que serão enviadas ao backend.
* **olcRootDN**: é o nome distinto do usuário que irá possuir acesso de administrador ao servidor LDAP.
* **olcRootPW**: Define a senha do usuário administrador. A senha será o resultado codificado do comando `slappasswd`, que foi executado previamente.

Coloque a configuração em um arquivo chamado `db.ldif`.

{% hint style="warning" %}
**CERTIFIQUE-SE DE SUBSTITUIR o olcRootPW, olcRootDN e o olcSuffix.**
{% endhint %}

```default
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=oldap,dc=pd,dc=griaule

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=ldapadm,dc=oldap,dc=pd,dc=griaule

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}theHashedPasswordValueFromSlapPasswd
```

{% hint style="warning" %}
Certifique-se de que não há espaços desnecessários ou linhas vazias, ou problemas poderão ocorrer. Veja: <https://serverfault.com/questions/578710/wrong-attributetype-when-using-ldapadd>
{% endhint %}

Envie as mudanças ao servidor

```sh
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f db.ldif
```

{% hint style="warning" %}
Se você não usar *sudo*, terá problemas de permissão: `ldap_modify: Insufficient access (50)`
{% endhint %}

#### Restrinja o Acesso de Monitoramento ao ldapadm

Coloque as seguintes configurações no arquivo chamado `monitor.ldif` e atualize o `dn.base`, onde está escrito *UPDATE ME*, com o nome distinto do valor definido previamente ao `oclRootDN`.

```default
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external, cn=auth" read by dn.base="UPDATE ME" read by * none
```

Envie as mudanças ao servidor

```sh
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f monitor.ldif
```

{% hint style="warning" %}
Se você não usar *sudo*, você terá problemas de permissão: `ldap_modify: Insufficient access (50)`
{% endhint %}

#### Adicione o arquivo de configuração do hdb-backend

Este arquivo define as opções de configurações básicas para o hdb-backend:

```sh
sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
sudo chown ldap:ldap /var/lib/ldap/DB_CONFIG
```

#### Adicione esquemas essenciais do LDAP

```sh
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
```

#### Habilite o módulo memberOf

{% hint style="warning" %}
**É NECESSÁRIO FAZER ISSO ANTES DE QUALQUER GRUPO SER CRIADO. O ATRIBUTO MEMBEROF É UM ATRIBUTO OPERACIONAL E NÃO É CRIADO RETROATIVAMENTE.**
{% endhint %}

Este módulo é necessário para a consulta dos grupos de um usuário. Coloque a seguinte configuração no arquivo chamado `memberof_config.ldif`:

```default
dn: cn=module,cn=config
cn: module
objectclass: olcModuleList
objectclass: top
olcmoduleload: memberof.la
olcmodulepath: /usr/lib64/openldap

dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
```

Para enviar as mudanças ao servidor, execute o comando:

```sh
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f memberof_config.ldif
```

#### Gere o banco de dados para seu domínio

Finalmente, especificamos o banco de dados, que usará as configurações previamente criadas, para fornecer todas requisições ao domínio (valor de `olcSuffix`). Atualize o DN de *Users* e *Groups* para coincidir com as configurações do domínio. Insira as configurações em `db_structure.ldif`.

```default
# Create entry for domain
dn: dc=oldap,dc=pd,dc=griaule
objectClass: domain
objectClass: top
dc: oldap

# Create an OU for Users
dn: ou=Users,dc=oldap,dc=pd,dc=griaule
objectClass: organizationalUnit
ou: Users

# Create an OU for Groups
dn: ou=Groups,dc=oldap,dc=pd,dc=griaule
objectClass: organizationalUnit
ou: Groups
```

Para enviar as mudanças para o servidor, use a conta de administrador configurada (`olcRootDN`) depois do parâmetro `-D`. O utilitário `ldapadd` perguntará pela senha da conta de administrador previamente definida.

```sh
sudo ldapadd -x -D 'cn=ldapadm,dc=oldap,dc=pd,dc=griaule' -W -H ldapi:/// -f db_structure.ldif
```

### Solucionando Erros

Note que as mensagens de erro retornadas pelo OpenLdap podem ser confusas. Se tiver problemas com a instalação, é recomendável habilitar o modo debug. Pare o serviço slapd e então reinicie diretamente o processo com a flag de debug `-d -1`:

```sh
slapd -d -1 -u ldap -h "ldap:/// ldapi:///"
```

Se o TLS estiver habilitado, inclua também a string para o endpoint do ldaps:

```sh
slapd -d -1 -u ldap -h "ldap:/// ldapi:/// ldaps:///"
```

### Criptografando senhas OpenLdap

Por padrão, OpenLdap armazena as senhas em texto claro. Para mudar este comportamento, é necessário: [Definir um algoritmo global de hash](#configurando-o-algoritmo-hash) de senhas e [habilitar a política de senhas](#criando-uma-politica-de-senha-padrao) para automaticamente criptografar qualquer senha em texto claro.

#### Configurando o Algoritmo Hash

Usaremos o algoritmo SHA-512 com 50000 rodadas e sal de 16 bytes. Crie um arquivo chamado `hash_algorithm.ldif`

```default
dn: cn=config
replace: olcPasswordHash
olcPasswordHash: {CRYPT}

dn: cn=config
replace: olcPasswordCryptSaltFormat
olcPasswordCryptSaltFormat: $6$rounds=50000$%.16s
```

Para enviar as configurações ao servidor:

```sh
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f hash_algorithm.ldif
```

#### Importar o Esquema de Política de Senha

```sh
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
```

#### Carregar o módulo de Política de Senha

Crie um arquivo chamado `password_policy_config.ldif` contendo:

```default
# load password policy module
dn: cn=module,cn=config
cn: module
objectClass: top
objectClass: olcModuleList
olcModuleLoad: ppolicy.la
olcModulePath: /usr/lib64/openldap

# apply the password policy overlay our database
dn: olcOverlay={1}ppolicy,olcDatabase={2}hdb,cn=config
objectClass: olcPPolicyConfig
objectClass: olcOverlayConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=Password Policy,ou=Policies,dc=oldap,dc=pd,dc=griaule
olcPPolicyForwardUpdates: FALSE
olcPPolicyHashCleartext: TRUE
olcPPolicyUseLockout: FALSE
```

Então envie as mudanças com:

```sh
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f password_policy_config.ldif
```

Se você encontrar um erro indicando que o pwdAttribute não existe, isto significa que o esquema de política de senha não foi importado.

#### Criando uma Política de Senha Padrão

Crie um arquivo chamado `password_policy.ldif` contendo:

```default
# create default password policy
dn: cn=Password Policy,ou=Policies,dc=oldap,dc=pd,dc=griaule
objectClass: top
objectClass: device
objectClass: pwdPolicy
cn: Password Policy
```

Então envie as mudanças com o comando abaixo, substituindo o `olcRootDN`:

```sh
sudo ldapadd -x -D '<olcRootDN>' -W -H ldapi:/// -f db_structure.ldif
```

### Melhorando a Segurança

#### Desativando Vinculação Anônima

Crie um arquivo `disable_anon_binding.ldif` contendo:

```default
dn: olcDatabase={-1}frontend,cn=config
add: olcRequires
olcRequires: authc

dn: olcDatabase={2}hdb,cn=config
add: olcRequires
olcRequires: authc
```

Então envie as mudanças:

```sh
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f disable_anon_binding.ldif
```

Para testar se as mudanças funcionaram, execute a seguinte busca anônima:

```sh
# without TLS
ldapsearch -x -LLL -H ldapi:/// "(cn=*)"
# Or with TLS
ldapsearch -x -LLL -H ldaps:/// "(cn=*)"
```

#### Desativando Permissão de Leitura para Senhas de Usuário

Finalmente, qualquer usuário pode obter a senha de outro usuário. Mesmo que as senhas estejam criptografadas, isso deve ser evitado. Ainda mais se for decidido manter as senhas em texto claro. Então, crie um arquivo chamado `disabled_password_read.ldif`.

{% hint style="warning" %}
**CERTIFIQUE-SE QUE NÃO HÁ QUEBRA DE LINHA PARA olcAccess**
{% endhint %}

```default
dn: olcDatabase={2}hdb,cn=config
add: olcAccess
olcAccess: to attrs=userPassword by dn="<olcRootDN>" write by self write by * auth
-
add: olcAccess
olcAccess: to * by dn="<olcRootDN>" write by users read by self write by * auth
```

Envie as mudanças:

```sh
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f disabled_password_read.ldif
```

Se você executar uma busca vinculada com qualquer usuário que não for o olcRootDN, a única senha retornada será a do próprio usuário.

```sh
ldapsearch -x -D '<non_root>' -LLL -H ldapi:/// "(cn=*)"
```

### Habilitando LDAPs

Antes de continuar, certifique-se que sua instância do OpenLdap está funcionando e que ela possui duas unidades organizacionais: uma para os usuários e uma para os grupos. Você pode fazer isso usando o Apache Directory Studio para conectar ao servidor usando a URL de conexão ldap, por exemplo: <ldap://192.168.0.100:389>, e com sua conta de administrador configurada (**olcRootDN**).

Para habilitar LDAPS, será necessário um certificado válido assinado por uma autoridade confiável (trusted authority). Alternativamente, nós provemos um guia de como configurar seu próprio certificado de autoridade e como usar isso para assinar certificados do seu servidor.

#### Crie seu CA

Se você já tem um certificado válido, você pode pular esse passo.

No CentOS, você encontrará o arquivo `openssl.cnf`, que contém a configuração principal para seu CA, no diretório `/etc/pki/tls`. Todavia, o nosso CA será colocado em `/etc/pki/CA`.

Primeiro, crie o arquivo `index.txt` e os arquivos seriais, que conterão informações dos certificados assinados e número serial certificado a ser usado, respectivamente.

```sh
touch /etc/pki/CA/index.txt
echo '01' > /etc/pki/CA/serial
```

Seguindo, adicione as seguintes políticas para `/etc/pki/tls/openssl.cnf`:

```properties
# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ signing_policy ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ signing_req ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
```

Agora, mude para o diretório do CA:

```sh
cd /etc/pki/CA
```

Nós geraremos o certificado CA, válido por 10 anos, com o comando a seguir. O utilitário pedirá que você defina a senha da chave privada e informações sobre o sujeito do certificado (o CA, nesse caso). Anote esta senha, ela será exigida para assinar certificados.

```sh
openssl req -config /etc/pki/tls/openssl.cnf -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650
```

Em seguida, limite os direitos de acesso à chave privada do CA:

```sh
chmod 0400 private/cakey.pem
```

#### Crie um Certificado do Servidor LDAP

Primeiro, criamos uma requisição de assinatura do certificado para o servidor LDAP:

```sh
openssl req -config /etc/pki/tls/openssl.cnf -newkey rsa:2048 -nodes -sha256 -out ldap_cert.csr -outform PEM -keyout ldap_key.pem
```

Depois, assinamos o `server.csr` usando a chave privada do CA:

```sh
openssl ca -config /etc/pki/tls/openssl.cnf -policy signing_policy -extensions signing_req -out ldap_cert.pem -infiles ldap_cert.csr
```

Agora, o `ldap_cert.pem` é o certificado para seu servidor e sua chave privada está no arquivo `ldap_key.pem`.

{% hint style="info" %}
a chave privada para o servidor não está criptografada (`-nodes` parameter). Isto é menos seguro, mas o **OpenLdap não tem suporte para chaves criptogradas**. Então, é indispensável restringir todo acesso a esse arquivo, como será feito nos próximos passos.
{% endhint %}

#### Configurando o OpenLdap para usar o certificado e a chave

Primeiro, copie o certificado CA para `/etc/openldap/cacerts`. Isto fará o OpenLdap confiar no certificado assinado pelo seu CA.

```sh
mkdir /etc/openldap/cacerts
cp /etc/pki/CA/cacert.pem  /etc/openldap/cacerts
chown -R ldap:ldap /etc/openldap/cacerts/
```

Em seguida, instale o certificado do seu servidor ldap em `/etc/openldap/certs`:

```sh
mv /etc/pki/CA/ldap_cert.pem /etc/openldap/certs
chown ldap:ldap /etc/openldap/certs/ldap_cert.pem

mv /etc/pki/CA/ldap_key.pem /etc/openldap/certs
chown ldap:ldap /etc/openldap/certs/ldap_key.pem
chmod 400 /etc/openldap/certs/ldap_key.pem
```

Definir a permissão 400 para a chave privada do servidor é **INDISPENSÁVEL**.

Crie um arquivo chamado `enable_ldaps.ldif` com as seguintes configurações:

```default
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/cacerts/cacert.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/ldap_cert.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/ldap_key.pem
```

Então, envie as mudanças para o servidor e teste os arquivos de configuração:

```sh
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f enable_ldaps.ldif
```

#### Habilite o Endpoint TLS

No arquivo `/etc/sysconfig/slapd`, adicione `ldaps:///` na linha que começa com `SLAPD_URLS=`. Depois disso, a linha deve ser similar a:

```properties
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"
```

#### Forçar o TLS

Crie um arquivo chamado `force_tls.ldif` com o seguinte conteúdo:

```default
dn: olcDatabase={2}hdb,cn=config
changetype:  modify
add: olcSecurity
olcSecurity: tls=1
```

Então, envie as mudanças para o servidor:

```sh
sudo ldapmodify -v -Y EXTERNAL -H ldapi:/// -f force_tls.ldif
```

Agora teste o requerimento TLS rodando a seguinte busca. Ela deve ser negada devido ao requerimento do TLS:

```sh
ldapsearch -H ldap://<host> -D "cn=ldapadm,dc=oldap,dc=pd,dc=griaule" -W '(uid=ldapadm)'
```

{% hint style="warning" %}
A PARTIR DE AGORA, QUALQUER CHAMADA DO `ldapi:///` QUE NECESSITE DO *olcRootDN* (i.e. aquelas que criam entidades na árvore do diretório) NECESSITA SER REALIZADA NO `ldaps:///`. CHAMADAS QUE PODEM USAR `-Y EXTERNAL` (i.e., que modifica `cn=config`) PODEM AINDA USAR `ldapi:///`.
{% endhint %}

#### Configuração do TLS do lado do cliente

Para permitir que utilitários como `ldapsearch` se conectem via TLS, adicione `TLS_REQCERT allow` para `/etc/openldap/ldap.conf`:

```sh
echo "TLS_REQCERT allow" >> /etc/openldap/ldap.conf
```

### Crie um Usuário Vinculado para o Ranger do GBDS

O GBDS e o Ranger exigirão que o usuário vincule-se ao servidor LDAP para executar queries e autenticações. O único privilégio que este usuário necessita é ler a árvore de diretórios.

{% hint style="warning" %}
Não use o olcRootDN como o usuário de vínculo.
{% endhint %}

Crie um arquivo chamado `bind_user.ldif` com o seguinte conteúdo. **Substitua** o `dn:` por um que coincida com sua instalação. Adicionalmente, defina a senha do usuário de vinculação. Se você habilitar a criptografia de senha, escreva a senha em texto claro. Senão, use o slappasswd para produzir um hash para a senha e escreva o hash no arquivo `.ldif` (Similar a como foi criado a senha do **olcRootDN**).

```default
dn: cn=gbds_bind,ou=Users,dc=oldap,dc=pd,dc=griaule
objectClass: top
objectClass: person
objectClass: inetOrgPerson
cn: gbds_bind
uid: gbds.bind
sn: Bind User
userPassword: <password>
```

Envia as mudanças com:

```sh
# for tls enabled
ldapadd -D "<olcRootDN>" -W -H ldaps:/// -f bind_user.ldif
# without tls
ldapadd -D "<olcRootDN>" -W -H ldapi:/// -f bind_user.ldif
```

Para testar se o usuário foi criado corretamente, execute a seguinte busca autenticando com o usuário vinculado `credentials:his`

```sh
ldapsearch -D "<bind_user_dn>" -W -H ldaps:/// "(cn=gbds_bind)"
```

### API do LDAP

A API LDAP é uma API fornecida pela Griaule para auxiliar o gerenciamento de usuários e grupos. Você pode autenticar, criar, excluir ou modificar dados de usuários e listar dados de usuários e dados de grupos por meio da API.

{% hint style="info" %}
Se os arquivos da API não foram fornecidos, entre em contato com a Equipe de Suporte da Griaule.
{% endhint %}

A API completa pode ser acessada em [Api do LDAP](/apis/ldap).

{% hint style="warning" %}
A API funciona com segurança SSL e é necessário uma truststore e keystore. Para mais informações sobre a criação dessas, veja a seção [Configurando a Segurança do GBDS](#configurando-a-segurança-do-gbds).
{% endhint %}

#### Configurando a API

Para instalar e configurar corretamente a API, siga as etapas:

1. Extraia o pacote fornecido.
2. Em `/etc/griaule` crie o diretório `ldap`.
3. Mova o diretório `conf` do pacote fornecido para o diretório `/etc/griaule/ldap`.
4. Mova o `config.properties` para o diretório `/etc/griaule/ldap`.
5. Abra o arquivo `config.properties` e ajuste os parâmetros de configuração de acordo com seu ambiente.
6. Em `/var/lib/griaule` crie o diretório `ldap`.
7. Mova o arquivo `bs-ldap-api.jar` e o script `kill-api.sh` e `start-api.sh` para o novo diretório.
8. Execute o script de início (start).

#### Criando Novos Usuários e Grupos

Para criar um novo usuário, chame [Create User](https://gitbook.griaule.com/apis/ldap/create#post-ldap-user). A API criará o usuário, a senha e os grupos aos quais o usuário pertence.

Se forem necessárias modificações em um usuário existente, chame [Modify User Data](https://gitbook.griaule.com/apis/ldap/user#put-ldap-user-user).

Para recuperar dados do usuário, chame [Get User Data](https://gitbook.griaule.com/apis/ldap/user#get-ldap-user-user).

Para adicionar, modificar ou excluir grupos, acesse `/etc/griaule/ldap/conf/group-list.json` e modifique o arquivo de acordo com o desejado. Você também pode ver todos os grupos chamando [List Groups](https://gitbook.griaule.com/apis/ldap/list#get-ldap-user-groups).

## Instalando o Ranger

Depois que o OpenLdap ou o Active Directory estiverem configurados, pode-se proceder para instalação do Ranger.

### Pré-requisitos

#### Instalando o ambari-infra

Vá para o ambari e instale o serviço Ambari-infra. Isso proverá uma instância do Solr para armazenar data auditada para o Ranger.

#### Instale e Configure a Instância MySQL

1. Instale uma instância do MySQL
2. Crie o usuário rangerdba e conceda os privilégios necessário

   ```sql
   CREATE USER 'rangerdba'@'localhost' IDENTIFIED BY 'Rangerdba$1';

   GRANT ALL PRIVILEGES ON *.* TO 'rangerdba'@'localhost' IDENTIFIED BY 'Rangerdba$1' WITH GRANT OPTION;

   CREATE USER 'rangerdba'@'%' IDENTIFIED BY 'Rangerdba$1';

   GRANT ALL PRIVILEGES ON *.* TO 'rangerdba'@'%';

   GRANT ALL PRIVILEGES ON *.* TO 'rangerdba'@'%' IDENTIFIED BY 'Rangerdba$1' WITH GRANT OPTION;

   FLUSH PRIVILEGES;
   ```

   > Note que Rangerdba$1 é a senha para o usuário rangerba. Substitua pela senha desejada.
3. Teste se o usuário rangerdba foi criado com sucesso: `mysql -u rangerdba -p`
4. Instale o conector MySQL: `yum install mysql-connector-java*`
5. Registre o conector com o ambari, executando os seguintes comandos no host com o servidor ambari instalado: `ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java.jar`

### Instalando o Serviço do Ranger

Vá para o ambari e adicione o serviço do Ranger. Visite cada uma das seguintes abas de configuração antes de finalizar a instalação.

#### Ranger Admin

1. Deixe o nome de usuário do Ranger DB como `rangeradmin`. Coloque a senha que você quiser, mas salve-a para depois.
2. Certifique-se que as opções `Setup Database` e `Database User` estão marcadas como `Yes`
3. Para o nome de usuário DBA, use a conta de usuário criada nos passos anteriores.

#### Informações de Usuários do Ranger

Esse serviço importará usuários e grupos no banco de dados do ranger.

{% hint style="info" %}
Abaixo, nos damos **SUGESTÕES** para valores em várias opções de configurações requeridas. Você deve se certificar de que correspondem à sua implantação LDAP.
{% endhint %}

1. Mude o *Sync Source* para o `Ldap/AD`
2. Na aba *Common Config*:
   1. **LDAP/AD URL**: Se a URL configurada aqui for para o LDAPS, o certificado do LDAPS necessitará ser importada no usersync truststore como se for descrito na seção [Importar o Certificado Ldaps](#importar-o-certificado-ldaps)
   2. **Bind User**: Preencha o usuário DN vinculado e a senha. O usuário só precisa ter privilégio de leitura para o repositório de Usuários e Grupos.
3. Na aba *User Configs*:
   1. **Username Attribute**: atributos que armazenam o userName para login. Para AD, **usualmente** `sAMAccountName` e para o OpenLdap, `uid`.
   2. **User Search Base**: DN para o nó que contém o usuário que necessita ser sincronizado (Usuário AD).
4. Na aba *Group Configs*:
   1. **Group member Attribute**: Atributo da entidade de Grupos que armazena qual usuário pertence a qual grupo, além de informação sobre a associação usuário-grupo. É **usualmente** `member`
   2. **Group Name Attribute**: Atributo do grupo que contém o nome do grupo. **Usualmente** `cn`
   3. **Group Object Class**: Classe da entidade de grupo. Para AD, é **usualmente** `group`, para o OpenLdap é **usualmente** `groupOfNames`
   4. **Group Search Base**: com o nó que contém os grupos que precisam ser sincronizados

#### Ranger Audit

1. Marque a opção `Audit to Solr`
2. Marque a opção `Solr Cloud`

### Checagem da Instalação

#### Sincronização de Usuário

Vá para o website do ranger em `http://<host>:6080`, faça o login e vá para *Settings*, e então, *Users/Groups*. Todos os usuários e grupos da *User/Group Search Base* devem estar presentes. Se não for o caso, ocorreu um problema com a sincronização de usuário. Verifique o log em `/var/log/ranger/usersync/usersync.log` para identificar o erro.

#### Solr Audit

Vá ao ambari-infra UI e verifique a existência da coleção `ranger_audits`

### Habilitando a Integração do Ldap com TLS

Para habilitar o Ranger a usar o LDAPS em vez do LDAP, duas mudanças precisam ser feitas. Primeiro, precisamos atualizar a URL de conexão do ldap para a URL protegida pelo TLS. Segundo, precisamos importar o certificado LDAPS.

#### Mudando a URL de Conexão do Ldap

Vá, para o Ambari, *Ranger*, *Configs*, *Ranger User Info*, *Common Configs*. Mude o LDAP/AD URL para `ldaps://<hostname>:636`

#### Importar o Certificado Ldaps

Se seu repositório Ldap está usando TLS, você precisa importar seu certificado no *UserSync truststore* do ranger.

Para obter a localização do *truststore*, vá para o Ambari, *Ranger*, *Configs*, *Advanced*, *Advanced ranger-ugsync-site*, `ranger.usersync.truststore.file`. Então, use o keytool do Java para importar o certificado do Ldaps na *truststore*. Se a *truststore* já existir, haverá necessidade de uma senha. Se não, anote a senha usada. Você precisará dela depois.

```sh
sudo keytool -import -trustcacerts -alias $ALIAS -file $PATH_TO_YOUR_LDAPS_CERT -keystore /usr/hdp/current/ranger-usersync/conf/mytruststore.jks
```

Seguindo, corrija a permissão e o proprietário da *truststore*.

```sh
sudo chmod 640 /usr/hdp/current/ranger-usersync/conf/mytruststore.jks
sudo chown ranger:ranger /usr/hdp/current/ranger-usersync/conf/mytruststore.jks
```

Se a *truststore* for nova, vá para o Ambari, *Ranger*, *Configs*, *Advanced*, *Advanced ranger-ugsync-site* e defina as propriedades:

1. **ranger.usersync.truststore.file**: com o caminho absoluto para a *truststore*
2. **ranger.usersync.truststore.password**: senha para a *truststore*

#### Solucionando Erros

Se não é possível criar o SSLContext para comunicação com o gerenciador de políticas, há um problema com as credenciais e as chaves do usersync. O único modo de resolver esse problema é deletar a *truststore* `/usr/hdp/current/ranger-usersync/conf/mytrustore.jks`, recriá-la com o certificado do Ldaps e atualizar a configuração de senha no Ambari, *Ranger*, *Configs*, *Advanced ranger-usersync-site*

## Configurando a Segurança do GBDS

Uma vez que o Ranger, o Solr e o servidor Ldap estiverem instalados e configurados, podemos seguir para as configurações do GBDS.

### Criando o Keystore do GBDS

O keystore será usado para salvar as senhas dos usuários vinculados e chaves de assinatura para os tokens JWT gerados pela API.

Execute o script `/var/lib/griaule/gbsapi/scripts/create_keystore.py` passando o caminho para o novo banco de chaves e o caminho para criar o arquivo de senhas. O script perguntará pela senha do usuário vinculado a ser salva. Depois, o script criará o keystore com a senha do usuário vinculado e uma chave de assinatura aleatória. O keystore será protegido por uma senha gerada aleatoriamente, a qual será salva no arquivo de senha especificado. Por fim, o arquivo do keystore e de senhas terá as permissões alteradas para somente leitura.

```sh
python /var/lib/griaule/gbsapi/scripts/create_keystore.py --store_path /etc/griaule/conf/gbsapi/keystore.jks --password_file /etc/griaule/conf/gbsapi/.passwords
```

{% hint style="info" %}
O arquivo de senhas contém as senhas em texto plano. Portanto, é indispensável que isso seja mantido em uma localização segura de acesso permitido somente ao usuário *griaule*.
{% endhint %}

### Criando *trustore* para o LDAPS

Se você pretende conectar ao seu servidor LDAP usando SSL, precisa importar o certificado do servidor para uma *truststore* e configurar o GBDS para usá-lo.

Assumindo que o certificado do servidor chama-se `server_cert.pem`, execute o seguinte comando e use uma senha forte para o *truststore*:

```sh
sudo keytool -import -trustcacerts -alias ldap_server -file <certificate_file> -keystore /etc/griaule/conf/gbsapi/truststore
chown griaule:griaule /etc/griaule/conf/gbsapi/truststore
chmod 400 /etc/griaule/conf/gbsapi/truststore
```

Além de criar a *truststore*, esse comando restringirá o acesso ao usuário griaule. Depois, salve a senha da *truststore* no arquivo de senhas.

```sh
sudo -u griaule chmod u+w /etc/griaule/conf/gbsapi/.passwords && sudo -u griaule echo "truststore=<YOUR_PASSWORD>" >> /etc/griaule/conf/gbsapi/.passwords && sudo -u griaule chmod 400 /etc/griaule/conf/gbsapi/.passwords
```

### Atualizando o Arquivo de Configuração

Edite o arquivo `/etc/griaule/conf/gbscluster.properties` e modifique as seguintes propriedades:

1. **gbscluster.api.security.enabled**: defina como *true* para habilitar a segurança.
2. **gbscluster.api.security.keystore**: caminho para o keystore que você criou (`/etc/griaule/conf/gbsapi/keystore.jks`)
3. **gbscluster.api.security.truststore**: caminho para a *truststore* que você criou (`/etc/griaule/conf/gbsapi/truststore`)
4. **gbscluster.api.security.passwords**: caminho para o arquivo de senhas (`etc/griaule/conf/gbsapi/.passwords`)
5. **gbscluster.api.security.ldap.url**: URL do servidor Ldap, exemplo: `ldap://<host>:389`. Se você habilitou Ldaps, isso deve ser `ldaps://<host>:636`
6. **gbscluster.api.security.ldap.userSearchBase**: O DN do nodo da árvore que guarda os usuários que estarão habilitados para autenticação no GBDS. No seu guia de instalação do OpenLdap, o DN deveria ser: `ou=Users,dc=oldap,dc=pd,dc=griaule`

   > **É NECESSÁRIO QUE SEJA O MESMO DN CONFIGURADO NO RANGER**
7. **gbscluster.api.security.ldap.userSearchAttribute**: Atributo da entidade Usuário que contém o `userName`, que será usado durante a autenticação.

   > **É NECESSÁRIO QUE SEJA O MESMO CONFIGURADO NO RANGER**
8. **gbscluster.api.security.ldap.userGroupMembershipAttribute**: Atributo da entidade Usuário que contém o DN dos grupos que pertence. Usualmente memberOf.

   > **É NECESSÁRIO QUE SEJA O MESMO CONFIGURADO NO RANGER**
9. **gbscluster.api.security.ldap.bindUserDN**: DN do usuário vinculado. Use o mesmo configurado para o Ranger.
10. **gbscluster.api.security.token.ttlInMilliseconds**: Tempo de vida, em milissegundos, para o token JWT gerado pela API. Os valores válidos são entre 30 minutos e 3 horas. Recomendamos 1 hora.

## Instalando o Serviço de Autorização do Ranger

Para instalar e executar o serviço de autorização do Ranger, é necessário ter criado um usuário GBDS e um usuário ADMIN.

Para criar o usuário administrador, abra o arquivo `administrator_group.ldif` na pasta `/etc/openldap` e adicione o seguinte ao arquivo:

```default
dn: cn=administrator,ou=Groups,dc=oldap,dc=pd,dc=griaule
objectclass: groupofnames
cn: administrator
description: IT Security Group
# Add the group members all of which are assumed to exist under people
member: cn=gbds_bind,ou=Users,dc=oldap,dc=pd,dc=griaule
```

Em seguida, no arquivo `gbds_user.ldif`, crie o usuário GBDS.

```default
dn: cn=gbds_user,ou=Groups,dc=oldap,dc=pd,dc=griaule
objectclass: groupofnames
cn: gbds_user
description: IT Security Group
# Add the group members all of which are assumed to exist under people
member: cn=gbds_bind,ou=Users,dc=oldap,dc=pd,dc=griaule
```

Aplique as alterações reiniciando o Ranger por meio da GUI do Ambar.

```sh
sudo ldapadd -D "cn=ldapadm,dc=oldap,dc=pd,dc=griaule" -W -H ldapi:/// -f /etc/openldap/administrator_group.ldif
sudo ldapadd -D "cn=ldapadm,dc=oldap,dc=pd,dc=griaule" -W -H ldapi:/// -f /etc/openldap/gbds_user.ldif
```

{% hint style="info" %}
Se o TLS estiver ativo, lembre-se de alterar `ldapi:///` por `ldaps:///`.
{% endhint %}

Quando as alterações forem aplicadas, execute a Política de autorização do Ranger.

```sh
java -jar /root/ranger-authorization-service-installer-1.0-SNAPSHOT-jar-with-dependencies.jar -admin_password 'Griaule.123' -admin_username admin -ranger_url http://127.0.0.1:6080
```

Para finalizar o processo, atualize os Arquivos XML do Ranger. Vá para `/etc/griaule/conf/gbsapi/` e no arquivo `ranger-gbds-audit.xml`, modifique de acordo:

```xml
<name>xasecure.audit.jpa.javax.persistence.jdbc.url</name>
<value>jdbc:mysql://127.0.0.1:3306/ranger_audit</value>

<name>xasecure.audit.kafka.broker_list</name>
<value>localhost:9092</value>

<name>xasecure.audit.solr.solr_url</name>
<value>http://localhost:6083/solr/ranger_audits</value>

<name>xasecure.audit.destination.solr.urls</name>
<value>http://localhost:8886/solr/ranger_audits</value>
```

Faça o mesmo para `ranger-gbds-security.xml`

```xml
<name>ranger.plugin.gbds.policy.rest.url</name>
<value>http://localhost:6080</value>
```

## Configurando o PHP LDAP Admin

PHP LDAP Admin é uma ferramenta para gerenciar OPENLDAP via GUI, é uma alternativa ao uso de CLI. O usuário pode adicionar/modificar/excluir usuários, grupos, funções, etc. via GUI. Observe que isso não é necessário para que o LDAP funcione.

Primeiro, installe as dependências do PHPLDAPAdmin.

Em `/etc/httpd/conf.d`, atualize o arquivo `phpldapadmin.conf` com

```properties
# Require local
Require all granted
```

E também atualize o arquivo `config.php` na pasta `/etc/phpldapadmin` com

```php
servers->setValue('server','name','Local LDAP Server');
servers->setValue('server','host','127.0.0.1');
servers->setValue('server','port',389);
servers->setValue('server','base',array('dc=oldap,dc=pd,dc=griaule'));
servers->setValue('login','attr','dn');
```

Execute o seguinte comando para iniciar e habilitar os serviços HTTPD

```sh
$ systemctl enable httpd.service && systemctl start httpd.service && systemctl status httpd.service
```

Após habilitar o HTTPD, é necessário especificar as possíveis atualizações. Se o firewall estiver ativado, execute

```sh
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload
```

E se o SELinux estiver habilitado, execute

```sh
setsebool -P httpd_can_connect_ldap on
```

Valide o PHP LDAP Admin GUI abrindo a GUI em <http://localhost/ldapadmin> com o usuário (DN, por exemplo, cn=ldapadm,dc=oldap,dc=pd,dc=griaule) e senha. Em seguida, clique nos botões suspensos e confirme se todos os usuários e grupos estão disponíveis.


# APISIX (Barramento Griaule)

## Introdução

O Apache APISIX fornece recursos avançados de gerenciamento de tráfego, como balanceamento de carga, upstream dinâmico, interrupção de circuito, autenticação, observabilidade, etc.

## Instalação Manual

### Instalação

{% hint style="warning" %}
Este método de instalação só é necessário se for preciso instalar o APISIX manualmente e para utilizar os comandos da API por meio da linha de comando. Caso contrário, utilize a instalação via Docker, detalhada na seção [APISIX Dashboard](#apisix-dashboard-recomendado).
{% endhint %}

#### Instalando *etcd*

O APISIX usa *etcd* para salvar e sincronizar a configuração. Antes de instalar o APISIX, você precisa instalar o *etcd* em sua máquina. Ele será instalado automaticamente se você escolher o método de instalação Docker ou Helm durante a instalação do APISIX.

Se você escolher um método diferente ou precisar instalá-lo manualmente, siga as etapas mostradas abaixo:

```tsx
<Tabs groupId="os" defaultValue="linux" values={[
{
	label: 'Linux',
	value: 'linux'
},
{
	label: 'macOS',
	value: 'mac'
}]}>
```

```sh
ETCD_VERSION='3.5.4'
wget https://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
tar -xvf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz && \
cd etcd-v${ETCD_VERSION}-linux-amd64 && \
sudo cp -a etcd etcdctl /usr/bin/
nohup etcd >/tmp/etcd.log 2>&1 &
```

#### Instalação via pacote RPM

Se o *OpenResty* não estiver instalado, você pode executar o comando abaixo para instalar os repositórios *OpenResty* e APISIX:

```sh
sudo yum install -y https://repos.apiseven.com/packages/centos/apache-apisix-repo-1.0-1.noarch.rpm
```

Com o *OpenResty* instalado, o comando abaixo instalará os repositórios APISIX:

```sh
sudo yum-config-manager --add-repo https://repos.apiseven.com/packages/centos/apache-apisix.repo
```

Então, para instalar o *APISIX*, use:

```sh
sudo yum install apisix
```

{% hint style="success" %}
Você também pode instalar uma versão específica da API APISIX, especificando-a explicitamente:

```sh
sudo yum install apisix-2.13.1
```

{% endhint %}

#### Instalação via pacote RPM offline

Primeiro, faça o download do pacote offline RPM para um repositório APISIX:

```sh
sudo mkdir -p apisix
sudo yum install -y https://repos.apiseven.com/packages/centos/apache-apisix-repo-1.0-1.noarch.rpm
sudo yum clean all && yum makecache
sudo yum install -y --downloadonly --downloaddir=./apisix apisix
```

Em seguida, copie o repositório APISIX ao host desejado e execute:

```sh
sudo yum install ./apisix/*.rpm
```

### Gerenciando o servidor APISIX

Uma vez que o APISIX tenha sido instalado, você pode iniciar o arquivo de configuração e o *etcd* executando o comando:

```sh
apisix init
```

Para iniciar o servidor do APISIX, use:

```sh
apisix start
```

{% hint style="success" %}
O comando `apisix help` retorna uma lista de operações disponíveis e pode ser útil em várias ocasiões.
{% endhint %}

Se você deseja compilar o APISIX a partir do código-fonte, consulte [Building APISIX from source](https://github.com/apache/apisix/blob/master/docs/en/latest/building-apisix.md).

### Configurando o APISIX

É possível configurar o APISIX de duas maneiras:

1. Alterando diretamente o arquivo de configuração `conf/config.yaml`.
2. Utilizando o comando `--config` ou a flag `-c` para especificar o caminho de seu arquivo de configuração enquanto o APISIX está sendo iniciado:

   ```sh
   apisix start -c <path to config file>
   ```

O APISIX usará as configurações adicionadas nesse arquivo de configuração e retornará à configuração padrão se algo não estiver configurado.

Por exemplo, para configurar a porta de escuta padrão para ser `8000` sem alterar outras configurações, seu arquivo de configuração deve ser alterado da seguinte maneira:

```yml
apisix:
  node_listen: 8000
```

Agora, se você decidir que deseja alterar o endereço *etcd* para `http://foo:2379`, você pode adicioná-lo ao seu arquivo de configuração. Isso não alterará outras configurações.

```yml
apisix:
  node_listen: 8000

etcd:
  host: "http://foo:2379"
```

{% hint style="warning" %}
A configuração só deve ser alterada pelos métodos mencionados acima. A configuração padrão do APISIX pode ser encontrada no arquivo `conf/config-default.yaml` e não deve ser modificada. A configuração padrão configuração está vinculada ao código fonte.
{% endhint %}

{% hint style="warning" %}
O arquivo `conf/nginx.conf` é gerado automaticamente e não deve ser modificado.
{% endhint %}

#### Atualizando a chave de Admin da API

É recomendado alterar a chave de Admin da API para garantir a segurança da aplicação. Para alterar essa configuração, basta modificar o arquivo de configuração como mostrado abaixo:

```sh
apisix:
  admin_key
    -
      name: "admin"
      key: newsupersecurekey
      role: admin
```

Com isso, para acessar a API Admin, utilize a nova chave configurada:

```sh
curl http://127.0.0.1:9080/apisix/admin/routes?api_key=newsupersecurekey -i
```

### Adicionando o arquivo de unidade do systemd APISIX

Se você instalou o APISIX via RPM, o arquivo da unidade APISIX já estará configurado e você poderá iniciar o APISIX por:

```sh
systemctl start apisix
systemctl stop apisix
```

Se você instalou o APISIX por meio de outros métodos, você pode criar `/usr/lib/systemd/system/apisix.service` e adicionar o template de configuração.

A página [Getting Started](https://github.com/apache/apisix) do APISIX oferece um guia com instruções para utilizar corretamente a API.

### Pacotes instalados

```
+----------------------------------------------------------------+
| Package          Arch     Version           Repository    Size |
+================================================================+
| Installing:                                                    |
| apisix           x86_64   2.14.1-0.el7      release      2.2 M |
+----------------------------------------------------------------+
| Installing for dependencies:                                   |
| apisix-base      x86_64   1.21.4.1.0-0.el7  release      34 M  |
+----------------------------------------------------------------+
| Updating for dependencies:                                     |
| cyrus-sasl-lib   x86_64   2.1.26-24.el7_9   updates      156 k |
| openldap         x86_64   2.4.44-25.el7_9   updates      356 k |
+----------------------------------------------------------------+

+-------------------------------------------+
| Transaction Summary                       |
+===========================================+
| Install 1 Package (+7 Dependent packages) |
| Upgrade (2 Dependent packages)            |
+-------------------------------------------+
| Total download size: 40 M                 |
+-------------------------------------------+
```

## APISIX Dashboard (Recomendado)

### Docker

**É recomendado usar o Docker para rodar o Dashboard**, usando os comandos:

```sh
docker pull apache/apisix-dashboard
docker run -d --name dashboard \
           -p 9000:9000        \
           -v <CONFIG_FILE>:/usr/local/apisix-dashboard/conf/conf.yaml \
            apache/apisix-dashboard
```

{% hint style="info" %}
Substitua `<CONFIG_FILE>` com o caminho de seu arquivo de configuração.
{% endhint %}

### RPM

É necessário somente no caso de **NÃO** utilização de Docker.

{% hint style="info" %}
Somente CentOS 7 é suportado atualmente.
{% endhint %}

#### Instalação

Instale o pacote RPM com o seguinte comando:

```sh
sudo yum install -y https://github.com/apache/apisix-dashboard/releases/download/v2.13/apisix-dashboard-2.13-0.el7.x86_64.rpm
```

#### Execução

Execute o Dashboard no shell:

```sh
sudo manager-api -p /usr/local/apisix/dashboard/
```

ou como um serviço:

```sh
systemctl start apisix-dashboard
```

Se a configuração padrão foi utilizada, visite `http://127.0.0.1:9000` para usar o Dashboard.

{% hint style="info" %}
O login e senha padrões são `admin`.
{% endhint %}

## Acesso

Por padrão, a API do APISIX será executada na porta `9080` da máquina.

Por exemplo, na máquina `172.16.0.66`:

`http://172.16.0.66:9080/apisix/admin/routes?api_key=newsupersecurekey`

Em resumo, os serviços executados pelo APISIX podem ser acessados nas seguintes portas padrão: `9080`, `9082`, `2379`, `9000`, `3000`, `9090` e `9081`.

![apisix standard ports](/files/nMvyJynIbdHUTo6VIX0T)

O APISIX Dashboard, que permite configurar o barramento através de uma interface gráfica, é executado na porta `9000`, por exemplo.

## Configurando uma API

As APIs das aplicações web implementam uma variedade de endpoints responsáveis por processar e retornar informações referentes aos bancos de dados das aplicações, do GBDS e das operações realizadas. A maioria dos endpoints são específicos à aplicação, mas alguns deles são comuns entre elas e são implementadas no que é chamado de Common Server.

Todas as chamadas de API usadas pela aplicação devem ser configuradas no APISIX. Existem 2 alternativas para configurar uma API, expostas a seguir.

### Configurando a API pelo APISIX Dashboard (Recomendado)

![apisix dashboard home screen](/files/ZlSiLeT5QvaCqQQYcoZ7)

A configuração da API através do APISIX Dashboard é recomendada pois a interface gráfica do Dashboard permite a importação da API através de arquivos OpenAPI nos formatos `.json` ou `.yaml`. Para possibilitar a importação da API através do Dashboard, é necessário obter o arquivo OpenAPI da aplicação que está sendo configurada.

#### Gerando o arquivo OpenAPI a partir do servidor

Os servidores das aplicações web implementam o Swagger para documentação de seus endpoints. Para gerar o arquivo de documentação da API, basta acessar o servidor e fazer um `GET` na rota `/service/swagger.yaml`.

No `ETR`, por exemplo, basta acessar:

`http://172.16.0.70:8089/gbs-etr-server/service/swagger.yaml`

Ao acessar esse endpoint pelo navegador, por exemplo, será feito o download do arquivo `.yaml`.

Para ser importado no APISIX, esse arquivo deve ser convertido para o formato OpenAPI 3.0. Para tanto, a maneira mais simples é acessar o [Swagger Editor](https://editor.swagger.io) e seguir as seguintes etapas:

1. Importar o arquivo gerado no site clicando em File > Import file.
2. Converter para OpenAPI 3.0 clicando em Edit > Convert to OpenAPI 3.0.
3. Salvar o arquivo no formato OpenAPI (como `.yaml` ou `.json`) clicando em File > Save as YAML ou Convert and save as JSON.

{% hint style="info" %}
Em praticamente todas as aplicações existem endpoints que acabam não sendo utilizados/chamados pelo frontend e *poluem* o arquivo. Recomenda-se então que esses endpoints sejam removidos do arquivo, juntamente com seus respectivos *schemas* e componentes.
{% endhint %}

#### Importando a API pelo Dashboard

Com o APISIX sendo executado, acesse `http://localhost:9000` e você será redirecionado para o Dashboard. Caso o login seja necessário, por padrão o acesso é feito utilizando do login e senha `admin/admin`.

Antes de importar as rotas da API, é recomendado criar um Upstream - que é basicamente o Servidor Backend da API que está sendo configurada. Essa etapa é feita na aba Upstream do Dashboard. Para tanto, é necessário definir um nome para o server, o IP e a porta no qual está rodando.

A seguir, é mostrado um exemplo da configuração do Upstream do `ETR` que está rodando na máquina `172.16.0.66`:

![apisix upstream configuration example](/files/gFFRlqmgapv3B5f2E70I)

Uma vez configurado o Upstream, é possível realizar a importação das rotas da API através do arquivo OpenAPI 3.0 gerado:

1. Acesse a aba Route.
2. Clique no menu dropdown Advanced?.
3. Clique em Import OpenAPI.
4. Selecione o arquivo e clique no botão Confirmar.

Se estiver tudo correto, as rotas da API serão importadas no dashboard e ficarão listadas como neste exemplo:

![apisix dashboard route list](/files/OxiXSCUSRPf6106C74PL)

{% hint style="success" %}
Em caso de problemas na importação do arquivo OpenAPI, consulte o [FAQ](#faq).
{% endhint %}

#### Configurando as rotas importadas

Uma vez que as rotas tenham sido importadas pelo Dashboard, ainda é necessário fazer alguns ajustes para que os endpoints possam ser acessados pelas aplicações.

{% stepper %}
{% step %}

#### Mapeando as rotas

O primeiro ponto a ser ajustado é o `path` da rota, ou seja, o endereço que vai ser acessado para que o APISIX identifique corretamente a chamada do endpoint.

{% hint style="info" %}
Por padrão, ao gerar a documentação do Swagger de uma aplicação, as rotas mapeadas serão relativas ao default do server.
{% endhint %}

No `ETR`, por exemplo, são gerados os endpoints `/etr/list` ou `/commons/version`. Porém, para acessar esse endpoint através da aplicação web ou diretamente via linha de comando, é necessário acessar o caminho `/gbs-etr-server/service/<caminho_do_endpoint>`.

Sendo assim, é necessário alterar o atributo `path` das rotas importadas e adicionar a rota padrão da API que está sendo configurada, incluindo, por exemplo, o caminho `gbs-API-server/service` (padrão das aplicações web) antes das rotas mapeadas.

![apisix map imported routes](/files/bMje7u9gpHRfaQyeDELj)
{% endstep %}

{% step %}

#### Adicionando o método HTTP OPTIONS

Ao importar as rotas, elas serão mapeadas somente com o método HTTP padrão que executam. Porém, a maioria das chamadas feitas através das aplicações web, por padrão do React, também executam um método OPTIONS - utilizado para que um cliente possa descobrir quais as opções de requisição permitidas para um determinado recurso - e, caso este não seja mapeado no APISIX, pode ocorrer um erro de CORS quando a aplicação executar a chamada.

Portanto, é importante que seja adicionado o método OPTIONS nas rotas para evitar problemas de comunicação da API com o APISIX.

{% hint style="info" %}
Esta etapa é necessária somente para acessar o barramento através de outras aplicações (Frontend/React, por exemplo) - não necessária para acesso direto - e visa resolver problemas de CORS (Cross-Origin Resource Sharing), porém não é a única alternativa possível.
{% endhint %}

![apisix add http options](/files/7ym5eNd1wsjjszreIryX)
{% endstep %}

{% step %}

#### Definindo o Upstream (Backend API Server)

Além de configurar a rota e os métodos esperados, é necessário definir o endereço do servidor ao qual as chamadas serão redirecionadas pelo APISIX. É nessa etapa que utiliza-se o Upstream definido anteriormente.

Na segunda aba de configuração da rota, é possível definir o Backend API Server e, uma vez que o Upstream já tenha sido previamente configurado, é possível selecioná-lo através do menu dropdown no início da página.

Basta selecionar a opção correta que as chamadas já estarão corretamente configuradas, como mostra a imagem a seguir:

![apisix route configuration](/files/lVT57Nu8UWy39qZQcwuI)
{% endstep %}

{% step %}

#### Configurando Plugins

Em seguida, é possível configurar os plugins do APISIX que serão utilizados pela rota.

Por padrão, toda rota importada já possui o plugin `request-validation` ativado, que faz uma validação dos parâmetros que estão sendo enviados junto com a requisição, antes de encaminhar para o servidor. **Recomenda-se remover esse plugin** para todas as rotas, uma vez que a validação já é feita pelos servidores.

Existem vários tipos de plugins que podem ser configurados para as rotas, visando controlar/gerenciar Autenticação, Segurança, Controle de Tráfego, entre outros aspectos da rota, como pode ser visto na tela de configuração:

![apisix plugins configuration](/files/irr6JQo71rAhbHIAztZq)

Para uso das aplicações da Griaule, alguns plugins interessantes são: `limit-conn`, `limit-count`, `limit-req`, `traffic-split`, entre outros.

Acesse a [página de plugins](https://apisix.apache.org/plugins/) para mais detalhes sobre cada um dos plugins disponíveis pelo APISIX.

{% hint style="success" %}
O APISIX oferece a possibilidade de desenvolvimento plugins próprios. [Clique aqui](https://apisix.apache.org/docs/apisix/plugin-develop/) para mais informações.
{% endhint %}

{% hint style="info" %}
Na aba Plugin do Dashboard é possível habilitar uma série de plugins para a API que está sendo configurada.
{% endhint %}

{% hint style="info" %}
Os plugins habilitados na aba Plugin do Dashboard são habilitados globalmente para a API que está sendo configurada. Nos testes, os plugin globais só funcionaram quando nenhuma das rotas possuía um plugin associado a elas.
{% endhint %}
{% endstep %}
{% endstepper %}

#### Services e Consumers (Não utilizados nos testes)

Através do Dashboard, também é possível definir Services e Consumers, que visam facilitar a configuração de plugins para determinadas rotas.

Ao invés de configurar os plugins individualmente para cada rota, é possível configurar uma série de plugins em um Consumer, por exemplo. Em seguida, uma vez que o APISIX identifica aquele Consumer específico (**por meio de um plugin de autenticação**), os plugins configurados para aquele Consumer passam a funcionar na rota requisitada.

Outra alternativa é definir um Upstream + Plugins através de um Service.

Para isso, utiliza-se as abas Service e Consumer do Dashboard.

{% hint style="success" %}
Para mais detalhes, acesse a [documentação do Services](https://apisix.apache.org/docs/apisix/terminology/service/) e a [documentação de Consumers](https://apisix.apache.org/docs/apisix/terminology/consumer/).
{% endhint %}

Seguindo esses passos, é possível configurar uma API para o APISIX.

Em caso de eventuais dúvidas ou problemas com o Dashboard, é verifique o [Guia de Usuário na Documentação oficial do APISIX](https://apisix.apache.org/docs/dashboard/USER_GUIDE/) ou os canais de ajuda especificados na documentação.

{% hint style="info" %}
Após configurar as rotas, é necessário publicá-las através do dashboard para que elas possam ser corretamente acessadas.
{% endhint %}

### Configurando a API por linha de comando/configuração

O APISIX permite a configuração da aplicação e suas rotas através da linha de comando e arquivo de configuração, como detalhado [aqui](https://apisix.apache.org/docs/apisix/getting-started/). Para tanto, é necessário especificar o servidor (Upstream) e cada uma de suas rota, e seguir o passo a passo a seguir:

#### Acesso à APISIX Admin

```sh
curl "http://127.0.0.1:9080/apisix/admin/services/" -H 'X-API-KEY:edd1c9f034335f136f87ad84b625c8f1'
```

Resposta esperada (indica que o APISIX está sendo executado corretamente):

```json
{
	"count": 0,
	"action": "get",
	"node": {
		"key": "/apisix/services",
		"nodes": [],
		"Dir": true
	}
}
```

#### Criando uma Rota

```sh
curl "http://127.0.0.1:9080/apisix/admin/routes/1"      \
     -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1"   \
     -X PUT                                             \
     -d '{
            "methods": ["GET"],
            "host": "example.com",
            "uri": "/anything/*",
            "upstream": {
                "type": "roundrobin",
                "nodes": {
                    "httpbin.org:80": 1
                }
            }
        }'
```

Essa configuração indica que todas as solicitações de entrada correspondentes ao serviço Upstream (`httpbin.org:80`) serão encaminhadas se atenderem a estes critérios especificados:

* O método HTTP da solicitação é `GET`.
* O cabeçalho da solicitação contém o campo host e seu valor é `example.com`.
* O caminho da solicitação corresponde a `/anything/*`, em que `*` significa qualquer subcaminho. Por exemplo, `/anything/foo?arg=10`.

Com a Rota criada, pode-se acessar o serviço Upstream a partir do endereço exposto pelo APISIX:

```sh
curl -i -X GET "http://127.0.0.1:9080/anything/foo?arg=10" -H "Host: example.com"
```

Essa solicitação será encaminhada para `http://httpbin.org:80/anything/foo?arg=10` pelo APISIX.

{% hint style="success" %}
Em vez de configurar o Upstream diretamente para a Rota, você pode criar um objeto Upstream e usá-lo na Rota.
{% endhint %}

#### Criando um Upstream

```sh
curl "http://127.0.0.1:9080/apisix/admin/upstreams/1"   \
     -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1"   \
     -X PUT                                             \
     -d '{
            "type": "roundrobin",
            "nodes": {
              "httpbin.org:80": 1
            }
        }'
```

{% hint style="info" %}
Esse é o mesmo que o serviço Upstream que foi configurado diretamente na Rota na seção anterior.
{% endhint %}

#### Vincular este Upstream à Rota

Pode-se usar o `upstream_id` como `1`:

```sh
curl "http://127.0.0.1:9080/apisix/admin/routes/1"      \
     -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1"   \
     -X PUT                                             \
     -d '{
            "methods": ["GET"],
            "host": "example.com",
            "uri": "/anything/*",
            "upstream_id": "1"
        }'
```

Com a Rota criada, pode-se acessar o serviço Upstream a partir do endereço exposto pelo APISIX:

```sh
curl -i -X GET "http://127.0.0.1:9080/anything/foo?arg=10" -H "Host: example.com"
```

Essa solicitação será encaminhada para `http://httpbin.org:80/anything/foo?arg=10` pelo APISIX.

## Importando uma API exportada pelo APISIX

Visando facilitar a configuração das APIs, juntamente com as releases dos produtos, é disponibilizado um arquivo `.yaml` gerado através do APISIX com as rotas utilizadas por cada uma das aplicações web.

Com isso, é possível importar as rotas diretamente através do Dashboard, agilizando seu processo de configuração no barramento.

Porém, a funcionalidade de importação/exportação do APISIX apresenta algumas limitações e, por isso, são necessários passos adicionais após a importação para que o barramento funcione como esperado.

{% hint style="info" %}
Para facilitar a exportação dos arquivos, o plugin de validação de parâmetros foi removido das rotas antes de sua exportação. A validação é feita pelos servidores.
{% endhint %}

### Criar um Upstream

Ao exportar as rotas da aplicação pelo APISIX, o Upstream de cada rota (Backend API Server) é exportado como se tivesse sido especificado para cada uma das rotas. Esse comportamento acaba dificultando a configuração da API caso haja mudanças no endereço do servidor da aplicação, mudanças de máquina, etc.

Por isso, recomenda-se criar um Upstream referente ao servidor da aplicação que está sendo configurada no barramento, para centralizar o servidor e facilitar possíveis alterações.

{% hint style="info" %}
Ao criar o Upstream, atente-se aos timeouts especificados para o servidor (é possível configurar timeout de conexão, envio e recebimento). Em servidores lentos, caso o request demore mais que o timeout especificado para retornar, um *Erro 504* será retornado pelo próprio APISIX.
{% endhint %}

{% hint style="info" %}
Por padrão, as rotas exportadas estarão apontando para o seu respectivo servidor que está rodando no IP `172.16.0.66` (máquina de desenvolvimento).
{% endhint %}

### Configurando as Rotas

Como citado anteriormente, a funcionalidade de exportar as configurações de uma API através do APISIX apresenta algumas falhas e, por isso, para configurar completamente a API no barramento, é necessário fazer algumas alterações em todas as rotas que foram importadas a partir do arquivo .yaml gerado.

Apesar de estarem especificados no arquivo gerado pelo APISIX, as chamadas com o tipo de requisição HTTP `OPTIONS` não são convertidas para as rotas importadas no APISIX.

Por esse motivo, para acesso às rotas por parte das aplicações web, é necessário modificar rota a rota e adicionar o método OPTIONS como um dos métodos possíveis, a fim de que as requisições funcionem da maneira esperada, evitando erros de CORS.

{% hint style="info" %}
A adição do método OPTIONS é a única modificação necessária na aba Define API Request.
{% endhint %}

Em seguida, na aba Define API Backend Server, é necessário alterar o servidor (utilizando o menu dropdown) e selecionar o Upstream relacionado ao servidor da aplicação que está sendo configurada - que deve ter sido criado previamente.

Na aba Plugins, só devem ser adicionados plugins que sejam específicos à rota que está sendo configurada. Caso contrário, é possível ativar os plugins na aba Plugin do Dashboard. Os plugins habilitados na aba Plugin são habilitados globalmente e funcionarão para todas as rotas configuradas no APISIX.

Sendo assim, para cada uma das rotas importadas é necessário:

1. Adicionar método OPTIONS
2. Selecionar o Upstream
3. Configurar plugin (somente se for específico à rota que está sendo configurada)
4. Publicar

Seguindo esses passos, é possível importar a API exportada através do APISIX e utilizar as funcionalidade do barramento para acessar a aplicação.

### Acessando as Rotas

Após configurar todas as rotas da aplicação e publicá-las, para acessá-las através da aplicação web, é necessário configurar a aplicação para realizar as chamadas pelo barramento.

Se estiver rodando o APISIX em sua máquina, basta configurar para a rota:

`http://127.0.0.1:9080/<nome_da_aplicação>/service`

Ou então para a porta `9080` da máquina que estiver rodando o APISIX.

## FAQ

Para mais especificações, passo a passo ou dúvidas, é possível consultar a [Documentação Oficial](https://apisix.apache.org/docs/apisix/getting-started/) ou acessar os canais de suporte do APISIX.

### Erro ao importar arquivo OpenAPI

#### APISIX acusa um erro de formatação no arquivo

Ao tentar importar o arquivo OpenAPI através do APISIX Dashboard, se o arquivo gerado não estiver corretamente formatado, um toast de erro será mostrado na tela. Para validar se o arquivo é um OpenAPI válido, utilize o [Swagger Editor](https://editor.swagger.io) (que acusa o erro ou parâmetros não utilizados) ou outra ferramenta para validação.

#### APISIX Dashboard trava e desloga o usuário após importar arquivo

Durante os testes da importação através do Dashboard, foram constatadas 2 situações que levaram a esse erro. Ambas estavam relacionadas à um problema não identificado em schemas declarados no arquivo `swagger.yaml`.

Um exemplo prático, constatado na importação do ETR, foi identificado no endpoint `/commons/version` no schema `SystemConfiguration` declarado como parâmetro do bodyRequest do endpoint:

```yml
# ...
post:
  summary: Set system configuration
  operationId: set
  parameters:
  - name: session-guid
    in: header
    schema:
      type: string
  requestBody:
    content:
      '*/*':
        schema:
          $ref: '#/components/schemas/SystemConfiguration'
    required: false
# ...
```

Na ocasião, esse schema foi removido do arquivo OpenAPI e a importação ocorreu sem problemas. Após investigação, constatou-se que o schema exportado estava desatualizado com relação ao que o servidor esperava mas, mesmo após o conserto, o erro persistiu.

Nesse caso, a alternativa é remover o schema problemático e realizar a importação novamente.

Ao fazer isso, o schema não será mapeado para o plugin `request-validation` e uma requisição com parâmetro errado irá passar pelo APISIX. Porém, isto acaba não sendo um problema pois um parâmetro errado irá causar erro no próprio servidor, que será retornado ao usuário, mitigando a falta do schema no arquivo importado.

No caso da configuração do `BEST`, por exemplo, a alternativa adotada foi **substituir todos os atributos** `requestBody` **por um objeto vazio (**`{}`**) e adicionar algum parâmetro para validação no** `header` - isso só é válido caso a validação de parâmetros seja desativada para as rotas. Caso contrário, causará erro Bad request por parte do APISIX quando receber a requisição.

Outra alternativa para tentar solucionar o problema é verificar os canais de dúvidas do APISIX (Slack, GitHub e blogs) em busca de soluções definitivas deste problema. **Apesar de constatar que esse problema está relacionado aos** `schemas` **de dados declarados em nossos servidores, não foi encontrada uma solução definitiva**.

### Plugin configurado na rota não está funcionando

Por padrão, ao adicionar um plugin à Rota ou ao Consumer, o plugin é marcado como **desabilitado**. Por isso, atente-se à flag `Habilitado` e garanta que ela esteja ativa, para que o plugin funcione corretamente na rota.

![apisix plugin editor screen](/files/dJ2U1UMGqbmVANvJy2en)

### Não é possível acessar o barramento do APISIX após executá-lo

Durante os testes do barramento usando o APISIX, constatou-se o comportamento das rotas não serem corretamente reconhecidas/redirecionadas pelo APISIX, mesmo com ele sendo executado corretamente via Docker.

Após investigação do problema, constatou-se que havia uma aplicação rodando na porta `9080` da máquina, que é a porta utilizada pela API do APISIX. Isso faz com que a API do APISIX fique inacessível e as rotas não sejam encontradas ao fazer uma requisição. A solução é encerrar o processo que esteja rodando na porta alvo, ou então alterar a porta padrão do APISIX através do arquivo de configuração.


# Serviço de Notificação por Email

## Introdução

O Serviço de Notificação por Email do GBDS fornece um recurso para auditoria. Através deste serviço, é possível configurar uma lista de email que será avisada sempre que for solicitada uma pesquisa facial 1:N.

É possível utilizar este recurso com qualquer servidor SMTP, configurando o serviço conforme descrito na seção [Configurando o Notificador de Email](#configurando-o-notificador-de-email). Quando nenhum servidor SMTP estiver disponível, o usuário deverá criá-lo e instalar as dependências do serviço.

## Configurando o Notificador de Email

### Propriedades

O arquivo de configuração do Serviço de Notificação por Email está localizado em `etc/griaule/conf/email-notifier/config.properties` e contém os seguintes parâmetros:

```properties
# GBS Email Notifier

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://<mysql/mariadb ip>:<port>/enotifier?useSSL=false
jdbc.username=<username>
jdbc.password=<encrypted password>
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.showSql=false

locale=en_US

gbds.url=http://<gbds api host>:<port>
gbds.user=<gbds user>
gbds.key=<gbds password>
gbds.logLevel=INFO
gbds.timeout=300 # seconds
```

{% hint style="warning" %}
Os valores dos parâmetros entre `<>` devem ser editador de acordo com o ambiente.
{% endhint %}

### Banco de Dados

A tabela `enotifier.settings` do banco de dados contém o modelo e o assunto do email e todas as informações para conexão SMTP:

<table><thead><tr><th width="300">Key</th><th>Description</th></tr></thead><tbody><tr><td>mail.smtp.auth</td><td>autorização do SMTP: NONE, TLS, SSL</td></tr><tr><td>mail.smtp.from.email</td><td>email do emissor do SMTP</td></tr><tr><td>mail.smtp.from.name</td><td>nome do emissor do SMTP</td></tr><tr><td>mail.smtp.host</td><td>host do SMTP</td></tr><tr><td>mail.smtp.password</td><td>senha do SMTP para TLS e SSL</td></tr><tr><td>mail.smtp.port</td><td>porta do SMTP: NONE=25; TLS=587; SSL=465</td></tr><tr><td>mail.identify.request.single.subject</td><td>Assunto do email; o notificador irá concatenar o id hash para separação de threads.</td></tr><tr><td>mail.identify.request.single.template</td><td>Modelo do corpo do email: Campos:<br><br>&#x3C;username>: nome do usuário<br>&#x3C;timestamp:date/time pattern>: se nenhum padrão for fornecido, será usado MM/dd/YYYY HH:mm:ss<br>&#x3C;biographics>: itera sobre os biográficos; dentro da iteração: &#x3C;biographic:key> e &#x3C;biographic:value> fornecem chave/valor<br><br>imagens serão enviadas como anexo.</td></tr><tr><td>mail.identify.result.subject</td><td>Assunto da notificação por email do resultado da pesquisa</td></tr><tr><td>mail.identify.result.template</td><td>Modelo da notificação por email do resultado da pesquisa</td></tr><tr><td>mail.identify.request.multiple</td><td>Ativa/desativa o envio de vários emails com notificações de solicitação de pesquisa de identificação de rosto</td></tr><tr><td>mail.identify.request.multiple.period</td><td>Período para consolidar notificações por email</td></tr><tr><td>mail.identify.request.multiple.subject</td><td>Assunto para email notificações múltiplas</td></tr><tr><td>mail.identify.request.multiple.template</td><td>Modelo de corpo do email de multiplas notificações. Os emails empacotam um arquivo zip com todas as imagens listadas.</td></tr></tbody></table>

{% hint style="warning" %}
O arquivo zip da lista de imagens anexadas pode conter no máximo 24 MB. Acima disso, a listagem é dividida em mais de um email.
{% endhint %}

Para criar a tabela, execute o arquivo de dump do banco de dados necessário.

{% hint style="info" %}
Se nenhum arquivo de dump foi fornecido, contate com a Equipe de Suporte da Griaule.
{% endhint %}

{% hint style="warning" %}
Quaisquer alterações aplicadas a esta tabela serão refletidas no próximo email enviado.
{% endhint %}

## Operação

Os binários serão colocados em `/var/lib/griaule/email-notifier/gbs-email-notifier-xxx.jar` e `/var/lib/griaule/email-notifier/lib`.

### Iniciando e parando o Notificador de Email

Para iniciar o Serviço de Notificação de Email, execute:

```sh
/var/lib/griaule/email-notifier/scripts/start-email-notifier.sh
```

E para pará-lo:

```sh
/var/lib/griaule/email-notifier/scripts/kill-email-notifier.sh
```

### Logs

O notificador de emails usa o arquivo de configuração do log4j em `/etc/griaule/conf/email-notifier/email-notifier-log4j.xml`. Todos os logs ficarão em `/var/logs/griaule/email-notifier/`.

Shutdown log will be generated on `/var/log/griaule/email-notifier/email-notifier.log`

### Ações

O serviço de email pode conter uma lista de interesses por meio do GBDS para algumas pessoas. Algumas ações podem ser feitas quando uma pesquisa é necessária e essas pessoas aparecem nos resultados da pesquisa. As ações são:

* Ocultar pessoa do resultado da pesquisa;
* Ocultar informações da pessoa no resultado da pesquisa se o usuário autorizado não tiver acesso para vê-la;
* Notificar por email o resultado da pesquisa com a pessoa.

Para configurar a ação, é necessário acessar as tabelas `gbds.people_transparency` e `gbds.people_transparency_group` para informar se alguma pessoa deve ser removida, ocultada ou notificada a cada busca de identificação realizada.

A tabela contém PGUID, ação e flag para habilitar a transparência dessa pessoa. Tabela de grupos retém grupos de email para notificação.

Com o PGUI inserido, as ações devem ser: REMOVE, CLASSIFIED, ou NOTIFY:

* Ao remover (REMOVE), o endpoint get result não retornará a pessoa;
* Ao definir como informação oculta (CLASSIFIED), o resultado da pesquisa retornará a pessoa, mas os campos pguid/tguid serão com texto *classified*, todas os seus casamentos (matches) com a pontuação, consulta e índice de referência como -1. Se o usuário autenticado tiver a permissão `transparency_show_classified_people` todos os dados pessoais serão mostrados novamente.
* Na notificação (NOTIFY), a tabela `gbds.people_transparency_group` contém grupos de email informando quais emails devem ser notificados com o resultado da pesquisa de pessoa.

{% hint style="info" %}
Na tabela `gbds.people_transparency`, um pguid pode aparecer mais de uma vez, então mais de uma ação pode ser feita para este pguid, por exemplo: remover e notificar ou classificar e notificar.
{% endhint %}

## Informações Adicionais

### Configurações da API e do Banco de Dados

Este serviço é ativado por algumas configurações em `gbdsapi.properties` ou na tabela `gbds.settings` no banco de dados. Esses são:

* gbds.transparency.search.identify.send-email.enabled

  > Ativar ou desativar este serviço
* gbds.transparency.email-notifier.log-level

  > Define o nível de log
* gbds.transparency.email-notifier.timeout

  > Define o timeout.
* gbds.transparency.email-notifier.url

  > Define a URL de notificação

Mais informações sobre essas configurações podem ser vistas no Manual de Configuração da API GBDS.

### Endpoints do GBDS para o Serviço de Notificação de Email

GBDS fornece uma API simples para armazenar e recuperar usuários/emails para enviar. A documentação completa pode ser vista na [API GBDS](https://docs.griaule.com/apis/)

* Inserir ou atualizar grupos e emails: [POST Email Notify Group](https://gitbook.griaule.com/apis/gbds-4/email#post-notify-group)

  > Esta chamada insere/atualiza grupos e emails relativos a esses grupos.
* Recuperar Grupo: [Get Email Group](https://gitbook.griaule.com/apis/gbds-4/email#get-notify-group-group)

  > Essa chamada retorna o grupo e os emails no grupo.
* Inserir ou atualizar o usuário e seus grupos: [POST Email Notify User](https://gitbook.griaule.com/apis/gbds-4/email#post-notify-user)

  > Esta chamada insere/atualiza um usuário individual e o associa a grupos.
* Recuperar usuário: [Get Email User](https://gitbook.griaule.com/apis/gbds-4/email#get-notify-user-user)

  > Essa chamada retorna o usuário e seus grupos associados.

### Endpoints de Get List do Notificador

O notificador de email tem um endpoint para listar as solicitações de email notificadas:

* GET `http://host:port/gbs-email-notifier/notify/list` (a porta usualmente é 8086)

  > Filtros de consulta:
  >
  > * status: um ou mais de: PENDING, PROCESSING, ERROR, DONE
  > * ini-date: data inicial no formato: YYYY-MM-dd-HH-mm-ss
  > * end-date: data final no formato: YYYY-MM-dd-HH-mm-ss
  > * username (usuário)
  > * email
  > * pageIndex, padrão 0, mínimo 0
  > * pageSize, padrão 20, mínimo 1, máximo 100

A resposta do exemplo é:

```json
{
    "notifications": [
        {
            "tguid": "86A2BA4A-822C-4F1F-9017-46E0144F274C",
            "timestamp": "2021-08-24-10-52-07",
            "status": "DONE",
            "username": "rgiolo",
            "emails": [
                "email_01@griaule.com",
                "email_02@griaule.com"
            ],
            "biographics": {
                "information": "some value",
                "ip-address": "192.168.0.62",
                "face-score-threshold": "30",
                "big-text": "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum ..."
            },
            "message": "Email sent"
        },
        ...
	]
}
```


# Autenticação SSL na API do GBDS

## Introdução

A API do GBDS provê autenticação SSL para a conexão entre cliente e servidor usando o protocolo TLS, habilitando uma nova camada de segurança. Este manual cobre os processos para habilitar a autenticação SSL na API do GBDS.

## Certificados

A autenticação SSL usando TLS requer autenticação mútua, então o primeiro passo é a geração dos certificados do cliente e do servidor, os quais devem ter um formato válido. Os passos para permitir a autenticação dos dois lados são explicados abaixo.

### Certificados do Servidor

Um arquivo *Keystore* e um arquivo *Truststore* devem ser criados no servidor e alocados em `/etc/griaule/keystore`. Os dois arquivos devem ter formato PKCS12 (`.pfx` ou `.p12`).

As cadeias públicas de certificação dos certificados do cliente e do servidor devem ser adicionadas ao *Truststore* para permitir a autenticação.

### Certificados do Cliente

Um arquivo *Keystore* e um arquivo *Truststore* devem ser criados no cliente. Esses serão usados para a autenticação da aplicação.

A cadeia pública de certificação que pertence ao servidor deve ser adicionada à *Truststore* da aplicação cliente.

## Configuração da API

Alguns parâmetros de configuração devem ser editados ou adicionados para permitir a autenticação SSL na API do GBDS. Quando todos os parâmetros estiverem corretamente incluídos, o serviço da API deve ser reiniciado para aplicar as mudanças no arquivo de configuração.

{% hint style="warning" %}
Ao habilitar a autenticação SSL na API do GBDS, será necessária autenticação TLS para qualquer comunicação com a porta da API, não havendo possibilidade de comunicação via HTTP.
{% endhint %}

O caminho do arquivo de configuração da API é `/etc/griaule/conf/gbsapi/gbdsapi.properties` e os parâmetros a serem modificados são os seguintes:

**security.require-ssl**

> Esse parâmetro define se SSL é necessário para comunicação com a API. Seu valor deve ser definido como `true` para habilitar a autenticação SSL.
>
> *value*: `true`

**server.ssl.protocol**

> Esse parâmetro define o protocolo SSL a ser utilizado na autenticação. Seu valor deve ser definido como `TLS`.
>
> *value*: `TLS`

**server.ssl.client-auth**

> Esse parâmetro define se a autenticação do cliente é necessária para a comunicação com a API. Seu valor deve ser definido como `need`.
>
> *value*: `need`

**server.ssl.key-store**

> Esse parâmetro define o caminho para o arquivo *Keystore* que será utilizado no servidor.
>
> *value*: `/etc/griaule/keystore/<keystore>.pfx`

**server.ssl.key-store-password**

> Esse parâmetro define a senha a ser utilizada ao acessar o arquivo *Keystore* para validação do certificado.
>
> *value*: `keystore password`

**server.ssl.trust-store**

> Esse parâmetro define o caminho para o arquivo *Truststore* que será utilizado no servidor.
>
> *value*: `/etc/griaule/keystore/<trustore>.pfx`

**server.ssl.trust-store-password**

> Esse parâmetro define a senha a ser utilizada ao acessar o arquivo *Truststore* para validação do certificado.
>
> *value*: `<truststore password>`


# SmartSense Agent

## Introdução

Este manual descreve o procedimento de instalação do **SmartSense Agent**.

## Preparativos para Instalação

Esta seção abrange as etapas essenciais necessárias para a instalação.

{% hint style="warning" %}
Todas as etapas devem ser executadas com privilégios de root em todos os nós, salvo indicação em contrário.
{% endhint %}

Para instalar o SmartSense, você precisará de:

* Permissão de root no servidor
* Arquivo *.rpm* do SmartSense Agent

{% hint style="info" %}
Caso não tenha o arquivo, entre em contato com a equipe de suporte da Griaule.
{% endhint %}

{% hint style="warning" %}
Certifique-se de que a versão do SmartSense Agent que está sendo instalada é compatível com a versão do GBDS instalada.
{% endhint %}

Então, siga os passos apresentados abaixo.

1. Faça login no servidor como root.
2. [Instale o SmartSense Agent](#instalando-o-smartsense-agent).

## Instalando o SmartSense Agent

Transfira ou faça o download do arquivo `.rpm` no servidor.

Entre no diretório onde o arquivo `.rpm` está localizado e execute o comando:

{% hint style="info" %}
Certifique-se de substituir `<versão>` pela versão do SmartSense Agent que está sendo instalada.
{% endhint %}

```bash
rpm -ivh gbs-smartsense-agent-<versão>.rpm
                              ^^^^^^^^
```

Então, edite o arquivo de configuração do SmartSense Agent:

```bash
vim /etc/griaule/conf/gbs-smartsense-agent/application.properties
```

Dê atenção especial às seguintes propriedades, certificando-se de definir corretamente o nome de host, o nome de usuário e a senha do banco de dados onde indicado:

```properties
gbds.rdb.url=jdbc:mysql://<HOSTNAME>:3306/gbds?useSSL=false
                          ^^^^^^^^^^

gbds.rdb.username=<DB-Username>
                  ^^^^^^^^^^^^^

gbds.rdb.password=<DB-Password>
                  ^^^^^^^^^^^^^
```

Finalmente, inicie o SmartSense Agent:

```bash
/var/lib/griaule/gbs-smartsense-agent/scripts/start-smartsense.sh
```

E acompanhe o log de inicialização:

```bash
/var/lib/griaule/gbs-smartsense-agent/scripts/tail-smartsense.sh
```

### Aliases

Aliases são comandos curtos definidos pelo usuário que servem como substitutos para comandos mais longos ou complexos. Eles são criados para tornar os comandos frequentemente utilizados mais convenientes de executar. Quando um alias é invocado, ele é substituído pelo comando completo que representa antes de ser executado.

Para adicionar os aliases do SmartSense Agent, edite o arquivo `.bashrc` raiz:

```sh
vim /root/.bashrc
```

E adicione os seguintes alises:

```bash
alias agentstart='/var/lib/griaule/gbs-smartsense-agent/scripts/start-smartsense.sh'
alias agentstop='/var/lib/griaule/gbs-smartsense-agent/scripts/stop-smartsense.sh'
alias agentstatus='/var/lib/griaule/gbs-smartsense-agent/scripts/smartsense-status.sh'
alias agenthome='cd /var/lib/griaule/gbs-smartsense-agent/'
alias agentlogt='/var/lib/griaule/gbs-smartsense-agent/scripts/tail-smartsense.sh'
alias agentconf='vim /etc/griaule/conf/gbs-smartsense-agent/application.properties'
```


# Instalação do BCC Services

{% hint style="warning" %}
Dependendo do ambiente, configurações e permissões do usuário, algumas funcionalidades podem não estar disponíveis.
{% endhint %}

Este manual está atualizado para a versão 2.8.8.10806 do BCC Services.

## Pré-requisitos

Hardware:

* Espaço de armazenamento: 2 GB disponíveis.
* RAM: 4 GB.
* Processador: Intel i3 ou outro equivalente *dual core*.
* Câmera: qualquer câmera compatível com o *Microsoft Windows Image Acquisition* (WIA).
* Windows Visual C++ 2008 Redistributable package (x86).
* Windows Visual C++ 2010 Redistributable package (x86).

Software:

* Sistema Operacional: Microsoft Windows 7 ou mais recente (32 ou 64 bits).

## Licença de Software

O GBS BCC Services precisa de uma licença de software para funcionar. A licença não está associada a qualquer hardware ou endereço físico e não tem data de expiração. A licença deve ser instalada em `C:\ProgramData\Griaule`, seguindo as indicações do manual da licença.

Contacte o Suporte da Griaule se precisar de assistência adicional.

## Instalação e Configuração Inicial

Para instalar o BCC Services, execute o instalador com um clique duplo e siga os passos abaixo:

![Instalador do GBS BCC Services](/files/xutOGIHPWuzUB3z4YwJP)

O instalador carregará:

![Instalador do GBS BCC Services](/files/gX7D140Lnk8SQ7Wt98Pm)

Clique em Next:

![Instalador do GBS BCC Services](/files/MS4wNSZXowENTkBknp77)

Esta tela será exibida, clique em Next:

![Instalador do GBS BCC Services](/files/kh5LILYX4qnWQq4QwxTT)

Clique em Next:

![Instalador do GBS BCC Services](/files/KhBSStq3kwr97uhUz3Pf)

O usuário pode ajustar configurações, como câmeras de corpo e face, dispositivo de assinatura e outros. Estas configurações também podem ser realizadas após a instalação.

![Instalador do GBS BCC Services](/files/fRKNq6pCoyU5uVFOB6cq)

{% hint style="success" %}
Clique na imagem para ampliá-la.
{% endhint %}

O usuário pode habilitar e desabilitar recursos na aba `Modules`. Clique em Next para continuar a instalação.

![Instalador do GBS BCC Services](/files/I4UOdgUO8txtV9giC4mk)

O BCC Services será instalado.

![Instalador do GBS BCC Services](/files/MIehJCEm7Nwz2xm568tH)

Quando a instalação terminar, marque a opção *Run GBS BCC Services* para executar o GBS BCC Services. Clique em Finish para concluir a instalação.

![Instalador do GBS BCC Services](/files/tB18dV2M10btRIRufwfy)


# Configuração do GBDS

## Arquivo de Configuração

Os parâmetros de configuração do GBDS são definidos em um arquivo de configuração contendo todos os parâmetros e seus respectivos valores. Parâmetros que são omitidos assumem seus valores padrões. Essa seção descreve as propriedades do arquivo de configuração.

Esse documento está atualizado para a versão 4.6.9 do GBDS.

### Localização do Arquivo

O arquivo de configuração está localizado em: `/etc/griaule/conf/gbds/application.conf`.

### Propriedades do Arquivo

O arquivo de configuração deve seguir alguns requerimentos para que possa ser interpretado corretamente pelo GBDS. Esses requerimentos são:

1. O nome do arquivo e sua localização devem ser exatamente iguais ao descrito na seção [Localização do Arquivo](#localização-do-arquivo)
2. Deve haver somente um parâmetro de configuração por linha.
3. Cada parâmetro de configuração deve ter forma `{parâmetro}={valor}`, sem quebras de linha;
4. Cada valor deve ser separado por uma vírgula quando atribuído a um mesmo parâmetro.

## Parâmetros de Configuração do Akka

Os parâmetros de configuração do Akka são estruturados como um bloco no começo do arquivo de configuração, como mostrado abaixo:

{% hint style="info" %}
Acesse a [Documentação do Akka](https://doc.akka.io/docs/akka/current/general/configuration.html) para obter mais informações sobre esses parâmetros.
{% endhint %}

```properties
akka {
	loglevel = "WARNING"
	stdout-loglevel = "INFO"
	loggers = ["akka.event.slf4j.Slf4jLogger"]
	logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
	actor {
		guardian-supervisor-strategy = "com.griaulebiometrics.gbds.driver.topology.GBDSGuardianSupervisionStrategy"
		provider = "cluster"

		allow-java-serialization = on
		serialize-creators = off

		serializers {
			kryo = io.altoo.akka.serialization.kryo.KryoSerializer
			proto = akka.remote.serialization.ProtobufSerializer
		}
		serialization-bindings {
			"com.griaulebiometrics.akka.utils.message.KryoSerializableMessage" = kryo
		}

		default-dispatcher {
			type = "Dispatcher"
			executor = "default-executor"
			default-executor {
				fallback = "fork-join-executor"
			}
			fork-join-executor {
				parallelism-min = 8
				parallelism-factor = 1.0
				parallelism-max = 64
			}
		}
	}

	remote {
		artery.enabled = "on"
		artery.transport = "tcp"
		artery.canonical {
			hostname = "gbds2"
			port = 2551
		}
		artery.advanced {
			image-liveless-timeout = 20s
			client-liveness-timeout = 10s
			maximum-frame-size = 30MiB
			maximum-large-frame-size = 100MiB
			buffer-pool-size = 128
			large-buffer-pool-size = 32
		}
		use-dispatcher = "akka.remote.default-remote-dispatcher"
		transport-failure-detector {
			implementation-class = "akka.remote.DeadlineFailureDetector"
			heartbeat-interval = 120s
			acceptable-heartbeat-pause = 300s
		}
		watch-failure-detector {
			implementation-class = "akka.remote.PhiAccrualFailureDetector"
			heartbeat-interval = 300s
			threshold = 10.0
			max-sample-size = 200
			min-std-deviation = 100s
			acceptable-heartbeat-pause = 300s
			unreachable-nodes-reaper-interval = 10s
			expected-response-after = 120s
		}
	}

	cluster {
		seed-nodes = [
			##NODES##
			"akka://main@<hostname1>:2551",
			"akka://main@<hostname2>:2551",
			"akka://main@<hostname3>:2551",
			"akka://main@<hostname4>:2551"
			##LASTNODE##
		]
		roles =["manager"]
		# Number of nodes that must be up before starting cluster
		role.manager.min-nr-of-members=4
		failure-detector.min-std-deviation = 1000 ms
		failure-detector.threshold = 50.0
		failure-detector.acceptable-heartbeat-pause = 900s
		use-dispatcher = akka.cluster.cluster-dispatcher
		singleton {
			singleton-name = "offsetmanager"
			hand-over-retry-interval = 1s
			min-number-of-hand-over-retries = 15
		}
		singleton-proxy {
			singleton-name = ${akka.cluster.singleton.singleton-name}
			singleton-identification-interval = 1s
			buffer-size = 1000
		}
		cluster-dispatcher {
			type = "Dispatcher"
			executor = "fork-join-executor"
			fork-join-executor {
				parallelism-min = 2
				parallelism-max = 4
			}
		}
	}
}

prio-dispatcher {
	mailbox-type = "com.griaulebiometrics.gbds.driver.mailbox.PriorityMailbox"
	type = "Dispatcher"
	executor = "default-executor"
	default-executor {
		fallback = "fork-join-executor"
	}
	fork-join-executor {
		parallelism-min = 8
		parallelism-factor = 1.0
		parallelism-max = 64
	}
}

akka-kryo-serialization {
	type = graph
	id-strategy = default
	resolve-subclasses = true
	implicit-registration-logging = false
	kryo-initializer = "com.griaulebiometrics.akka.utils.message.KryoInitializer"
}
```

{% hint style="warning" %}
É fortemente recomendado que **não** se altere nenhum parâmetro de configuração do Akka sem orientação adequada para evitar mau funcionamento da aplicação.

Se for necessário atualizar as configurações de seu ambiente, contate o suporte da griaule pelo e-mail <support@griaule.com> para mais informações.
{% endhint %}

### loglevel

Esse parâmetro define o nível de informação que será mantido nos logs do sistema. Os valores devem ser definidos entre aspas duplas.

**Valor Padrão:**

> `"WARNING"`

**Valores Possíveis:**

> * `"OFF"`
> * `"ERROR"`
> * `"WARNING"`
> * `"INFO"`
> * `"DEBUG"`

### stdout-loglevel

Esse parâmetro define o nível de informação que será mantido pelo logger básico que é iniciado durante a inicialização do *ActorSystem*. Esse logger imprime a mensagem de log para stdout (System.out). Os valores devem ser definidos entre aspas duplas.

**Valor Padrão:**

> `"INFO"`

**Valores Possíveis:**

> * `"OFF"`
> * `"ERROR"`
> * `"WARNING"`
> * `"INFO"`
> * `"DEBUG"`

### loggers

Esse parâmetro define, entre colchetes, as entidades de logger que serão usadas para registro no tempo de boot.

**Valor Padrão:**

> `"akka.event.slf4j.Slf4jLogger"`

### logging-filter

Esse parâmetro define o filtro de eventos de log que será usado pelo *LoggingAdaptar* antes de publicar os eventos de log para o *eventStream*.

**Valor Padrão:**

> `"akka.event.slf4j.Slf4jLoggingFilter"`

### actor

#### guardian-supervisor-strategy

Esse parâmetro define a classe que será usada pelo guardião para obter seu *supervisorStrategy*

**Valor Padrão:**

> `"com.griaulebiometrics.gbds.driver.topology.GBDSGuardianSupervisionStrategy"`

#### provider

Esse parâmetro define o *ActorProvider* que será usado.

**Valor Padrão:**

> `"cluster"`

**Valores Possíveis:**

> * `"local"`
> * `"remote"`
> * `"cluster"`

#### serializers

Esse parâmetro define as entradas para os serializadores e suas ligações.

Os serializadores usados são:

`kryo = io.altoo.akka.serialization.kryo.KryoSerializer` `proto = akka.remote.serialization.ProtobufSerializer`

E sua ligação é:

`"com.griaulebiometrics.akka.utils.message.KryoSerializableMessage" = kryo`

### remote

#### artery

Esse parâmetro define a configuração para o *Artery* baseada no driver de transporte.

**Valores padrões:**

`transport = "tcp"`

`enabled = "on"`

`advanced.image-liveless-timeout = 20s`

`advanced.client-liveness-timeout = 10s`

`advanced.maximum-frame-size = 30MiB`

`advanced.buffer-pool-size = 128`

`advanced.maximum-large-frame-size = 100MiB`

`advanced.large-buffer-pool-size = 32`

`canonical.hostname = "gbds2"`

`canonical.port = 2551`

### cluster

#### seed-nodes

Esse parâmetro define os nós que se juntarão automaticamente na inicialização. Cada valor deve ser adicionado entre aspas duplas e separado por vírgulas dentro de colchetes.

**Valor Exemplo:**

> `["akka://main@<hostname1>:2551"]`

#### roles

Esse parâmetro define as funções (roles) desse membro. Cada valor deve ser adicionado entre aspas duplas e separados por vírgulas dentro de colchetes.

**Valor Padrão:**

> `["manager"]`

#### role.manager.min-nr-of-members

Esse parâmetro define o número mínimo de nós que devem estar ativos antes da inicialização do cluster.

**Valor Padrão:**

> `4`

#### singleton.singleton-name

Esse parâmetro define o nome do ator do singleton filho.

**Valor Padrão:**

> `offsetmanager`

#### singleton.hand-over-retry-interval

Quando um nó está começando a ser o mais velho, ele manda um pedido de repasse ao nó anteriormente mais velho, que deve estar saindo do cluster. Esse parâmetro define o tempo, em segundos, para tentar o reenvio do pedido até que o nó anteriormente mais velho confirme que o pedido de repasse começou ou que o membro anteriormente mais velho seja removido do cluster.

**Valor Padrão:**

> `1s`

#### singleton.min-number-of-hand-over-retries

Esse parâmetro define o número mínimo de tentativas de reenviar o pedido de repasse para o nó anteriormente mais velho.

**Valor Padrão:**

> `15`

#### singleton-proxy.singleton-name

Esse parâmetro define o nome do ator singleton que é inicializado pelo *ClusterSingletonManager*.

**Valor Padrão:**

> `${akka.cluster.singleton.singleton-name}`

#### singleton-proxy.singleton-identification-interval

Esse parâmetro define o intervalo, em segundos, no qual o proxy tenta resolver a instância singleton.

**Valor Padrão:**

> `1s`

#### singleton-proxy.buffer-size

Se a localização do singleton é desconhecida, o proxy irá armazenar a quantidade de mensagens definida nesse parâmetro em um buffer e as entregará quando o singleton for identificado. Quando o buffer estiver cheio, as mensagens mais antigas serão descartadas e as novas mensagens serão enviadas pelo proxy.

**Valor Padrão:**

> `1000`

**Valores Possíveis:**

> `1` to `10000`

## Parâmetros de Configuração

Essa seção descreve cada um dos parâmetros de configuração dos GBDS que podem ser listados no arquivo de configuração e como eles afetam a operação do sistema.

### gbds.log.diagnose

Adiciona logs à fila do Kafka a cada atividade de consumo.

**Valor Padrão:**

> `true`

### gbds.cluster.kafka.task.topic

Esse parâmetro define o tópico do Kafka onde as tarefas serão alocadas.

**Valor Padrão:**

> `gbds-tasks`

### gbds.cluster.kafka.max-tasks-per-poll

Número de tarefas realizadas no kafka em cada busca. O consumo de tarefas no kafka é feito pesquisando a fila, e a pesquisa recupera um certo número de registros a cada vez. Cada registro é uma tarefa no GBDS. Essa configuração limita quantos registros são feitos em cada poll.

**Valor Padrão:**

> `1`

**Valores Possíveis:**

> `1` to `1000`

### gbds.cluster.zookeeper.quorum

Esse parâmetro define o hostname e a porta que os servers do zookeeper podem ser achados. Se mais de um valor estiver disponível, cada valor deve ser separado por vírgulas

**Valor Padrão:**

> `<hostname>:<port>`

### gbds.cluster.tasks.window-size-for-avoiding-duplicate-tasks

Esse parâmetro configura o tamanho da fila com as últimas `N` tarefas processadas/em processamento. Se uma tarefa for duplicada para processamento e ainda estiver na fila, ela é ignorada.

**Valor Padrão:**

> `1000`

### gbds.cluster.kafka.quorum

Esse parâmetro define o endereço do *Kafka broker* e deve refletir nas configurações do Kafka.

**Valor Padrão:**

> `<hostname>:6667`

### gbds.node.matchers.start.parameters

Esse parâmetro define as configurações iniciais para os *node matchers* quando a aplicação estiver iniciando.

**Valor Padrão:**

> `"-Dakka.remote.netty.tcp.port=0 -Dakka.cluster.roles.0=matcher -Dlog4j.configuration=file:/etc/griaule/conf/gbds/gbds-log4j.xml -XX:MaxMetaspaceSize=256m -Xmx1024m"`

### gbds.node.matchers.actor-system-start.timeout

Esse parâmetro define o *timeout*, em segundos, para inicializar cada *ActorSystem* remoto que irá rodar um *matcher*.

**Valor Padrão:**

> `30s`

### gbds.node.matchers.start.timeout

Esse parâmetro define o *timeout*, em segundos, para abrir um *matcher* no *ActorSystem* remoto.

**Valor Padrão:**

> `20s`

### gbds.node.matchers.number

Esse parâmetro define o número de *matchers* que será usado nesse nó do GBDS.

Caso os microsserviços de match estejam habilitados, 3 instâncias do microsserviço serão iniciadas para cada 1 definido nessa configuração.

**Valor Padrão:**

> `1`

### gbds.node.sinks.number

Esse parâmetro define o número de *sinks* que será usado nesse nó do GBDS.

**Valor Padrão:**

> `1`

### gbds.node.actor-start.timeout

Esse parâmetro define o *timeout*, em segundos, para inicialização de todos atores nesse nó do GBDS.

**Valor Padrão:**

> `60s`

### gbds.node.max-loaded-tasks

Esse parâmetro define o número máximo de tarefas que podem coexistir simultaneamente no GBDS. Quando esse número é alcançado, nenhuma tarefa será lida até alguma anterior ser enviada.

**Valor Padrão:**

> `100`

**Valores Possíveis:**

> `1` a `20000`

### gbds.node.wait-time-when-maxed-tasks:

Esse parâmetro define o tempo para esperar antes de ler mais tarefas do Kafka.

**Valor Padrão:**

> `1s`

**Valores Possíveis:**

> `0s` a `5s`

### gbds.node.hbase-template-loaders.number

Esse parâmetro define o número de template loaders do HBase.

**Valor Padrão::**

> `1`

### gbds.node.rdb-template-loaders.number

Esse parâmetro define o número de template loaders do RDB.

**Valor Padrão::**

> `1`

### gbds.biometric.fingerprint.cab.skip-non-cab

Esse parâmetro é uma flag para ignorar templates não-cab.

**Valor Padrão::**

> `true`

### gbds.matchers.metrics.enabled

Esse parâmetro habilita as métricas de matcher.

**Valor Padrão::**

> `true`

### gbds.biometric.face.identify.enabled

Esse parâmetro habilita a operação de identificação para faces.

**Valor Padrão::**

> `true`

### gbds.biometric.face.enroll.enabled

Esse parâmetro habilita cadastro de faces.

**Valor Padrão::**

> `true`

### gbds.biometric.fingerprint.cab.search-without-cab

Esse parâmetro é uma flag para realizar procuras sem cab.

**Valor Padrão::**

> `false`

### gbds.fingerprint.post-matching.enabled

Esse parâmetro habilita o post matching para digitais.

**Valor Padrão::**

> `true`

### gbds.face.post-matching.enabled

Esse parâmetro habilita o post matching para face.

**Valor Padrão::**

> `true`

### gbds.cluster.quorum.quorum-check-delay

Esse parâmetro define o atraso, em segundos, para realizar a decisão de **Desligar** um membro do cluster que esteja inalcançável ou removido.

{% hint style="info" %}
Desligar, neste caso, se refere a marcar o nó como inacessível, de forma que o restante do sistema adapte seu funcionamento para o caso com um nó a menos.
{% endhint %}

O contador de atraso inicia e reinicia sempre que houver mudanças nos estados dos membros do cluster.

**Valor Padrão:**

> `5s`

### gbds.boot.completed-message-ack.timeout

Esse parâmetro define o quão longo, em segundos, o ator de inicialização (*boot*), aguardará o recebimento de um *ack* para a *CompletedBootMessage* de um *NodeManager*

Se o *ack* não for recebido, a mensagem será reenviada.

**Valor Padrão:**

> `3s`

### gbds.boot.people.node-nr-scanners

Número de atores de varredura paralela que varrerão pessoas registradas durante a inicialização do sistema em cada nó.

**Valor Padrão:**

> `1`

### gbds.boot.shuffler-message-ack.timeout

Quanto tempo o ator do shuffler esperará por um acknowledge. Caso o acknowledge não seja recebido, a mensagem será reenviada.

**Valor Padrão:**

> `90s`

### gbds.boot.scan.ignoreErrorsOnRegion

Determina se regiões do HBase com falha devem ser ignoradas durante o boot.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.boot.scan.ignoreErrorsOnRegion.maxTries

Define o número máximo de tentativas antes de ignorar uma região com falha no boot.

**Valor Padrão:**

> `5`

### gbds.boot.scan.maxRowsPerNode

Usando esta configuração, o GBDS irá parar o scan de pessoas em um nó assim que alcançar este número de linhas.

**Valor Padrão:**

> `0`

### gbds.boot.scan-delayer.rows

Define o número de linhas a serem escaneadas antes do delay.

**Valor Padrão:**

> `0`

### gbds.boot.scan-delayer.secs

Define o tempo de delay para aguardar a cada bloco de linhas escaneado.

**Valor Padrão:**

> `0`

### gbds.ul.boot.scan.enabled

Define se o boot de UL deve ser ignorado.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.boot.scan.ignoreErrorsOnRegion

Define se regiões ruins devem ser ignoradas durante o boot de UL.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.boot.matcher.creation.sleepTime.ms

Define o tempo de sleep entre a criação dos matchers.

**Valor Padrão:**

> `500`

**Valor Mínimo:**

> `0`

**Valor Máximo:**

> `30000`

### gbds.biometric.fingerprint.enabled

Esse parâmetro é usado para determinar se a digital é o objeto de busca prioritário.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biometric.fingerprint.exception.enabled

Esse parâmetro define se as digitais devem ser consideradas na geração de exceções de cadastro (*enrollment*).

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biometric.fingerprint.identify.threshold

Esse parâmetro define a pontuação mínima de coincidências para uma comparação de digitais ser considerada um casamento (*match*) durante a operação de busca.

**Valor Padrão:**

> `30`

### gbds.biometric.fingerprint.exception.threshold

Esse parâmetro define a pontuação mínima de coincidência para uma comparação de digitais ser considerada um casamento (*match*) durante a operação de cadastro, gerando uma exceção.

**Valor Padrão:**

> `40`

### gbds.biometric.fingerprint.exception.enroll.min-matches-for-exception

Esse parâmetro define o número mínimo de casamentos entre dedos necessário para gerar uma exceção durante uma operação de cadastro.

**Valor Padrão:**

> `2`

### gbds.biometric.fingerprint.cab.identify.threshold

Esse parâmetro define o limiar para casamentos usando a análise de CAB. Esse parâmetro não é usado se a verificação de CAB não está habilitada.

**Valor Padrão:**

> `5`

### gbds.biometric.fingerprint.latent.threshold

Esse parâmetro define a pontuação mínima para considerar uma busca de latente um casamento.

**Valor Padrão:**

> `10`

### gbds.biometric.fingerprint.identify.index.delta-zero

Esse parâmetro define o índice de configuração para Delta Zero. Os coeficientes Delta são usados para otimizar buscas.

**Valor Padrão:**

> `-1` (desabilitado)

### gbds.biometric.fingerprint.identify.index.delta-one

Esse parâmetro define a o índice de configuração de Delta Um. Os coeficientes Delta são usados para otimizar buscas.

**Valor Padrão:**

> `-1` (desabilitado)

### gbds.latent.candidates.max-number

Esse parâmetro define o tamanho máximo da lista de candidatos retornada em buscas de latentes.

**Valor Padrão:**

> `1000`

### gbds.biometric.palmprint.enabled

Esse parâmetro é usado para determinar se impressões palmares são objetos de busca primária.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biometric.palmprint.exception.enabled

Esse parâmetro define se impressões palmares devem ser consideradas para gerar exceções de cadastro (*enroll*).

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biometric.palmprint.interdigital.identify.threshold

Esse parâmetro define a pontuação mínima de coincidência para a comparação entre interdigitais de palmar ser considerada um casamento durante operações de busca.

**Valor Padrão:**

> `70`

### gbds.biometric.palmprint.thenar.identify.threshold

Esse parâmetro define a pontuação mínima de coincidência para a comparação entre tenares de palmar ser considerada um casamento durante operações de busca.

**Valor Padrão:**

> `70`

### gbds.biometric.palmprint.hypothenar.identify.threshold

Esse parâmetro define a pontuação mínima de coincidência para a comparação entre hipotenares de palmar ser considerada um casamento durante operações de busca.

**Valor Padrão:**

> `70`

### gbds.biometric.face.enabled

Esse parâmetro é usado para determinar se faces são usadas como objetos primários de busca.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biometric.face.exception.enabled

Esse parâmetro define se imagens faciais devem ser consideradas na geração de exceções de cadastro (*enroll*).

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biometric.face.identify.threshold

Esse parâmetro define a pontuação mínima de coincidência para a comparação entre faces ser considera um casamento durante uma operação de busca.

**Valor Padrão:**

> `60`

### gbds.biometric.face.exception.threshold

Esse parâmetro define o limiar que será usado quando comparando biometrias faciais durante a operação de identificação. Definir um valor alto para esse parâmetro pode, possivelmente, aumentar o número de ocorrências de falso negativo.

**Valor Padrão:**

> `60`

### gbds.biometric.face.exception.minimum.coincident-fingers.ignore.face

Esse parâmetro define o número mínimo de dedos coincidentes necessário para descartar o resultado da comparação de face na geração de uma exceção de cadastro (*enroll*).

**Valor Padrão:**

> `4`

### gbds.biometric.face.template.format

Define o formato do template para face.

Os valores possíveis são: `TPT_FORMAT_1` ou `TPT_FORMAT_2`.

{% hint style="warning" %}
Os formatos de face não são intercambiáveis. Faces que tiveram enroll feito em um formato não darão match com faces feitas em outro formato.
{% endhint %}

{% hint style="danger" %}
O valor dessa configuração deve ser o mesmo nos arquivos `application.conf` e `gbdsapi.properties`
{% endhint %}

### gbds.biometric.iris.enabled

Esse parâmetro é usado para determinar se a íris é definida como objeto primário de busca.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biometric.iris.exception.enabled

Esse parâmetro define se a íris deve ser considera na geração de exceções de cadastro (*enroll*).

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biometric.iris.exception.threshold

Esse parâmetro define a pontuação mínima de coincidência para uma comparação de íris ser considerada um casamento durante uma operação de cadastro, gerando uma exceção.

**Valor Padrão:**

> `62`

### gbds.biometric.iris.identify.threshold

Esse parâmetro define a pontuação mínima de coincidência para uma comparação de íris ser considerada um casamento durante uma operação de busca.

**Valor Padrão:**

> `62`

### gbds.latent.reverse-latent-match.enabled

Esse parâmetro define se o cadastro e busca de latentes não resolvidas estão habilitados. É usado para aplicações forenses.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.latent.fingerprint.identify.threshold

Esse parâmetro define a pontuação mínima para considerar uma busca de impressão digital latente como casamento.

**Valor Padrão:**

> `12`

### gbds.latent.additional-search.enabled

Esse parâmetro define se buscas adicionais estão ativas para busca de latentes. Buscas adicionais realizarão uma comparação adicional para pares coincidentes entre um limiar definido.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.latent.additional-search.fingerprint.execution-lower-bound

Esse parâmetro define a pontuação mínima de coincidência para a qual buscas adicionais devem ser feitas.

**Valor Padrão:**

> `15`

### gbds.latent.additional-search.fingerprint.execution-upper-bound

Esse parâmetro define a pontuação máxima para a qual buscas adicionais devem ser feitas.

**Valor Padrão:**

> `120`

### gbds.latent.primary-classification.enabled

Esse parâmetro define se classificações primárias devem ser utilizadas para buscas de latentes.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.latent.primary-classification.same-class.fingerprint.threshold

Esse parâmetro define o limiar mínimo para comparar digitais da mesma classe e considerar um casamento durante buscas de latentes.

**Valor Padrão:**

> `15`

### gbds.latent.primary-classification.different-class.fingerprint.threshold

Esse parâmetro define o limiar mínimo para considerar um casamento entre classes diferentes de dedos durante buscas de latentes.

**Valor Padrão:**

> `40`

### gbds.latent.primary-classification.unknown-class.should-use-different-class-threshold

Esse parâmetro define se o limiar de coincidência de uma classe diferente deve ser usado para busca de latentes quando há uma classificação primária desconhecida.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.latent.ul.fingerprint.identify.threshold

Esse parâmetro define o limiar padrão para busca de latentes não resolvidas.

**Valor Padrão:**

> `4`

### gbds.latent.ul.palmprint.identify.threshold

Esse parâmetro define o limiar padrão para busca de latentes palmares não resolvidas.

**Valor Padrão:**

> `4`

### gbds.latent.postmatching.enabled

Esse parâmetro define se o *postmatching* está ativo para buscas reversas de latente, buscas regulares de latente e buscas contra latentes não resolvidas já registradas.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.rdb.driverClassName

Esse parâmetro define o nome de classe para o banco de dados relacional que será usado para armazenar as latentes não resolvidas. Esse valor deve ser definido entre aspas duplas.

**Valor Padrão:**

> `"com.mysql.jdbc.Driver"`

### gbds.rdb.url

Esse parâmetro define a URL do banco de dados relacional a ser acessado. Esse valor deve ser definido entre aspas duplas.

**Valor Padrão:**

> `"jdbc:mysql://<address>:<port>/gbds"`

### gbds.rdb.username

Esse parâmetro define o usuário a ser usado no banco de dados relacional. Esse valor deve ser definido entre aspas duplas.

**Valor Padrão:**

> `"root"`

### gbds.rdb.password

Esse valor define a senha a ser usada para acessar o banco de dados relacional. Esse valor deve ser definido entre aspas duplas.

### gbds.rdb.dialect

Esse parâmetro define o dialeto a ser usado no banco de dados relacional. Esse valor deve ser definido entre aspas duplas.

**Valor Padrão:**

> `"org.hibernate.dialect.MySQLDialect"`

### gbds.rdb.showSql

Esse parâmetro define se as declarações do SQL devem ser incluídas nos logs da aplicação.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.rdb.maxPoolSize

Esse parâmetro define o número máximo de conexões que uma pool irá manter.

**Valor Padrão:**

> `100`

### gbds.rdb.minPoolSize

Esse parâmetro define o número mínimo de conexões que uma pool irá manter.

**Valor Padrão:**

> `1`

### gbds.rdb.initialPoolSize

Esse parâmetro define o número de conexões que uma pool tentará adquirir na inicialização. Esse valor deve ser um valor entre gbds.rdb.minPoolSize e gbds.rdb.maxPoolSize.

**Valor Padrão:**

> `2`

### gbds.rdb.maxStatments

Esse parâmetro define o tamanho do cache global do PreparedStatement do c3p0. Se tanto o gbds.rdb.maxStatments e o gbds.rdb.maxStatementsPerConnection forem zero, o *statement caching* não será habilitado. Se o gbds.rdb.maxStatments for zero, mas gbds.rdb.maxStatementsPerConnection for diferente de zero, o *statement caching* será habilitado, mas nenhum limite global será forçado, apenas o máximo por conexão.

Esse parâmetro controla o número total de *statements* em cache para todas conexões. Se maior que zero, deve ser um número significativamente grande, pois cada conexão em pool requer seu próprio conjunto distinto de *statements* em cache. Como um guia, considere quantos PreparedStatements distintos são usados frequentemente em sua aplicação, então multiplique esse número por gbds.rdb.maxPoolSize para chegar a um valor apropriado.

**Valor Padrão:**

> `0`

### gbds.rdb.maxIdleTime

Esse parâmetro define, em segundos, quanto tempo a conexão pode ser agrupada, mas não utilizada antes de ser descartada. Zero significa que as conexões inativas nunca expiram.

**Valor Padrão:**

> `1800`

### gbds.rdb.maxConnectionAge

Esse parâmetro define, em segundos, o tempo de vida de uma conexão. Uma conexão anterior a gbds.rdb.maxConnectionAge será destruída e removida do pool. Isso difere de gbds.rdb.maxIdleTime porque se refere à idade absoluta. Mesmo uma conexão que não esteve muito ociosa será removida do pool se exceder gbds.rdb.maxConnectionAge. Zero significa que nenhuma idade máxima absoluta é aplicada.

**Valor Padrão:**

> `1800`

### gbds.rdb.statementCacheNumDeferredCloseThreads

Se configurado com um valor maior que 0, o *statement cache* rastreará quando as conexões estiverem em uso e apenas destruirá os *statements* quando suas Conexões-pai não estiverem em uso. Embora o fechamento de um *statement* enquanto a conexão-pai está em uso esteja formalmente dentro das especificações, alguns bancos de dados e/ou drivers JDBC, mais notavelmente Oracle, não lidam bem com o caso e congelam, levando a deadlocks. Definir este parâmetro com um valor positivo deve eliminar o problema. Este parâmetro só deve ser definido se você observar que as tentativas de c3p0 para fechar (close()) os *statements* armazenadas em cache congelam (normalmente, você verá DEADLOCKS APARENTES em seus logs). Se definido, este parâmetro deve quase sempre ser definido como 1.

**Valor Padrão:**

> `1`

### gbds.rdb.acquireIncrement

Determina quantas conexões por vez c3p0 tentará adquirir quando o pool se esgotar.

**Valor Padrão:**

> `10`

### gbds.rdb.testConnectionOnCheckout

Se *true*, uma operação será executada em cada verificação de conexão para checar se a conexão é válida. Testar conexões em checkout é a forma mais simples e confiável de teste de conexão, mas para melhor desempenho, considere verificar as conexões periodicamente usando gbds.rdb.idleConnectionTestPeriod.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.rdb.testConnectionOnCheckin

Se *true*, uma operação será executada de forma assíncrona em cada entrada de conexão para verificar se a conexão é válida. Use em combinação com gbds.rdb.idleConnectionTestPeriod para um teste de conexão sempre assíncrono e bastante confiável.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.rdb.acquireRetryAttempts

Define quantas vezes c3p0 tentará adquirir uma nova conexão do banco de dados antes de desistir. Se este valor for menor ou igual a zero, c3p0 continuará tentando buscar uma conexão indefinidamente.

**Valor Padrão:**

> `10`

### gbds.rdb.idleConnectionTestPeriod

Se esse número for maior que 0, c3p0 irá testar todas as conexões ociosas, na pool, mas não verificadas, a cada quantidade de segundos definida nesse parâmetro.

**Valor Padrão:**

> `30`

### gbds.biometric.newborn-palmprint.enabled

Esse parâmetro é usado para determinar se a palmar de recém-nascidos é o objeto de busca prioritário.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biometric.newborn-palmprint.exception.enabled

Esse parâmetro define se a palmar de recém-nascidos deve ser considerada na geração de exceções de cadastro (enrollment).

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biometric.newborn-palmprint.identify.threshold

Esse parâmetro define a pontuação mínima de coincidências para uma comparação de palmar de recém-nascidos ser considerada um casamento (match) durante a operação de busca.

**Valor Padrão:**

> `50`

### gbds.cluster.recovery.qtd.scanners

Número de scanner para recuperação de cluster.

**Valor Padrão::**

> `5`

### gbds.cluster.recovery.qtd.getters

Número de getters para recuperação de cluster. Esse parâmetro não é mais usado na versão 3.2x ou acima.

**Valor Padrão::**

> `2`

### gbds.cluster.recovery.shuffler.block.window\.size

Número do tamanho da janela do bloco do shuffler (tamanho do buffer do shuffler) para recuperação do cluster.

**Valor Padrão::**

> `100`

### gbds.router.virtual-nodes.number

Esse parâmetro define o número de nodos virtuais.

**Valor Padrão::**

> `100`

### gbds.biometric.best-of-biometrics.enabled

Esse parâmetro habilita o best-of-biometrics. Quando habilitado, o conjunto de biometrias da pessoa é a consolidação das melhores biometrias obtidas de todas as transações da pessoa ao longo do tempo.

{% hint style="warning" %}
Essa flag **DEVE** ter o mesmo valor nas configurações do GBDS e da API do GBDS.
{% endhint %}

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biometric.remove-inactive-people-from-enroll-result

Este parâmetro define se perfis inativos devem ser removidos dos resultados de enroll.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.transparency.search.identify.result.notify.enabled

Este parâmetro habilita o serviço de notificação por email, que envia as notificações de resultados de pesquisa com pessoas de interesse.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.searches.verify.saveOnRdb.enabled

Define se a operação de verificação será salva na tabela `gbds.transaction` do RDB.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

{% hint style="danger" %}
Esse valor deve ser o mesmo no `application.conf` e no `gbdsapi.properties`
{% endhint %}

### gbds.searches.identify.saveOnRdb.enabled

Define se a operação de identificação será salva na tabela `gbds.transaction` do RDB.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

{% hint style="danger" %}
Esse valor deve ser o mesmo no `application.conf` e no `gbdsapi.properties`
{% endhint %}

### gbds.monitor.port

Define a porta em que será executado o GBDS Monitor.

**Valor Padrão:**

> `9100`

### gbds.memory-monitor

Adiciona aos logs o uso de memória da JVM a cada 10 segundos.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.watchdog.interval

Define, em minutos, o intervalo de tempo para os logs de watchdog.

**Valor Padrão:**

> `1`

**Valor Máximo:**

> `60`

### gbds.watchdog.log.mode

Define o modo de log do watchdog.

**Valor Padrão:**

> `TGUID_MATCHER_MAP`

**Valores Possíveis:**

> * `TGUID_MATCHER_MAP`
> * `MATCHER_TGUID_MAP`

### gbds.watchdog.log.level

Define o level de log do watchdog.

**Valor Padrão:**

> `DEBUG`

**Valores Possíveis:**

> * `DEBUG`
> * `INFO`

### gbds.verifyPostMatch.enabled

Liga ou desliga a verificação pós-match em transações de cadastro com exceções.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.search.verify.adjust-resolution

Quando essa configuração está ativada, verificações e atualizações na API e a verificação pós-match no GBDS ajustarão a resolução realizando uma verificação de correspondência, diminuindo a pontuação em dedos e palmas.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbscluster.update.consider.fingerprints

Esse parâmetro define se digitais devem ser consideradas ao gerar exceções de atualização.

**Valor Padrão:**

> `true`

**Possible values:**

> * `true`
> * `false`

### gbscluster.update.consider.faces

Esse parâmetro define se imagens de face devem ser consideradas ao gerar exceções de atualização.

**Valor Padrão:**

> `false`

**Possible values:**

> * `true`
> * `false`

### gbscluster.update.consider.faces.beforeFingerprints

Esse parâmetro define se as faces devem ser analisadas antes das impressões digitais ao gerar exceções de atualização. Se `false`, a análise de face é feita após a análise da impressão digital.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbscluster.update.faces.verify.matchthreshold

Esse parâmetro define o limiar a ser usado durante a comparação de biometrias faciais em operações de busca. Definir um valor alto para esse parâmetro pode, possivelmente, resultar em um aumento de ocorrências de falsos negativos.

**Valor Padrão:**

> `60`

### gbscluster.update.minimum.fingers

Esse parâmetro define o número mínimo de casamentos entre dedos necessário para uma operação de **atualização** ser aceita.

**Valor Padrão:**

> `4`

## Configuração do Serializador de Templates

Essa seção descreve os parâmetros de configuração relacionados ao serializador de templates. Esses parâmetros de configuração são projetados para permitir o uso do *GBDS Batch Extractor*.

{% hint style="info" %}
Veja o manual do *GBDS Batch Extractor* para informações adicionais sobre seu uso.
{% endhint %}

Sempre que o GBDS realizar uma operação de *cold boot*, ele tentará recuperar os templates de uma família de colunas padrão. Se o template não existir nessa coluna, o GBDS tentará recuperá-lo da família de colunas de reserva.

Os parâmetros de configuração do serializador são:

### Família de Colunas Padrão

Esses parâmetros são divididos por modalidades biométricas. Os templates nessa família de colunas não possuem codificação e o formato usado é de *byteArray*.

```properties
gbds.hbase.templates.fingerprint.cf.name
gbds.hbase.templates.palmprint.cf.name
gbds.hbase.templates.face.cf.name
gbds.hbase.templates.iris.cf.name
gbds.hbase.templates.newborn-palmprint.cf.name
```

O valor padrão para esses parâmetros é `tpt`.

### Família de Colunas Reserva

Esses parâmetros referem-se às famílias de colunas anteriormente usadas para armazenar os templates biométricos. São separados por modalidade biométrica.

```properties
gbds.hbase.templates.fallback.fingerprint.cf.name
gbds.hbase.templates.fallback.palmprint.cf.name
gbds.hbase.templates.fallback.face.cf.name
gbds.hbase.templates.fallback.iris.cf.name
gbds.hbase.templates.fallback.newborn-palmprint.cf.name
```

Os valores padrão representam as famílias de colunas usadas antes da mudança desses parâmetros, e são, respectivamente: `fingerprints`, `palmprints`, `faces` e `iris`.

### Codificação Reserva em *base64*

A família de colunas reserva suporta codificação. Os parâmetros a seguir definem se a família de colunas é codificada em *base64*:

```properties
gbds.hbase.templates.fallback.fingerprint.cf.is-base64-encoded
gbds.hbase.templates.fallback.palmprint.cf.is-base64-encoded
gbds.hbase.templates.fallback.face.cf.is-base64-encoded
gbds.hbase.templates.fallback.iris.cf.is-base64-encoded
gbds.hbase.templates.fallback.newborn-palmprint.cf.is-base64-encoded
```

O valor padrão para esses parâmetros é `true`.

### gbds.template.memory.format

Define como o GBDS irá armazenas os templates na memória e nos matchers.

As opções são:

* `DESERIALIZED_FULL`: Opção padrão. Os templates são armazenados deserializados com minúcias e segmentações.
* `SERIALIZED_MINUTIAE_SEGMENTS`: Os templates são armazenados deserializados com minúcias e segmentações.
* `SERIALIZED_MINUTIAE`: Os templates são armazenados serializados somente com minúcias. As segmentações são re-extraídas do template a cada busca feita. Essa opção aumenta o tempo de procuras 1:N.
* `OPTIMIZED`: Usa um novo formato otimizado de template para reduzir degradação de desempenho ao longo do tempo em buscas.

### Pré-alocação de memória

Define a quantidade de memória pré-alocada para cada modalidade.

```properties
gbds.fingerprint.memory-storage.pre-aloc
gbds.palmprint.memory-storage.pre-aloc
gbds.newborn-palmprint.memory-storage.pre-aloc
gbds.ul-fingerprint.memory-storage.pre-aloc
gbds.ul-palmprint.memory-storage.pre-aloc
```

O valor padrão para cada configuração é `0`. O sistema entende Kilobytes (`k`, `kb`), Megabytes (`m`, `mb`) e Gigabytes (`g`, `gb`), sem distinção de maiúsculas de minúsculas. O valor é dividido igualmente entre todos os matchers do nó.

{% hint style="info" %}
Face e íris não podem ser pré-alocadas.
{% endhint %}

### Microsserviços de Match

Esta seção apresenta os parâmetros de configuração referentes aos microsserviços de match.

A configuração dos microsserviços é única para cada nó do cluster.

#### gbds.match.service.enabled

Define se o microsserviço de match está habilitado.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

#### gbds.match.service.initialPort

Define a porta inicial para iniciar os serviços de match no nó.

**Valor Padrão:**

> `32000`

#### gbds.match.service.logLevel

Define o nível de log do serviço de match no GBDS. Os diferentes níveis de log são:

* `NONE`: Não gera logs sobre o serviço
* `INFO`: Loga os scripts e as URLs de request
* `TIME`: Loga os scripts, as URLs de request e o tempo de execução
* `DEBUG`: Loga todas as informações do serviço

**Valor Padrão:**

> `NONE`

**Valores Possíveis**

> `INFO`

> `TIME`

> `DEBUG`

#### gbds.match.service.timeout

Define o timeout máximo para requests ao microsserviço de match, em milissegundos.

**Valor Padrão:**

> `10000`

#### gbds.match.service.templateSend.parallelByModality

Habilita o processamento paralelo por modalidade biométrica no GBDS.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

#### gbds.match.service.linkLibSegfault

Este parâmetro habilita o rastreamento de falhas de segmentação no microsserviço de match.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

#### gbds.match.service.maxTries

Quando um microsserviço de match tem um erro de conexão, tenta 3 vezes antes de falhar a transação, esperando 2s entre as tentativas.

**Valor Padrão:**

> `3`

#### gbds.match.service.maxConnectionErrors

Quando um microsserviço de match tem 5 transações com erro de conexão seguidas, para o GBDS para prevenir falhas em todas as transações a partir desse ponto.

**Valor Padrão:**

> `5`

#### gbds.match.service.checkTimeoutSecs

Timeout (em segundos) para verificar se o microsserviço de match foi criado.

**Valor Padrão:**

> `10`


# API do GBDS

## Arquivo de Configuração

Os parâmetros de configuração da API do GBDS são definidos em um arquivo de configuração contendo todos os parâmetros e seus respectivos valores. Parâmetros omitidos assumem seu valor padrão. Essa seção descreve as propriedades do arquivo de configuração.

### Localização do Arquivo

O arquivo de configuração está localizado em: `/etc/griaule/conf/gbsapi/gbdsapi.properties`.

### Propriedades do Arquivo

O arquivo de configuração deve seguir alguns requerimentos para que possa ser interpretado corretamente pelo GBDS. Esses requerimentos são:

1. O nome do arquivo e sua localização devem ser exatamente iguais ao descrito na seção [Localização do Arquivo](#localizacao-do-arquivo)
2. Deve haver somente um parâmetro de configuração por linha.
3. Cada parâmetro de configuração deve ter forma `{parâmetro}={valor}`, sem quebras de linha;
4. Cada valor deve ser separado por uma vírgula quando atribuído a um mesmo parâmetro.

## Parâmetros de Configuração

Essa seção descreve cada um dos parâmetros de configuração da API do GBDS que podem estar listados no arquivo de configurações e como eles afetam a operação do sistema.

### Segurança

{% hint style="info" %}
Veja o Manual de Segurança do GBDS para mais informações sobre as configurações de segurança do GBDS.
{% endhint %}

#### gbscluster.api.security.enabled

Esse parâmetro define se os métodos de segurança para autenticação e autorização estão habilitados.

**Valor Padrão:**

> `true`

**Valores possíveis:**

> * `true`
> * `false`

#### gbscluster.api.security.keystore

Esse parâmetro define o caminho para a *keystore* contendo a senha do usuário de vinculação *LDAP* e a chave de assinatura do token JTW.

**Valor Padrão:**

> Vazio

#### gbscluster.api.security.ldap.url

Esse parâmetro define a URL de conexão para o servidor LDAP.

**Valor Padrão:**

> Vazio

#### gbscluster.api.security.ldap.userSearchBase

Esse parâmetro define o *Distinguished Name (DN)* para o repositório do usuário no servidor LDAP.

**Valor Padrão:**

> Vazio

#### gbscluster.api.security.ldap.userSearchAttribute

Esse parâmetro define o atributo do usuário que será usado como nome de usuário durante a autenticação.

**Valor Padrão:**

> Vazio

#### gbscluster.api.security.ldap.userGroupMembershipAttribute

Esse parâmetro define o atributo do usuário que contém sua informação de associação de grupo.

**Valor Padrão:**

> Vazio

#### gbscluster.api.security.ldap.bindUserDN

Esse parâmetro define o *Distinguished Name* do usuário vinculado.

**Valor Padrão:**

> Vazio

#### gbscluster.api.security.token.ttlInMilliseconds

Esse parâmetro define o tempo de vida, em milissegundos, do Token JWT.

**Valor Padrão:**

> Vazio

**Valores possíveis:**

> `1800000` (30 min) to `10800000` (3 horas)

**Valor recomendado:**

> `3600000` (1 hora)

#### gbscluster.api.security.authorization.ranger.configurationDirectory

Esse parâmetro é opcional e define o diretório com a informação de configuração específica do GBDS para o Apache Ranger.

**Valor Padrão:**

> Vazio

#### gbscluster.api.security.authorization.rolePermissionMapFile

Esse parâmetro é opcional e define o arquivo com funções/permissões mapeados para as aplicações do GBDS.

**Valor Padrão:**

> Vazio

### gbds.cluster.kafka.task.topic

Esse parâmetro define o tópico do Kafka onde as tarefas serão alocadas.

**Valor Padrão:**

> `gbds-tasks`

### gbds.cluster.zookeeper.quorum

Esse parâmetro define o *hostname* e a porta na qual o servidor zookeeper pode ser encontrado. Cada valor deve ser separado por vírgulas se mais de um valor estiver disponível.

**Valor Padrão:**

> `<hostname>:<port>`

### gbscluster.kafka.broker

Esse parâmetro define o endereço do Kafka Broker e deve ser refletido nas configurações do Kafka.

**Valor Padrão:**

> `<hostname>:6667`

### gbscluster.kafka.producer.acks

Esse parâmetro define o número de *acknowledgments* que o produtor requer que o líder tenha recebido antes de considerar o pedido completo. Esse parâmetro controla a durabilidade dos registros que são enviados.

**Valor Padrão:**

> `1`

**Valores possíveis:**

> * `0`
> * `1`
> * `all`

{% hint style="info" %}
Veja a [Documentação do Kafka](http://kafka.apache.org/documentation.html#producerconfigs) para mais informações.
{% endhint %}

### gbscluster.kafka.producer.buffer.memory

Esse parâmetro define a memória total que o produtor pode usar para o buffer de registros aguardando para serem enviados ao servidor, em bytes.

**Valor Padrão:**

> `67108864`

### gbscluster.kafka.producer.batch.size

Esse parâmetro define o tamanho máximo do lote (batch) que o produtor pode enviar em uma única requisição quando múltiplos registros estão sendo enviados para a mesma partição.

**Valor Padrão:**

> `8196`

### gbscluster.kafka.consumer.fetch.message.max.bytes

Esse parâmetro define o número de bytes de mensagem para a tentativa de consulta a cada partição/tópico em cada requisição de consulta.

**Valor Padrão:**

> `1248576`

### gbscluser.dispatcher.requests.topic

Esse parâmetro define o tópico usado para escutar novas requisições. Não há relação nenhuma entre esse parâmetro e *gbscluster.kafka.group*.

**Valor Padrão:**

> `requests`

### gbscluser.dispatcher.requests.nthreads

Esse parâmetro define o número de threads a serem usadas para os consumidores de requisições. Por padrão, é definido para o número de partições que o tópico de requisições possui.

**Valor Padrão:**

> `1`

### gbscluser.dispatcher.requests.partitions

Esse parâmetro define o número de partições usadas pelo Kafka para armazenamento de tópicos de requisição.

**Valor Padrão:**

> `1`

### gbscluser.dispatcher.requests.replication

Esse parâmetro define o fator de replicação usado pelos tópicos do Kafka.

**Valor Padrão:**

> `3`

### gbscluster.hdfs.person.location

Esse parâmetro define a localização onde os arquivos XML ANSI/NIST serão salvos.

**Valor Padrão:**

> `hdfs://<hostname>:8020/tmp/gbscluster/`

### gbscluster.hdfs.host

Esse parâmetro define o endereço de host do HDFS e deve refletir as configurações do HDFS.

**Valor Padrão:**

> `hdfs://<hostname or HA nameservice>:8020`

### gbscluster.transport.http.url

Esse parâmetro define a URL de transporte HTTP.

**Valor Padrão:**

> `http://<hostname>`

### gbscluster.transport.http.port

Esse parâmetro define a porta de transporte HTTP.

**Valor Padrão:**

> `6516`

### gbscluster.search.verify.primary.fingerprints

Esse parâmetro define se as operações de busca devem ser executadas sobre templates de digitais.

**Valor Padrão:**

> `true`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.search.verify.primary.faces

Esse parâmetro define se as operações de busca devem ser executadas sobre templates de face.

**Valor Padrão:**

> `true`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.search.verify.primary.iris

Esse parâmetro define se as operações de busca devem ser executadas sobre templates de íris.

**Valor Padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.search.verify.primary.palmprints

Esse parâmetro define se as operações de busca devem ser executadas sobre templates de palmares.

**Valor Padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.search.verify.primary.newborn-palmprints

Esse parâmetro define se as operações de busca devem ser executadas sobre templates de palmar de recém-nascidos.

**Valor Padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.search.iris.verify.matchthreshold

Esse parâmetro define a pontuação mínima para uma comparação de íris ser considerada um casamento durante uma operação de busca.

**Valor Padrão:**

> `26`

### gbscluster.search.fingerprints.ul.verify.matchthreshold

Este parâmetro define a pontuação mínima para que uma comparação de impressão digital de UL seja considerada um casamento durante a operação de pesquisa.

**Valor Padrão:**

> `35`

### gbscluster.search.palmprints.ul.verify.matchthreshold

Este parâmetro define a pontuação mínima para que uma comparação de palmar de UL seja considerada um casamento durante a operação de pesquisa.

**Valor Padrão:**

> `35`

### gbscluster.activate.quality.duplicities

Esse parâmetro define quando considerar uma transação de cadastro com duplicidades como `ENROLL_FAILED` (`false`) ou `ENROLL_PENDING` (`true`).

**Valor Padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.enroll.fingerprints.verify.matchthreshold

Esse parâmetro define a pontuação mínima para considerar uma comparação 1:1 entre digitais um casamento durante uma operação de busca.

**Valor Padrão:**

> `25`

### gbscluster.enroll.fingerprints.verify.anglethreshold

Esse parâmetro define o ângulo a ser considerado quando comparando dois dedos durante uma operação de busca.

**Valor Padrão:**

> `180`

**Range:**

> `0` to `180` (`-1` terá o mesmo efeito que `180`)

### gbscluster.update.faces.verify.matchthreshold

Esse parâmetro define o limiar a ser usado durante a comparação de biometrias faciais em operações de busca. Definir um valor alto para esse parâmetro pode, possivelmente, resultar em um aumento de ocorrências de falsos negativos.

**Valor Padrão:**

> `60`

### gbscluster.enroll.newborn-palmprints.verify.matchthreshold

Esse parâmetro define a pontuação mínima para considerar uma comparação 1:1 de palmares de recém-nascidos um casamento durante uma operação de busca.

**Valor Padrão:**

> `35`

### gbscluster.enroll.fingerprints.ul.anglethreshold

Esse parâmetro define o ângulo a ser considerado quando comparando duas impressões digitais latentes não resolvidas.

**Valor Padrão:**

> `180`

**Range**

> `0` to `180` (`-1` causará o mesmo efeito que `180`)

### gbscluster.update.consider.fingerprints

Esse parâmetro define se digitais devem ser consideradas ao gerar exceções de atualização.

**Valor Padrão:**

> `true`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.update.consider.faces

Esse parâmetro define se imagens de face devem ser consideradas ao gerar exceções de atualização.

**Valor Padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.update.consider.faces.beforeFingerprints

Esse parâmetro define se as faces devem ser analisadas antes das impressões digitais ao gerar exceções de atualização. Se `false`, a análise de face é feita após a análise da impressão digital.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbscluster.update.minimum.fingers

Esse parâmetro define o número mínimo de casamentos entre dedos necessário para uma operação de **atualização** ser aceita.

**Valor Padrão:**

> `4`

### gbscluster.min.quality

Esse parâmetro define a qualidade mínima necessária para uma impressão digital, de modo que não seja gerada uma transação de `ENROLL_PENDING`.

**Valor Padrão:**

> `50`

### gbscluster.update.min.quality

Esse parâmetro define a qualidade mínima necessária para uma impressão digital, de modo que não seja gerada uma transação de `UPDATE_PENDING`.

**Valor Padrão:**

> `50`

### gbds.enroll.fingerprints.min-nr-template

Esse parâmetro define o número mínimo de templates de impressão digital necessário para uma transação ser processada. Se a transação não contiver o número requerido de digitais, ela irá falhar.

**Valor Padrão:**

> `0`

### gbds.enroll.faces.min-nr-template

Esse parâmetro define o número mínimo de templates de face requeridos para a transação ser processada. Se a transação não conter o número requerido de templates, ela ira falhar.

**Valor Padrão:**

> `0`

### gbds.enroll.iris.min-nr-template

Esse parâmetro define o número mínimo de templates de íris requeridos para a transação ser processada. Se a transação não conter o número requerido de templates, ela ira falhar.

**Valor Padrão:**

> `0`

### gbds.enroll.palmprint.min-nr-template

Esse parâmetro define o número mínimo de templates de digitais palmares requeridos para a transação ser processada. Se a transação não conter o número requerido de templates, ela ira falhar.

**Valor Padrão:**

> `0`

### gbds.enroll.newborn-palmprint.min-nr-template

Esse parâmetro define o número mínimo de templates de palmares de recém-nascidos necessário para a transação ser processada. Se a transação não contiver o número requerido de templates, ela irá falhar.

**Valor Padrão:**

> `0`

### gbscluster.update.fingerprints.verify.matchthreshold

Esse parâmetro define a pontuação mínima para considerar uma comparação 1:1 de digitais como um casamento durante uma operação de verificação.

**Valor Padrão:**

> `35`

### gbscluster.update.fingerprints.verify.anglethreshold

Esse parâmetro define o ângulo a ser considerado quando comparando duas impressões digitais durante a operação de verificação.

**Valor Padrão:**

> `180`

**Range:**

> `0` to `180` (`-1` causará o mesmo efeito de `180`)

### gbscluster.enroll.fingerprints.verify.duplicities.matchthreshold

Ao realizar a verificação de qualidade, durante a operação de cadastro, uma comparação entre dedos é executada checando duplicatas na transação.

Esse parâmetro define a pontuação mínima para que uma impressão digital verificada seja considerada duplicada ao realizar a validação entre dedos.

**Valor Padrão:**

> `45`

### gbscluster.enroll.fingerprints.verify.sequencecheck.matchthreshold

Esse parâmetro define o limiar mínimo para uma captura principal ser considerada um casamento contra seu respectivo índice no controle de sequência.

Se a comparação entre os dedos capturados e seus respectivos dedos no controle de sequência (exemplo 4-4-2 ou 2-2-1) retornar pontuação de coincidências acima desse limiar, será considerado um casamento pela checagem de sequência.

**Valor Padrão:**

> `20`

### gbscluster.enroll.fingerprints.verify.sequencecheck.matchthreshold.\<index>

Esse parâmetro define a pontuação mínima para uma captura específica ser considerada um casamento contra seu respectivo índice no controle de sequencial.

Se a comparação entre o dedo definido pelo índice e seu respectivo dedos no controle de sequência (exemplo 4-4-2 ou 2-2-1) retornar pontuação de coincidências acima desse limiar, será considerado um casamento pela checagem de sequência.

{% hint style="info" %}
Essa configuração é opcional e, se não definida, o GBDS usará o valor de limiar global definido em `gbscluster.enroll.fingerprints.verify.sequencecheck.matchthreshold`.
{% endhint %}

{% hint style="info" %}
Essa configuração deve ser repetida no arquivo de configuração para cada dedo individual que se deseja definir um limiar diferente do global.
{% endhint %}

O `<index>` na configuração deve ser mudado de acordo com o dedo desejado. Os valores possíveis são:

> * left\_little
> * left\_ring
> * left\_middle
> * left\_index
> * left\_thumb
> * right\_thumb
> * right\_index
> * right\_middle
> * right\_ring
> * right\_index

{% hint style="warning" %}
O índice deve ter o formato de STRING de acordo com a lista acima. Qualquer outro valor será considerado inválido e descartado.
{% endhint %}

### gbscluster.enroll.fingerprints.identify.sequencecorrection.matchthreshold

Esse parâmetro define a pontuação mínima para a captura principal ser considerada um casamento quando comparando contra todas as outras digitais no controle de sequência.

Essa comparação é realizada depois de ser identificado problemas no controle de sequência para checar se as digitais das capturas principais estão trocadas. Se a digital da captura principal não bater com sua respectiva captura no controle de sequência, o sistema resolverá automaticamente o problema cortando a imagem do controle de sequência e substituindo a captura principal.

O número máximo de correções realizadas é determinado pelo parâmetro \`\`\`gbscluster.enroll.fingerprints.sequencecorrection.maxcorrections`. Se o número de correções for maior que o valor definido, nenhuma correção será feita para o perfil e o status da transação será definido como` PENDING\`.

Esse parâmetro define a pontuação mínima para as capturas roladas serem considerada um casamento quando comparado contra todas as capturas pousadas do controle de sequência.

**Valor Padrão:**

> `20`

### gbscluster.enroll.fingerprints.identify.sequencecorrection.matchthreshold.\<index>

Esse parâmetro define a pontuação mínima para a captura principal ser considerada um casamento quando comparando contra todas as outras digitais no controle de sequência.

Essa comparação é realizada depois de ser identificado problemas no controle de sequência para checar se as digitais das capturas principais estão trocadas. Se a digital da captura principal não bater com sua respectiva captura no controle de sequência, o sistema resolverá automaticamente o problema cortando a imagem do controle de sequência e substituindo a captura principal.

O número máximo de correções realizadas é determinado pelo parâmetro `gbscluster.enroll.fingerprints.sequencecorrection.maxcorrections`. Se o número de correções for maior que o valor definido, nenhuma correção será feita para o perfil e o status da transação será definido como `PENDING`.

{% hint style="info" %} Essa configuração é opcional e, se não definida, o GBDS usará o valor de limiar global definido em `gbscluster.enroll.fingerprints.identify.sequencecorrection.matchthreshold`. {% endhint %}

{% hint style="info" %} Essa configuração deve ser repetida no arquivo de configuração para cada dedo individual que se deseja definir um limiar diferente do global. {% endhint %}

O `<index>` na configuração deve ser mudado de acordo com o dedo desejado. Os valores possíveis são:

> * left\_little
> * left\_ring
> * left\_middle
> * left\_index
> * left\_thumb
> * right\_thumb
> * right\_index
> * right\_middle
> * right\_ring
> * right\_index

{% hint style="warning" %} O índice deve ter o formato de STRING de acordo com a lista acima. Qualquer outro valor será considerado inválido e descartado. {% endhint %}

### gbscluster.enroll.fingerprints.sequencecorrection.maxcorrections

Esse parâmetro define o número máximo de correções automáticas realizadas antes de considerar uma transação como `PENDING` e enviá-la para revisão manual. Se o número de correções requerido for maior que o especificado nesse parâmetro, nenhuma correção será realizada e a transação original será enviada para revisão manual.

**Valor Padrão:**

> `4`

### gbscluster.enroll.fingerprints.sequencecontrol.copy-to-searchable-biometrics

Esse parâmetro define se as imagens do controle de sequência devem ser cortadas para cadastros onde não há nenhuma imagem de impressões digitais individuais disponível.

**Valor Padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.fingerprints.extraction.cab.enabled (descontinuada)

{% hint style="warning" %} Esta configuração foi descontinuada a partir da versão 4.7.0. Consulte as configurações que a substituem: `gbscluster.fingerprints.extraction.enroll.type` e `gbscluster.fingerprints.extraction.verify.type`. {% endhint %}

Esse parâmetro define se o CAB deve ser extraído para novas biometrias.

**Valor Padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.fingerprints.extraction.fnet.enabled (descontinuada)

{% hint style="warning" %} Esta configuração foi descontinuada a partir da versão 4.7.0. Consulte as configurações que a substituem: `gbscluster.fingerprints.extraction.enroll.type` e `gbscluster.fingerprints.extraction.verify.type`. {% endhint %}

**Valor Padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.fingerprints.extraction.enroll.type

Esse parâmetro define o preset de extrator da ginger a ser usado para Cadastro e Atualização.

**Valor Padrão:**

> `GRIAULE_2024`

**Valores possíveis:**

> * `GRIAULE_FAST`: versão mais simples e rápida do GRIAULE\_BASIC (nunca usado na API).
> * `GRIAULE_BASIC`: antigo "*…cab.enabled = false*", extração padrão para Verificação.
> * `GRIAULE_2020`: antigo "*…cab.enabled = true*", antiga extração padrão para Cadastro, Atualização.
> * `GRIAULE_2024`: nova extração padrão para Cadastro, Atualização.
> * `GRIAULE_2018`: antigo "*…fnet.enabled = true*".

### gbscluster.fingerprints.extraction.verify.type

Esse parâmetro define o preset de extrator da ginger a ser usado para Verificação.

**Valor Padrão:**

> `GRIAULE_BASIC`

**Valores possíveis:**

> * `GRIAULE_FAST`: versão mais simples e rápida do GRIAULE\_BASIC (nunca usado na API).
> * `GRIAULE_BASIC`: antigo "*…cab.enabled = false*", extração padrão para Verificação.
> * `GRIAULE_2020`: antigo "*…cab.enabled = true*", antiga extração padrão para Cadastro, Atualização.
> * `GRIAULE_2024`: nova extração padrão para Cadastro, Atualização.
> * `GRIAULE_2018`: antigo "*…fnet.enabled = true*".

### gbds.rdb.driverClassName

Esse parâmetro define o nome de classe usado pelo banco de dados relacional para armazenar latentes não resolvidas.

**Valor Padrão:**

> `com.mysql.jdbc.Driver`

### gbds.rdb.url

Esse parâmetro define a URL do banco de dados relacional que será acessada.

**Valor Padrão:**

> `jdbc:mysql://<address>:<port>/gbds`

### gbds.rdb.username

Esse parâmetro define o nome de usuário a ser usado para acesso ao banco de dados relacional.

**Valor Padrão:**

> `root`

### gbds.rdb.password

Esse parâmetro define a senha a ser usada para acesso ao banco de dados relacional.

**Valor Padrão:**

> Vazio

### gbds.rdb.dialect

Esse parâmetro define o dialeto a ser usado no banco de dados relacional.

**Valor Padrão:**

> `org.hibernate.dialect.MySQLDialect`

### gbds.rdb.showSql

Esse parâmetro define se as declarações do SQL devem ser incluídas nos logs da aplicação.

**Valor Padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

### gbds.biometric.best-of-biometrics.enabled

Esse parâmetro habilita o best-of-biometrics. Quando habilitado, o conjunto de biometrias da pessoa é a consolidação das melhores biometrias obtidas de todas as transações da pessoa ao longo do tempo.

{% hint style="warning" %} Essa flag **DEVE** ter o mesmo valor nas configurações do GBDS e da API do GBDS. {% endhint %}

**Valor Padrão:**

> `false`

### gbds.biometric.face.template.format

Define o formato do template para face.

Os valores possíveis são: `TPT_FORMAT_1` ou `TPT_FORMAT_2`.

{% hint style="warning" %} Os formatos de face não são intercambiáveis. Faces que tiveram enroll feito em um formato não darão match com faces feitas em outro formato. {% endhint %}

{% hint style="danger" %} O valor dessa configuração deve ser o mesmo nos arquivos `application.conf` e `gbdsapi.properties` {% endhint %}

### gbds.peopleList.countFromRDB

Este parâmetro define o comportamento da paginação na chamada da API `people/list`. Definir como `true`, a lista de pessoas sempre contará o total de pessoas usando o filtro de restrição passado. Em grandes bancos de dados pode comprometer o desempenho. Definir como `false` restringirá a resposta apenas aos valores count, pageSize e currentPage.

**Valor Padrão:**

> `true`

### gbds.person.canDeleteOnException

Este parâmetro permite a exclusão de pessoas em exceção. É válido tanto para a referência como para a pessoa entrante.

**Valor Padrão:**

> `false`

### gbds.searches.verify.saveOnRdb.enabled

Define se a operação de verificação será salva na tabela `gbds.transaction` do RDB.

**Valor Padrão:**

> `true`

{% hint style="danger" %} Esse valor deve ser o mesmo no `application.conf` e no `gbdsapi.properties` {% endhint %}

### gbds.searches.identify.saveOnRdb.enabled

Define se a operação de identificação será salva na tabela `gbds.transaction` do RDB.

**Valor Padrão:**

> `true`

{% hint style="danger" %} Esse valor deve ser o mesmo no `application.conf` e no `gbdsapi.properties` {% endhint %}

### gbds.template.face.multiplicity

Define se o GBDS irá utilizar somente um formato de template de face, ou novo e antigo simultaneamente.

**Valor Padrão:**

> `ONLY_NEWEST`

**Valores Possíveis:**

> * `ONLY_NEWEST` - GBDS irá usar somente o mais novo formato de template.
> * `MULTIPLE` - GBDS irá usar tanto o antigo como o novo formato de template.

### gbds.search.verify.adjust-resolution

Quando essa configuração está ativada, verificações e atualizações na API e a verificação pós-match no GBDS ajustarão a resolução realizando uma verificação de correspondência, diminuindo a pontuação em dedos e palmas.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.update.exception.reextract

Esse parâmetro determina a reextração em atualizações que gerariam exceções. Apenas biometrias sem correspondência são reextraídas do entrante e referência, mas se a configuração para salvar a reextração (*gbds.update.exception.reextract.save*) for `true`, todas as biometrias de impressão digital são reextraídas. Antes da reextração da referência, a API verificará se os templates de referência já foram extraídos com o extrator escolhido. Se sim, a reextração não é realizada.

**Valor Padrão:**

> `NONE`

**Valores Possíveis:**

> * `NONE`, não reextrair.
> * `REGULAR`, usar o extrator atual na referência (extrator configurado atualmente).
> * `GRIAULE_2018`, usar GRIAULE\_2018 para reextrair entrante e referência.

### gbds.update.exception.reextract.save

Este parâmetro permite salvar no HBase transaction e people as reextrações de biometrias de consulta e referência. Se `true`, salva os modelos completos na transaction e os master record templates na people, não envia os modelos para o GBDS (não há novo TGUID para processar). Na transaction do RDB, a coluna `ginger_extractor_type` é atualizada na referência e na consulta e `extraction_time` é atualizada na consulta (soma a referência e o tempo de extração da consulta).

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

## Microsserviço de Extração de Templates

### gbds.extraction.service

Este parâmetro habilita o microsserviço de extração. Se este parâmetro for definido como `false`, o GBDS usará o serviço de extração integrado.

**Valor Padrão:**

> `true`

### gbds.extraction.service.face.count

Esse parâmetro define quantas instâncias de microsserviço de extração de face estarão disponíveis.

**Valor Padrão:**

> `1`

### gbds.extraction.service.ginger.count

Esse parâmetro define quantas instâncias de microsserviço de extração de impressões digitais, palmares, palmares de recém-nascido e controle de sequência estarão disponíveis.

**Valor Padrão:**

> `5`

### gbds.extraction.service.girl.count

Esse parâmetro define quantas instâncias de microsserviço de extração de íris estarão disponíveis.

**Valor Padrão:**

> `1`

### gbds.extraction.service.hostname

Esse parâmetro define o hostname do microsserviço de extração. Se for especificado como `localhost`, a API assumirá o controle da ativação/desativação dos serviços. Se outro nome de host for definido, a ativação/desativação deverá ser feita manualmente.

**Valor Padrão:**

> `localhost`

### gbds.extraction.service.initialPort

Esse parâmetro define o número da porta inicial para os microsserviços de extração. Cada instância do microsserviço aumentará sua porta em 1. Isso significa que a primeira instância de microsserviço habilitada terá uma porta com o número definido, a segunda o número+1, a terceira o número+2 e sucessivamente.

**Valor Padrão:**

> `30000`

### gbds.extraction.service.logLevel

Esse parâmetro define o nível de log do microsserviço de extração. `INFO` registrará as saídas dos scripts no log da API. `DEBUG` registrará as saídas dos scripts e o log do extrator diretamente no log da API.

**Valor Padrão:**

> `INFO`

**Valores Possíveis:**

> * `INFO`
> * `DEBUG`

### gbds.extraction.service.timeout

Esse parâmetro define o timeout para o microsserviço de extração em segundos.

**Valor Padrão:**

> `60`

### gbds.extraction.service.maxTries

Este parâmetro define o número máximo de tentativas de extração que o GBDS executará na mesma transação antes de retornar um erro.

**Valor Padrão:**

> `3`

### gbds.extraction.service.linkLibSegfault

Este parâmetro habilita o rastreamento de falhas de segmentação no serviço de extração.

**Valor Padrão:**

> `false`

### gbds.extraction.service.checkTimeoutSecs

Timeout (em segundo) para verificar se o microsserviço de extração de templates foi criado.

**Valor Padrão:**

> `10`

### api.uniqueId

Este parâmetro define o ID da API e é **OPCIONAL**. É usado para iniciar manualmente um microsserviço de extração e identificar qual microsserviço está vinculado a qual API. O valor pode ser qualquer valor de string sem espaços em branco ou caracteres especiais.

## Serviço de Extração de Qualidade

### gbds.extraction.quality.service

Esse parâmetro habilita o serviço de extração de qualidade.

**Valor Padrão:**

> `true`

### gbds.extraction.quality.api.uniqueId

Este parâmetro define o ID da API e é **OPCIONAL**. É usado para iniciar manualmente o serviço de extração de qualidade e identificar qual serviço está vinculado a qual API. O valor pode ser qualquer valor de string sem espaços em branco ou caracteres especiais.

{% hint style="warning" %} Se você estiver utilizando múltiplas APIs, atente-se para a configuração [gbds.extraction.quality.api.uniqueId.list](#gbdsextractionqualityapiuniqueidlist) {% endhint %}

#### gbds.extraction.quality.api.uniqueId.list

Essa configuração define os IDs das APIs que processarão a extração de qualidade em segundo plano. Existem duas maneiras de definir os ids:

* Separados por vírgulas, com o líder primeiro, todos os outros ids são definidos como runners.
* Json

```json
[
    {
        "apiId":"<api_id>",
        "type":"LEADER|RUNNER"
    }
]
```

`api_id` é **SEMPRE** obrigatório e não pode estar vazio, enquanto `type` é opcional.

{% hint style="warning" %} Apenas um LÍDER (leader) pode ser definido. {% endhint %}

Essa configuração não altera nenhum outro comportamento do serviço de extração de qualidade.

### gbds.extraction.quality.fillTransactionQualityPropertiesTable

Esse parâmetro define se as propriedades de qualidade (Valor do NFIQ, número de minúcias, tamanho de imagem, etc.) extraídos pelo serviço de extração de qualidade devem ser guardados na tabela `gbds.transaction_quality_properties`.

{% hint style="warning" %} Habilitar esse parâmetro pode aumentar drasticamente o requerimento de espaço do RDB {% endhint %}

**Valor Padrão:**

> `false`

### gbds.extraction.quality.service.linkLibSegfault

Este parâmetro habilita o rastreamento de falhas de segmentação no serviço de extração de qualidade.

**Valor Padrão:**

> `false`

### gbds.extraction.quality.service.rows-on-select

Este parâmetro determina o tamanho do bloco de transações a ser enviado à thread pool para extração de qualidade.

**Valor Padrão:**

> `20`

### gbds.extraction.quality.service.submitted-queue-factor

Este parâmetro determina o fator a ser multiplicado pelo tamanho da thread pool para determinar o tamanho médio da fila de processamento.

**Valor Padrão:**

> `3`

### gbds.faces.extraction.quality.api

Este parâmetro habilita o serviço de extração de qualidade de face em cadastros e atualizações por meio da chamada de API.

**Valor Padrão:**

> `true`

### gbds.enroll.face.min.quality

Define o limiar mínimo de qualidade para uma imagem de face ser aceita em uma operação de enroll.

**Valor Padrão:**

> `50`

### gbds.update.face.min.quality

Define o limiar mínimo de qualidade para uma imagem de face ser aceita em uma operação de update.

**Valor Padrão:**

> `50`

### gbds.faces.extraction.quality.background

Este parâmetro habilita o serviço de extração de qualidade de face em segundo plano. Quando habilitado, o extrator irá olhar a tabela `gbds.transaction` onde as linhas `finger_quality_extracted` tiverem o valor `false`, e, a partir do tguid da transação, pegará o template do HBase com o mesmo tguid e realizará a extração de qualidade nesse template.

{% hint style="info" %} Habilitar esse parâmetro **NÃO** habilita a extração de qualidade via chamada de API {% endhint %}

**Valor Padrão:**

> `false`

### gbds.fingerprints.extraction.quality.api

Este parâmetro habilita o serviço de extração de qualidade de impressões digitais em cadastros e atualizações por meio da chamada de API.

**Valor Padrão:**

> `true`

### gbds.fingerprints.extraction.quality.background

Este parâmetro habilita o serviço de extração de qualidade de impressões digitais em segundo plano. Quando habilitado, o extrator irá olhar a tabela `gbds.transaction` onde as linhas `finger_quality_extracted` tiverem o valor `false`, e, a partir do tguid da transação, pegará o template do HBase com o mesmo tguid e realizará a extração de qualidade nesse template.

{% hint style="info" %} Habilitar esse parâmetro **NÃO** habilita a extração de qualidade via chamada de API {% endhint %}

**Valor Padrão:**

> `false`

### gbds.extraction.quality.service.finger.count

Este parâmetro define quantas instâncias de serviços de extração de qualidade de impressões digitais estarão disponíveis.

**Valor Padrão:**

> `1`

### gbds.extraction.quality.service.face.count

Este parâmetro define quantas instâncias de serviços de extração de qualidade de faces estarão disponíveis.

**Valor Padrão:**

> `1`

### gbds.extraction.quality.service.initialPort

Esse parâmetro define o número da porta inicial para o serviço de extração de qualidade. Cada instância do serviço aumentará sua porta em 1. Isso significa que a primeira instância do serviço habilitada terá uma porta com o número definido, a segunda o número+1, a terceira o número+2 e sucessivamente.

**Valor Padrão:**

> `31000`

### gbds.extraction.quality.service.logLevel

Esse parâmetro define o nível de log do serviço de extração de qualidade. `INFO` registrará as saídas dos scripts no log da API. `DEBUG` registrará as saídas dos scripts e o log do extrator diretamente no log da API.

**Valor Padrão:**

> `INFO`

**Valores Possíveis:**

> * `INFO`
> * `DEBUG`

### gbds.extraction.quality.service.timeout

Esse parâmetro define o timeout para o serviço de extração de qualidade em segundos.

**Valor Padrão:**

> `60`

### gbds.extraction.quality.service.hostname

Esse parâmetro define o hostname do serviço de extração de qualidade. Se for especificado como `localhost`, a API assumirá o controle da ativação/desativação dos serviços. Se outro nome de host for definido, a ativação/desativação deverá ser feita manualmente.

**Valor Padrão:**

> `localhost`

### gbds.extraction.quality.service.maxTries

Este parâmetro define o número máximo de tentativas de extração que o GBDS executará na mesma transação antes de retornar um erro.

**Valor Padrão:**

> `3`

### gbds.extraction.quality.service.checkTimeoutSecs

Timeout (em segundos) para verificar se o microsserviço de extração de qualidade foi criado.

**Valor Padrão:**

> `10`

## Base Biográfica Externa

### gbds.biographicBase.enabled

Flag para ligar/desligar o acesso ao servidor Biobase. Quando desligado, `biographicBaseStatus` não é retornado nas chamadas de get/list transaction/person.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biographicBase.endpoints

Lista separada por vírgulas com todos os URLs do servidor Biobase, com host e porta.

**Valor Padrão:**

> Vazio

**Valores Possíveis:**

`http://biobase-server-ip:8130,http://biobase-server-ip:8131`

### gbds.biographicBase.get.timeout.ms

Timeout de requisições `get` do servidor Biobase. É usado em chamadas de API `get transaction` ou `get person`.

**Valor Padrão:**

> `500`

### gbds.biographicBase.list.timeout.ms

Timeout de requisições `list` do servidor Biobase. É usado em chamadas de API `list transaction` ou `list people`. Nas chamadas `list`, o Biobase Server é chamado apenas uma vez para todas as transações/pessoas que serão retornadas.

**Valor Padrão:**

> `500`

### gbds.biographicBase.logLevel

Nível de log nas chamadas ao servidor Biobase.

**Valor Padrão:**

> `INFO`

**Valores Possíveis:**

> * `INFO`: registra a URL de solicitação do servidor.
> * `NONE`: nenhum log de solicitação do servidor.
> * `TIME`: registra a URL de solicitação do servidor e o tempo decorrido.
> * `DEBUG`: registra a URL de solicitação do servidor, o tempo decorrido e os corpos de solicitação/resposta.

### gbds.biographicBase.clientID

ID do cliente de autenticação.

**Valor Padrão:**

> Vazio

### gbds.biographicBase.clientSecret

Senha do cliente de autenticação.

**Valor Padrão:**

> Vazio

### gbds.biographicBase.lookAllServers

Flag para procurar em todos os servidores em casos de não autorização ou pessoas não encontradas.

* Para autorização:
  * Quando estiver LIGADO e um Servidor Biobase retornar não autorizado, a API irá procurar todos os outros servidores tentando se autenticar.
  * Quando estiver DESLIGADO, a API irá procurar apenas o Servidor Biobase atual para autenticação, retornando não autorizado ou autorizado.
* Para pessoas não encontradas:
  * Quando estiver LIGADO e a chamada do Servidor Biobase não retornar todas as pessoas, a API tentará todos os outros servidores até que todas as pessoas sejam encontradas. Se a lista de pessoas consolidada de todos os servidores ainda estiver incompleta, mesmo depois de passar por todos os servidores, ela será deixada como está.
  * Quando estiver DESLIGADO, a API irá olhar apenas para o servidor Biobase atual para todas as pessoas na solicitação. Mesmo que uma pessoa ainda não esteja na lista de pessoas, a lista é deixada como está.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biographicBase.autoUpdate

Envia dados biográficos para a BioBase ao cadastrar/atualizar/trusted.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biographicBase.sendPguidAsKey

Envia PGUID como chave em qualquer atualização da BioBase.

**Valor Padrão:**

> `true`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.biographicBase.sendTguidAsKey

Envia TGUID como chave em qualquer atualização da BioBase.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

## Configuração do Serializador de Templates

Essa seção descreve os parâmetros de configuração relacionados ao serializador de templates. Esses parâmetros de configuração são projetador para permitir o uso do *GBDS Batch Extractor*.

{% hint style="info" %} Veja o manual do *GBDS Batch Extractor* para informações adicionais sobre seu uso. {% endhint %}

Sempre que o GBDS realizar uma operação de *cold boot*, ele tentará recuperar os templates de uma família de colunas padrão. Se o template não existir nessa coluna, o GBDS tentará recuperá-lo da família de colunas de reserva.

Os parâmetros de configuração do serializador são:

### Família de Colunas Padrão

Esses parâmetros são divididos por modalidades biométricas. Os templates nessa família de colunas não possuem codificação e o formato usado é de *byteArray*.

```properties
gbds.hbase.templates.fingerprint.cf.name
gbds.hbase.templates.palmprint.cf.name
gbds.hbase.templates.face.cf.name
gbds.hbase.templates.iris.cf.name
gbds.hbase.templates.newborn-palmprint.cf.name
```

O valor padrão para esses parâmetros é `tpt`.

### Família de Colunas Reserva

Esses parâmetros referem-se às famílias de colunas anteriormente usadas para armazenar os templates biométricos. São separados por modalidade biométrica.

```properties
gbds.hbase.templates.fallback.fingerprint.cf.name
gbds.hbase.templates.fallback.palmprint.cf.name
gbds.hbase.templates.fallback.face.cf.name
gbds.hbase.templates.fallback.iris.cf.name
gbds.hbase.templates.fallback.newborn-palmprint.cf.name
```

Os valores padrão representam as famílias de colunas usadas antes da mudança desses parâmetros, e são, respectivamente: `fingerprints`, `palmprints`, `faces`, e `iris`.

### Codificação Reserva em *base64*

A família de colunas reserva suporta codificação. Os parâmetros a seguir definem se a família de colunas é codificada em *base64*:

```properties
gbds.hbase.templates.fallback.fingerprint.cf.is-base64-encoded
gbds.hbase.templates.fallback.palmprint.cf.is-base64-encoded
gbds.hbase.templates.fallback.face.cf.is-base64-encoded
gbds.hbase.templates.fallback.iris.cf.is-base64-encoded
gbds.hbase.templates.fallback.newborn-palmprint.cf.is-base64-encoded
```

O valor padrão para esses parâmetros é `true`.

## Configurações de Notificação de Email

### gbds.transparency.search.identify.send-email.enabled

Esse parâmetro habilita o serviço de notificação de email. Quando *true*, toda busca de identificação de face enviará um email com a imagem solicitada para usuários ou grupos determinados.

**Valor Padrão:**

> `false`

**Valores Possíveis:**

> * `true`
> * `false`

### gbds.transparency.email-notifier.log-level

Esse parâmetro define o nível de log do serviço de notificação de email.

**Valor Padrão:**

> `INFO`

**Valores Possíveis:**

> * `INFO`
> * `TIME`
> * `NONE`
> * `DEBUG`.

### gbds.transparency.email-notifier.timeout

Esse parâmetro define o *timeout* em segundos do serviço de notificação de email.

**Valor Padrão:**

> `60`

### gbds.transparency.email-notifier.url

Esse parâmetro define a URL do serviço de notificação de email.

### gbds.transparency.search.identify.request.notify.enabled

Este parâmetro permite que o serviço de notificação por email envie a notificação para solicitação de pesquisa de identificação facial.

**Valor Padrão:**

> `false`

### gbds.transparency.search.identify.result.actions.enabled

Esse parâmetro permite que o serviço de notificação por email processe a ação definida para uma pessoa por meio das tabelas de transparência quando a pessoa aparecer nos resultados da pesquisa.

**Valor Padrão:**

> `false`

### gbds.transparency.search.identify.result.notify.enabled

Esse parâmetro permite que o serviço de notificação por email envie mensagens quando os resultados da pesquisa corresponderem às pessoas de interesse.

**Valor Padrão:**

> `false`


# Configuração de Migração

## Arquivo de Configuração

Os parâmetros de configuração da migração do GBDS são definidos em um arquivo de configuração, contendo todos os parâmetros e seus respectivos valores. Os parâmetros omitidos assumem seus valores padrão. Esta seção descreve as propriedades do arquivo de configuração.

### Localização do arquivo

O arquivo de configuração é `/etc/griaule/conf/gbds-migration/gbds-migration.properties`.

### Propriedades do arquivo

O arquivo de configuração deve atender a alguns requisitos para ser interpretado corretamente pelo GBDS. Esses requisitos são:

1. O nome e o local do arquivo devem ser exatamente como mencionados;
2. Deve haver exatamente um parâmetro de configuração por linha;
3. Cada parâmetro de configuração deve estar no formato `<parameter>=<value>`, sem quebras de linha;
4. Cada valor deve ser separado por uma vírgula quando atribuído a um único parâmetro.

## Parâmetros de configuração

Esta seção descreve cada parâmetro de configuração de migração do GBDS que pode ser listado no arquivo de configuração e como eles afetam a operação do sistema.

### Geral

#### **gbscluster.zookeeper.quorum**

Define o nome do host e a porta pelos quais os servidores do Zookeeper podem ser encontrados. Cada valor deve ser separado por vírgulas se houver mais de um disponível.

**Valor padrão:**

> `<hostname>:<port>`

### Conexão RDB

#### gbds.rbd.driverClassName

Define o nome da classe para o banco de dados relacional a ser usado para armazenar latentes não resolvidos.

**Valor padrão:**

> `com.mysql.jdbc.Driver`

#### gbds.rdb.url

Define a URL do banco de dados relacional a ser acessado.

**Valor padrão:**

> `jdbc:mysql://<hostname>:3306/gbds?useSSL=false&allowPublicKeyRetrieval=true`

#### gbds.rdb.username

Define o nome de usuário a ser usado para acessar o banco de dados relacional.

**Valor padrão:**

> `<rdb-username>`

#### **gbds.rdb.password**

Define a senha a ser usada para acessar o banco de dados relacional.

**Valor padrão:**

> `<rdb-base64-password>`

#### gbds.rdb.dialect

Define o dialeto a ser usado no banco de dados relacional.

**Valor padrão:**

> `org.hibernate.dialect.MySQLDialect`

#### gbds.rdb.showSql

Define se as instruções SQL devem ser incluídas nos logs do aplicativo.

**Valor padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

#### gbds.rdb.maxPoolSize

Número máximo de conexões que um pool manterá a qualquer momento.

**Valor padrão:**

> `100`

#### gbds.rdb.minPoolSize

Número mínimo de conexões que um pool manterá em um determinado momento.

**Valor padrão:**

> `1`

#### gbds.rdb.initialPoolSize

Número de conexões que um pool tentará adquirir na inicialização. Este valor deve estar no intervalo de gbds.rdb.minPoolSize a gbds.rdb.maxPoolSize.

**Valor padrão:**

> `2`

#### gbds.rdb.maxStatments

Define o tamanho do cache global PreparedStatement do c3p0. Se `gbds.rdb.maxStatments`for zero, o cache de instruções não será habilitado.

Este parâmetro controla o número total de instruções armazenadas em cache para todas as conexões. Se definido, deve ser um número bastante grande, pois cada conexão agrupada requer seu próprio conjunto distinto de instruções armazenadas em cache. Como guia, considere quantos PreparedStatements distintos são usados ​​com frequência em sua aplicação e multiplique esse número por `gbds.rdb.maxPoolSize`para chegar a um valor apropriado.

**Valor padrão:**

> `0`

#### gbds.rdb.maxIdleTime

Define, em segundos, o tempo que uma conexão pode permanecer em pool, mas sem uso, antes de ser descartada. Zero significa que conexões ociosas nunca expiram.

**Valor padrão:**

> `1800`

#### gbds.rdb.maxConnectionAge

Define, em segundos, o tempo máximo de vida de uma conexão. Uma conexão com mais de 10 anos `gbds.rdb.maxConnectionAge`será destruída e removida do pool. Isso difere de 10 anos, `gbds.rdb.maxIdleTime`pois se refere à idade absoluta. Mesmo uma conexão que não tenha ficado muito tempo ociosa será removida do pool se exceder 10 anos `gbds.rdb.maxConnectionAge`. Zero significa que não há idade absoluta máxima aplicada.

**Valor padrão:**

> `1800`

#### gbds.rdb.statementCacheNumDeferredCloseThreads

Se definido como um valor maior que 0, o cache de instruções rastreará quando as Conexões estiverem em uso e destruirá as Instruções somente quando suas Conexões pai não estiverem em uso. Embora o fechamento de uma Instrução enquanto a Conexão pai estiver em uso esteja formalmente dentro das especificações, alguns bancos de dados e/ou drivers JDBC, principalmente o Oracle, não lidam bem com esse caso e congelam, levando a deadlocks. Definir este parâmetro como um valor positivo deve eliminar o problema. Este parâmetro só deve ser definido se você observar que as tentativas do c3p0 de fechar() as instruções em cache congelam (geralmente, você verá APPARENT DEADLOCKS nos seus logs). Se definido, este parâmetro quase sempre deve ser definido como 1.

**Valor padrão:**

> `1`

#### gbds.rdb.acquireIncrement

Determina quantas conexões por vez o c3p0 tentará adquirir quando o pool estiver esgotado.

**Valor padrão:**

> `10`

#### gbds.rdb.testConnectionOnCheckout

Se verdadeiro, uma operação será executada em cada verificação de conexão para verificar se a conexão é válida. Testar conexões na verificação é a forma mais simples e confiável de testar conexões, mas para melhor desempenho, considere verificar as conexões periodicamente usando `gbds.rdb.idleConnectionTestPeriod`.

**Valor padrão:**

> `false`

#### gbds.rdb.testConnectionOnCheckin

Se verdadeiro, uma operação será executada de forma assíncrona em cada verificação de conexão para verificar se a conexão é válida. Use em combinação com `gbds.rdb.idleConnectionTestPeriod`para testes de conexão bastante confiáveis ​​e sempre assíncronos.

**Valor padrão:**

> `true`

**Valores possíveis:**

> * `true`
> * `false`

#### **gbds.rdb.acquireRetryAttempts**

Define quantas vezes c3p0 tentará obter uma nova conexão do banco de dados antes de desistir. Se este valor for menor ou igual a zero, c3p0 continuará tentando obter uma conexão indefinidamente.

**Valor padrão:**

> `10`

#### gbds.rdb.idleConnectionTestPeriod

Se este for um número maior que 0, o c3p0 testará todas as conexões ociosas, agrupadas, mas não verificadas, a cada este número de segundos.

**Valor padrão:**

> `30`

## Famílias de colunas HBase <a href="#hbase-column-families" id="hbase-column-families"></a>

### **Família de colunas padrão**

Esses parâmetros são divididos por modalidade biométrica. São famílias de colunas usadas para operações de leitura de modelos.

```
gbds.hbase.templates.fingerprint.cf.name
gbds.hbase.templates.palmprint.cf.name
gbds.hbase.templates.face.cf.name
gbds.hbase.templates.iris.cf.name
gbds.hbase.templates.newborn-palmprint.cf.name
```

O valor padrão para esses parâmetros é `tpts`.

### **Família de colunas de fallback**

Esses parâmetros referem-se à família de colunas usada anteriormente para armazenar os modelos biométricos, separados por modalidade biométrica.

```
gbds.hbase.templates.fallback.fingerprint.cf.name
gbds.hbase.templates.fallback.palmprint.cf.name
gbds.hbase.templates.fallback.face.cf.name
gbds.hbase.templates.fallback.iris.cf.name
gbds.hbase.templates.fallback.newborn-palmprint.cf.name
```

Os valores padrão representam a família de colunas usada antes de alterar esses parâmetros e são, respectivamente: `fingerprints`, `palmprints`, `faces`, `iris`, `newborn-palmprints`.

## Reextrator GBDS

### Geral

#### **gbds.reextract.nodeNumber**

Número de nós executando o Reextrator. Ele determina o intervalo de varredura no HBase com base no total de nós.

**Valor padrão:**

> `1`

**Valor mínimo:**

> `1`

**Valor máximo:**

> Valor de`gbds.reextract.totalNodes`

#### **gbds.reextract.totalNodes**

Total de nós executando o Reextractor.

**Valor padrão:**

> `1`

#### **gbds.reextract.totalScanRegions**

Número total de regiões para interromper as varreduras.

**Valor padrão:**

> `256`(regiões 00-FF)

#### **gbds.reextract.scanners.number**

Número de scanners. Um scanner digitaliza a partir do HBase um intervalo baseado em `gbds.reextract.nodeNumber`, `gbds.reextract.totalNodes`, e `gbds.reextract.totalScanRegions`.

**Valor padrão:**

> `5`

#### **gbds.reextract.workers.number**

Número de trabalhadores. Um trabalhador mantém uma extração de modelo de transação.

**Valor padrão:**

> `5`

#### **gbds.reextract.writers.number**

Número de escritores. Um escritor obtém o resultado da extração e grava novamente na transação e nas pessoas, se necessário.

**Valor padrão:**

> `5`

#### **gbds.reextract.range**

Configuração de alcance externo. Limita o alcance automático.

* O intervalo pode ser um hexadecimal de 2 caracteres (como `00`ou `A3`) ou um intervalo hexadecimal de 2 caracteres (como `00-01`ou `4A-50`).
* Sempre 2 caracteres hexadecimais.
* Se ausente, o GBS Reextractor executará a partição automática como de costume.

#### **gbds.reextract.validate.extraction**

Sinalizador para validar modelos reextraídos criados anteriormente.

* Em cada transação:
  * Quando selecionado para extrair, o GBS Reextractor não o validará.
  * Quando ele foi extraído antes, mas não validado, o GBS Reextractor o validará.
  * Quando for extraído e validado, o GBS Reextractor o ignorará.
  * A validação é salva no HBase na coluna `transaction:<cf>-validated`.
* **Para garantir que uma transação seja validada em uma chamada após a extração, lembre-se de apagar o arquivo SQLite ou configurar** `gbds.reextract.sqlite.resetOnStart=true` . **Caso contrário, todo o intervalo ao qual a transação pertence será ignorado.**

Dessa forma, a reextração e a validação podem ser feitas em diferentes chamadas do GBS Reextractor, dando tempo para o HBase gravar e consolidar modelos na `transactions`tabela.

**Valor padrão:**

> `true`

**Valores possíveis:**

> * `true`
> * `false`

### Fila de Pipeline

#### **gbds.reextract.workers.inqueueMaxSize**

Tamanho da fila do scanner para o worker. Quanto maior o tamanho, mais varreduras são realizadas e mantidas nos workers, mas mais memória é alocada.

**Valor padrão:**

> `100`

#### **gbds.reextract.writers.inqueueMaxSize**

Tamanho da fila do trabalhador para o escritor. Quanto maior o tamanho, mais varreduras são realizadas e mantidas nos escritores, mas mais memória é alocada.

**Valor padrão:**

> `100`

### Modalidade para Reextrair Flags

#### **gbds.reextract.modality.finger**

Determina se os dedos devem ser reextraídos.

**Valor padrão:**

> `true`

**Valores possíveis:**

> * `true`
> * `false`

#### **gbds.reextract.modality.face**

Determina se os rostos devem ser reextraídos.

**Valor padrão:**

> `true`

**Valores possíveis:**

> * `true`
> * `false`

#### **gbds.reextract.modality.palm**

Determina se as palmas devem ser reextraídas.

**Valor padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

#### **gbds.reextract.modality.iris**

Determina se as íris devem ser reextraídas.

**Valor padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

#### **gbds.reextract.modality.newborn-palm**

Determina se as palmas das mãos dos recém-nascidos devem ser reextraídas.

**Valor padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

### Microsserviços de extração de modelos

#### **gbds.reextract.msextraction.ginger.number**

Define quantas instâncias de microsserviços de extração de impressão digital, impressão palmar, recém-nascido e modelo de controle de sequência estarão disponíveis. Se esta configuração for definida como `0`, os microsserviços de extração para essas modalidades não serão iniciados.

**Valor padrão:**

> `10`(múltiplos de 10 recomendados)

#### **gbds.reextract.msextraction.face.number**

Define quantas instâncias de microsserviços de extração de modelo facial estarão disponíveis. Se esta configuração estiver definida como `0`, os microsserviços de extração para esta modalidade não serão iniciados.

**Valor padrão:**

> `1`(10 vezes menos do que `gbds.reextract.msextraction.ginger.number`o recomendado)

#### **gbds.reextract.msextraction.initialPort**

Este parâmetro define o número da porta inicial para os microsserviços de extração de modelo.

Cada instância de microsserviço aumentará seu número de porta em 1. Por exemplo, considerando a porta padrão `6000`, a primeira instância usará a porta `6000`, a segunda usará a porta `6001`, a terceira, `6002`e assim por diante.

{% hint style="info" %}
Não entre em conflito com portas de microsserviços de extração de modelo de API (mais de 30.000), portas de microsserviços de extração de qualidade (31.000) e portas de microsserviços de correspondência GBDS (32.000).
{% endhint %}

{% hint style="info" %}
Certifique-se de permitir as portas de firewall que o microsserviço usará.
{% endhint %}

**Valor padrão:**

> `6000`

#### **gbds.reextract.msextraction.maxTries**

Define o número máximo de tentativas de extração que o GBDS realizará em uma única característica biométrica antes de retornar um erro.

**Valor padrão:**

> `3`

#### **gbds.reextract.msextraction.linkLibSegfault**

Liga/desliga o depurador de biblioteca de falhas de segmentação no microsserviço de extração

**Valor padrão:**

> `true`

#### **gbds.reextract.msextraction.checkTimeoutSecs**

Tempo limite em segundos para verificar se o microsserviço de extração de modelo está ativo.

**Valor padrão:**

> `30`

#### **gbds.reextract.msextraction.logLevel**

Nível de log do microsserviço de extração de modelo.

**Valor padrão:**

> `INFO`

**Valores possíveis:**

> * `INFO`
> * `TIME`
> * `DEBUG`

#### **gbds.reextract.msextraction.timeout**

Tempo limite em segundos para chamada única ao microsserviço de extração de modelo.

**Valor padrão:**

> `60`

#### **gbds.reextract.msextraction.fingerprints.extractor.type**

Este parâmetro define o tipo de predefinição do extrator ginger a ser usado pela Migração GBDS no modo `--reextract`, também conhecido como Reextrator GBDS. O Reextrator salvará no HBase e no RDB o tipo de extrator ginger que foi usado da mesma forma que a API faz, na `transactions`coluna HBase `<cf>:ginger-extractor-type`e na `transactions`coluna RDB `ginger_extractor_type`.

**Valor padrão:**

> `GRIAULE_2024`

**Valores possíveis:**

> * `GRIAULE_FAST`: uma versão mais simples e rápida do GRIAULE\_BASIC (nunca usada na API).
> * `GRIAULE_BASIC`: extração padrão para Verify.
> * `GRIAULE_2020`: extração padrão antiga para Inscrever, Atualizar.
> * `GRIAULE_2024`: nova extração padrão para Inscrever, Atualizar.
> * `GRIAULE_2018`: use GRIAULE\_2018 (mais lento).

### Famílias de colunas HBase de reextração

#### **gbds.reextract.cf.finger**

Nome da família da coluna de dedos para receber o modelo extraído em transações e pessoas.

**Valor padrão:**

> `fingerprint-reextract-1`

#### **gbds.reextract.cf.palm**

Nome da família da coluna Palm para receber o modelo extraído em transações e pessoas.

**Valor padrão:**

> `palmprint-write`

#### **gbds.reextract.cf.face**

Nome da família da coluna de rosto para receber o modelo extraído em transações e pessoas.

**Valor padrão:**

> `face-reextract-1`

#### **gbds.reextract.cf.iris**

Nome da família da coluna Iris para receber o modelo extraído em transações e pessoas.

**Valor padrão:**

> `iris-write`

#### **gbds.reextract.cf.newborn-palm**

Nome de família de coluna de palmeira de recém-nascido para receber modelo extraído em transações e pessoas.

**Valor padrão:**

> `newborn-palmprint-write`

### SQLite

#### **gbds.reextract.sqlite.filePath**

Caminho do arquivo para o banco de dados local SQLite.

**Valor padrão:**

> `/home/<username>/reextract.db`

#### **gbds.reextract.sqlite.resetOnStart**

Sinalizador para redefinir o SQLite na inicialização.

**Valor padrão:**

> `false`

**Valores possíveis:**

> * `true`
> * `false`

## Exemplo de arquivo de Configuração

{% hint style="info" %}
Substitua `<hostname>`, `<rdb-username>`, `<rdb-base64-password>`e `<username>`pelos valores corretos. Além disso, se `zookeeper`e `mysql`estiverem sendo executados em portas diferentes das padrão, substitua os números das portas.
{% endhint %}

```
# GENERAL
gbscluster.zookeeper.quorum=<hostname>:2181

# RDB CONNECTION
gbds.rdb.driverClassName=com.mysql.jdbc.Driver
gbds.rdb.url=jdbc:mysql://<hostname>:3306/gbds?useSSL=false&allowPublicKeyRetrieval=true
gbds.rdb.username=<rdb-username>
gbds.rdb.password=<rdb-base64-password>
gbds.rdb.dialect=org.hibernate.dialect.MySQLDialect
gbds.rdb.showSql=false
gbds.rdb.maxPoolSize=100
gbds.rdb.minPoolSize=1
gbds.rdb.initialPoolSize=2
gbds.rdb.maxStatments=0
gbds.rdb.maxIdleTime=1800
gbds.rdb.maxConnectionAge=1800
gbds.rdb.statementCacheNumDeferredCloseThreads=1
gbds.rdb.acquireIncrement=10
gbds.rdb.testConnectionOnCheckout=false
gbds.rdb.testConnectionOnCheckin=true
gbds.rdb.acquireRetryAttempts=10
gbds.rdb.idleConnectionTestPeriod=30

# HBASE COLUMN FAMILIES - STANDARD
gbds.hbase.templates.fingerprint.cf.name=tpts
gbds.hbase.templates.palmprint.cf.name=tpts
gbds.hbase.templates.face.cf.name=tpts
gbds.hbase.templates.iris.cf.name=tpts
gbds.hbase.templates.newborn-palmprint.cf.name=tpts

# HBASE COLUMN FAMILIES - FALLBACK
gbds.hbase.templates.fallback.fingerprint.cf.name=fingerprints
gbds.hbase.templates.fallback.palmprint.cf.name=palmprints
gbds.hbase.templates.fallback.face.cf.name=faces
gbds.hbase.templates.fallback.iris.cf.name=iris
gbds.hbase.templates.fallback.newborn-palmprint.cf.name=newborn-palmprints

# REEXTRACTOR - GENERAL
gbds.reextract.nodeNumber=1
gbds.reextract.totalNodes=1
gbds.reextract.totalScanRegions=256
gbds.reextract.scanners.number=5
gbds.reextract.workers.number=5
gbds.reextract.writers.number=5
gbds.reextract.validate.extraction=false

# REEXTRACTOR - PIPELINE QUEUE
gbds.reextract.workers.inqueueMaxSize=100
gbds.reextract.writers.inqueueMaxSize=100

# REEXTRACTOR - MODALITY TO REEXTRACT FLAGS
gbds.reextract.modality.finger=true
gbds.reextract.modality.face=true
gbds.reextract.modality.palm=false
gbds.reextract.modality.iris=false
gbds.reextract.modality.newborn-palm=false

# REEXTRACTOR - TEMPLATE EXTRACTION MICROSERVICE
gbds.reextract.msextraction.ginger.number=10
gbds.reextract.msextraction.face.number=1
gbds.reextract.msextraction.initialPort=6000
gbds.reextract.msextraction.maxTries=3
gbds.reextract.msextraction.linkLibSegfault=true
gbds.reextract.msextraction.checkTimeoutSecs=30
gbds.reextract.msextraction.logLevel=INFO
gbds.reextract.msextraction.timeout=60
gbds.reextract.msextraction.fingerprints.extractor.type=GRIAULE_2024

# REEXTRACTOR - REEXTRACTION HBASE COLUMN FAMILIES
gbds.reextract.cf.finger=fingerprint-reextract-1
gbds.reextract.cf.palm=palmprint-write
gbds.reextract.cf.face=face-reextract-1
gbds.reextract.cf.iris=iris-write
gbds.reextract.cf.newborn-palm=newborn-palmprint-write

# REEXTRACTOR - SQLITE
gbds.reextract.sqlite.filePath=/home/<username>/reextract.db
gbds.reextract.sqlite.resetOnStart=false
```


# Notificador do GBDS

## Arquivo de Configuração

Os parâmetros de configuração do Notificador são definidos em um arquivo de configuração contendo todos os parâmetros e seus respectivos valores. Parâmetros omitidos assumem os valores padrão. Essa seção descreve as propriedades do arquivo de configuração.

### Localização do Arquivo

O arquivo de configuração está localizado em: `/etc/griaule/conf/notifier.properties`.

### Propriedades do Arquivo

O arquivo de configuração deve seguir alguns requerimentos para ser corretamente interpretado pelo GBDS. Esses requerimentos são:

1. O nome do arquivo e sua localização devem ser exatamente iguais os mencionados na seção [Localização do Arquivo](#localizacao-do-arquivo)
2. Deve haver exatamente um parâmetro de configuração por linha.
3. Cada parâmetro de configuração deve ter forma `{parâmetro}={valor}`, sem quebras de linha;
4. Cada valor deve ser separado por uma vírgula quando atribuído a um único parâmetro.

## Parâmetros de Configuração

Essa seção descreve cada um dos parâmetros de configuração do Notificador que podem estar listados no arquivo de configuração e como eles afetam a operação do sistema.

### gbscluster.notifier.active

Esse parâmetro define se o Notificador está ativo ou não.

**Valor Padrão:**

> `true`

**Valores possíveis:**

> * `true`
> * `false`

### gbds.cluster.zookeeper.quorum

Esse parâmetro define o *hostname* e a porta na qual o servidor zookeeper pode ser encontrado. Cada valor deve ser separado por vírgulas se houver mais de um.

**Valor Padrão:**

> `<hostname>:<port>`

### gbscluster.notifier.method

Esse parâmetro define os métodos a serem notificados, separados por vírgulas.

**Valor Padrão:**

> `enroll,search,treatanomaly,qualityanalysis`

**Valores possíveis:**

> * `assignanomaly`
> * `authentication`
> * `countanomalies`
> * `delete`
> * `enroll`
> * `externalauthentication`
> * `findanomalies`
> * `getanomaly`
> * `getperson`
> * `getresult`
> * `transactiontransaction`
> * `listanomalies`
> * `peoplefilter`
> * `search`
> * `treatanomaly`
> * `trustedenroll`
> * `unassignanomaly`
> * `removefromreference`
> * `addtoreference`

### gbscluster.notifier.endpoints

Esse parâmetro define o endereço de destino para o qual a notificação será enviada.

**Valor Padrão:**

> `id::None->url::http://<address>:<port>`

### gbscluster.notifier.enable\_auth

Esse parâmetro define se autenticação é necessária para a comunicação com o endpoint.

**Valor Padrão:**

> `true`

**Valores possíveis:**

> * `true`
> * `false`

### gbscluster.kafka.broker

Esse parâmetro define o endereço do Kafka Broker e deve ser refletido nas configurações do Kafka.

**Valor Padrão:**

> `<hostname>:6667`

### gbscluster.notifier.nthreads

Esse parâmetro define a quantidade de threads que devem ser utilizadas para consumir a fila de notificações.

**Valor Padrão:**

> `6`

### gbscluster.notifier.retrydelay

Esse parâmetro define o intervalo de tempo para a tentativa de reenvio de uma notificação.

**Valor Padrão:**

> `3000`


# Criptografia da Base de Dados

## Pré-requisitos

O procedimento descrito neste manual depende dos seguintes requisitos:

* [Procedimento de instalação do Apache Ranger™](/ferramentas-auxiliares/apacheranger)
* [Procedimento de instalação do Luna Cloud HSM (Opcional)](/ferramentas-auxiliares/lunacloudhsm)

## Criar chave para criptografia

### Permissão de usuário

Para criptografar o HBase, é necessário adicionar permissões para o usuário que administra o HDFS.

No navegador, acesse o Ranger em `http://<host>:6080`.

* Usuário: `keyadmin`
* Senha: `<senha definida no procedimento de instalação do Ranger Admin>`

{% hint style="info" %}
Neste exemplo, iremos usar o usuário `hadoop`
{% endhint %}

Ao acessar o Painel do Ranger KMS, clique no repositório `kmsdev` do KMS, que irá redirecionar para a página de *policies* do *kmsdev*.

Clique para editar a `police 1`. Ao ser redirecionado, clique no ícone + dentro de Allow Conditions e preencha da seguinte forma:

* Select Role: *Sem alteração*
* Select Group: *Sem alteração*
* Select User: `hadoop`
* Permissions: `Decrypt EEK`, `Generate EEK`, `Get`, `Get Keys`, `Get Metadata`
* Delegate Admin: *Checked*

Para testar acesso ao servidor, execute os seguintes comandos para listar as chaves e os metadados da chave, caso exista uma:

```sh
hadoop key list
hadoop key list -metadata
```

O objetivo do teste é garantir que o acesso não será negado, havendo chave ou não.

### Criar chave

Ainda no painel do Ranger KMS, clique em Encryption e, então, em Key Manager.

Em Select Service, selecione o repositório `kmsdev`.

Para criar uma chave, clique em Add New Key e preencha da seguinte forma:

* Key Name: `hbase`
* Cipher: *Não fazer alteração*
* Length: `256`
* Description: campo opcional
* Attributes: *Não fazer alteração*

Ao clicar em save, a chave será criada e poderá ser acessada pelo servidor para encriptação. Para verificar, conecte no servidor com o usuário que tem permissão de `get key` e execute os comandos a seguir:

```sh
hadoop key list
hadoop key list -metadata
```

## Criar zona de criptografia

Para encriptar a base de dados do Hadoop, é necessário criar uma zona de criptografia. Dessa forma, todos dados inseridos nesta zona serão redirecionados pelo HDFS para o KMS para encriptação ou decriptação, a depender da requisição enviada e das permissões do usuário no KMS.

Para criar uma zona de criptografia, é necessário que o caminho esteja vazio. Sendo assim, é necessário renomear a pasta `data` do HBase e criar a uma pasta com o mesmo nome.

```sh
hdfs dfs -mv /apps/hbase/data /apps/hbase/data-bkp
hdfs dfs -mkdir /apps/hbase/data /apps/hbase/data
hdfs dfs -ls /apps/hbase/

# Found 2 items
# drwxr-xr-x   - hadoop hadoop         0 2023-02-17 14:02 /apps/hbase/data
# drwxr-xr-x   - hadoop hadoop         0 2023-02-15 11:58 /apps/hbase/data-bkp
```

Então execute o seguinte comando para definir o caminho `/apps/hbase/data` como uma zona de criptografia:

```sh
hdfs crypto -createZone -keyName hbase -path /apps/hbase/data
```

O retorno deve ser:

```
Added encryption zone /apps/hbase/data
```

Para verificar, execute o comando para listar as zonas:

```sh
hdfs crypto -listZones
```

Este comando deve retornar a seguinte mensagem:

```
/apps/hbase/data  hbase
```

Sendo `/apps/hbase/data` a zona de criptografia e `hbase` a chave.

Após definir a zona de criptografia, copie todo o conteúdo da pasta `/apps/hbase/data-bkp` para dentro da zona de criptografia `/apps/hbase/data`.

```sh
hdfs dfs -cp /apps/hbase/data-bkp/* /apps/hbase/data/
```

Para verificar o funcionamento da encriptação, inicie o HBase e conecte-se ao HBase Shell, então execute os seguintes comandos de leitura de arquivo:

Dentro da zona de criptografia:

```sh
hdfs dfs -cat /apps/hbase/data/hbase.id
```

O retorno deve ser:

```
PBUF
$24b1ef30-14b6-46d0-b46b-f49c9c109cb1
```

Fora da zona de criptografia:

```sh
hdfs dfs -cat /.reserved/raw/apps/hbase/data/hbase.id
```

O retorno deve ser:

```
▒w▒▒▒▒▒,U▒▒▒k▒y▒,*▒*|▒~▒/U▒U▒▒▒|#
```

Para obter informações sobre a criptografia do arquivo, execute o seguinte comando:

```sh
hdfs crypto -getFileEncryptionInfo -path /apps/hbase/data/hbase.id
```

O retorno deve ser:

```properties
{
	cipherSuite: {
		name: AES/CTR/NoPadding,
		algorithmBlockSize: 16
	},
	cryptoProtocolVersion: CryptoProtocolVersion{
		description='Encryption zones',
		version=2,
		unknownValue=null
	},
	edek: 0b79b49c77335747824d78e97e5e0bf2a54f428ddc81faf6dc220c4ecea7c7de,
	iv: ee35b713df8994046758372cee3eeea0,
	keyName: hbase,
	ezKeyVersionName: hbase@0
}
```

## Procedimento de troca de chave

{% hint style="warning" %}
Não é necessário interromper os serviços para a troca de chave e reencriptação. Leia o procedimento completo a seguir para mais informações.
{% endhint %}

### Procedimento de Rollover da chave

Para criar uma chave, clique em Add New Key e preencha da seguinte forma:

Para trocar a chave de encriptação, acesse o painel do Ranger KMS e clique em Encryption e, então, em Key Manager.

Em Select Service, selecione o repositório `kmsdev`.

Na chave utilizada para a zona de criptografia, no lado direito da tela em Action, clique no ícone descrito como Rollover.

Ao clicar em Rollover, será necessário confirmar a operação em um pop-up.

Após confirmar o *Rollover*, o Hadoop continuará utilizando a chave anterior, mas a chave nova também estará disponível no Ranger KMS. Por esse motivo não é necessário a interrupção dos serviços para este procedimento.

Para verificar a disponibilidade das chaves e suas respectivas versões, execute o seguinte comando:

```sh
curl http://localhost:9292/kms/v1/key/hbase/_versions?user.name=hadoop
```

O retorno deve ser:

```json
[
	{
		"material": "NIoXKS9lHMIPBUhIARV3V5TCzTj12IHEOjVwD00R8NM",
		"name": "hbase",
		"versionName": "hbase@0"
	},
	{
		"material": "RjAvLWzEu7BuRvPpXs7K2Q8EqRTa_gJsDm-NF8D_HSc",
		"name": "hbase",
		"versionName": "hbase@1"
	},
	...
]
```

Neste retorno, nota-se que o Hadoop está utilizando a chave `hbase@0`, porém já está disponível a chave `hbase@1` no KMS.

### Procedimento de reencriptação

O procedimento de encriptação pode ser feito durante o funcionamento pleno do sistema por dois pontos:

#### O tipo da criptografia

O Hadoop utiliza criptografia do tipo TDE (*transparent data encryption*). Este tipo de criptografia atua no banco de dados apenas em nível de arquivo, permitindo que os dados estejam disponíveis para as aplicações sem a necessidade de encriptação ou decriptação a cada operação.

#### Informações de criptografia no arquivo

Cada arquivo encriptado possui um cabeçalho ou pacote com as informações da criptografia, incluindo a versão da chave utilizada. Estas informações são consultadas diretamente em qualquer procedimento de criptografia.

{% hint style="info" %}
Para verificar as informações de criptografia no arquivo, execute o seguinte comando:

```sh
hdfs crypto -getFileEncryptionInfo -path /apps/hbase/data/hbase.id
```

O retorno deve ser:

```properties
{
	cipherSuite: {
		name: AES/CTR/NoPadding,
		algorithmBlockSize: 16
	},
	cryptoProtocolVersion: CryptoProtocolVersion{
		description='Encryption zones',
		version=2,
		unknownValue=null
	},
	edek: 0b79b49c77335747824d78e97e5e0bf2a54f428ddc81faf6dc220c4ecea7c7de,
	iv: ee35b713df8994046758372cee3eeea0,
	keyName: hbase,
	ezKeyVersionName: hbase@0
}
```

{% endhint %}

Para reencriptar a zona de criptografia após o *Rollover* da chave, execute os seguintes comandos:

* Para listar as zonas de criptografia:

```sh
hdfs crypto -listZones
```

* Para reencriptar a zona desejada com a nova chave:

```sh
hdfs crypto -reencryptZone -start -path /apps/hbase/data/
```

O retorno deve ser uma mensagem confirmando a solicitação de reencriptação:

```
re-encrypt command successfully submitted for zone: /apps/hbase/data/ action: START
```

Após a solicitação, o Hadoop irá iniciar a reencriptação dos dados com a chave atualizada fornecida pelo Ranger KMS.

Para checar o status da reencriptação, execute o seguinte comando:

```sh
hdfs crypto -listReencryptionStatus
```

O retorno deve ser um relatório com o status da operação:

```
Zone Name         Status     EZKey Version Name  Submission Time               Is Canceled?     Completion Time               Number of files re-encrypted  Number of failures  Last File Checkpointed
/apps/hbase/data  Completed  hbase@1             2023-02-17 15:43:15,429-0300  false            2023-02-17 15:43:15,623-0300  28                            0
```

Para verificar se as informações de criptografia foram atualizadas nos arquivos, execute novamente o comando `-getFileEncryptionInfo`:

```sh
hdfs crypto -getFileEncryptionInfo -path /apps/hbase/data/hbase.id
```

Caso a troca das chaves tenha sido realizada com sucesso, o campo `ezKeyVersionName` irá refletir o nome da nova versão:

```properties
{
	cipherSuite: {
		name: AES/CTR/NoPadding,
		algorithmBlockSize: 16
	},
	cryptoProtocolVersion: CryptoProtocolVersionc{
		description='Encryption zones',
		version=2,
		unknownValue=null
	},
	edek: 995afbc575fa88ff0ef72a908e0caa8397c18b2df852cb86e35fcc4577ed257b,
	iv: ee35b713df8994046758372cee3eeea0,
	keyName: hbase,
	ezKeyVersionName: hbase@1
}
```


# Manual de Usuário do LDAP

## Introdução

**LDAP** (Lightweight Directory Access Protocol) é um protocolo padrão utilizado para acessar e gerenciar informações armazenadas em serviços de diretório, como o *Active Directory* da Microsoft, o *OpenLDAP* dentre outros. Ele é frequentemente usado para centralizar informações de usuários, grupos e recursos em uma rede, como em sistemas de autenticação, diretórios de contatos e sistemas de gerenciamento de acesso.

{% hint style="info" %}
Este manual cobre o uso do LDAP com a ferramenta [Apache Directory Studio](https://directory.apache.org/studio/).
{% endhint %}

![](/files/cLO7TWQqNjyVAcXIwxl0)

## Iniciando o uso

### Criando uma conexão

Pelo menu File -> New será aberto o *Wizard*, escolher LDAP Browser -> LDAP Connection. Ou, na janela de conexões, com o botão direito escolher New Connection.

Preencher somente o `Nome da conexão` (*Connection name*) e o `Hostname` (ou IP) e avançar para a próxima tela.

![](/files/y4gyvMQSsG8Bd5hFrVaV)

Preencher o campo `Bind DN or User` e `Bind password` conforme informado pela equipe que criou o LDAP. Após configurado é possível clicar em Check Authentication para confirmar o acesso e login no LDAP.

![](/files/1iGUmfZiV5ajQVCRh6ip)

{% hint style="success" %}
**(Opcional)** Na próxima tela, *Browser Option*, marcar `Fetch operational attributes while browsing` para melhorar a visibilidade dos grupos que cada usuário pertence.
{% endhint %}

### Conectando pela aba de Connections

Verifique qual servidor da lista deseja conectar, dê um duplo clique no servidor escolhido ou selecione-o e clique no ícone de conexão (destacado em vermelho na imagem abaixo).

![](/files/1psiB9PtwLVfsPZJuR6Y)

Se a conexão for bem sucedida, o ícone do servidor mudará para amarelo:

![](/files/r3GafboHSg2380DRWuaC)

## Estrutura do LDAP

### Árvore de diretórios

A árvore utilizada baseia-se essencialmente em *Groups* e *Users*, podendo adicionalmente contar com *Policies* para políticas de senha.

![](/files/42r8SXPjJABWDTtgZJyN)

### Siglas

<table><thead><tr><th width="200">Sigla</th><th>Significado</th></tr></thead><tbody><tr><td><code>dc</code></td><td>Componentes do domínio (Domain Component)</td></tr><tr><td><code>ou</code></td><td>Unidade organizacional à qual o usuário pertence (Organizational Unit)</td></tr><tr><td><code>cn</code></td><td>Nome comum (Common Name)</td></tr><tr><td><code>sn</code></td><td>Nome da pessoa (Surname)</td></tr><tr><td><code>uid</code></td><td>ID de usuário (User ID)</td></tr><tr><td><code>mail</code></td><td>e-mail (Email Address)</td></tr></tbody></table>

### Árvore *Users*

Nesta árvore são criados os usuários e definidas suas senhas, pode ser estruturada em subníveis para facilitar a organização dos usuários mediante conceito de agrupamento por localidade, departamento, etc.

### Árvore *Groups*

Nesta árvore são definidos grupos que representarão permissões / roles de acesso às ferramentas, mediante adição do usuário ao grupo de acesso desejado.

Exemplo de grupos:

* `etr_view` - Usuários adicionados a este grupo terão acesso às permissões definidas no grupo, que representam opções de acesso ao ETR como visualizador.
* `bcc_verify` - Usuários adicionados a este grupo poderão logar no BCC e realizar pesquisas de verificação (pesquisas 1:1).

### Cadastro de usuário

Na criação de usuário, preencher os seguintes atributos:

`cn` - usado como o nome do **login** do usuário; `sn` - usado para registar o **nome completo** do usuário; `uid` - reservado para uso futuro, devendo ser preenchido com o mesmo texto que o `cn`; `password` - preenchido com a **senha** deste usuário; `mail` - usado para registar o **e-mail** do usuário.

Para cadastrar um usuário, clique com botão direito em cima de `ou=User` e escolha New -> New Entry:

![](/files/aUAIcxDE8a4QloKBO30e)

Será aberta a tela de criação de usuário. Caso existam `ou` intermediárias, altere o caminho no diretório de criação. Caso contrário, se nenhuma alteração for realizada, o usuário será criado na raiz do diretório *Users*.

![](/files/xxfh5dVqTcOWvbOxIM9u)

Na tela seguinte, remova `organizationalUnit`:

![](/files/BpqLbEWu7VqLIsqnUgtN)

Adicione `inetOrgPerson` e o aplicativo automaticamente trará as classes de dependência `organizationalPerson`, `person` e `top`:

![](/files/YdYGcPeBMObck146QbYt)

Avance para próxima tela para escolher o `cn`. Preencha com o `cn` de login desejado:

![](/files/rkTbToKVd0b2MBuK6QBB)

Nesta nova tela é exibido um sumário do que será feito e pode-se alterar o `sn`. Preencha, se possível, com o nome completo do usuário.

![](/files/UAK2Q9MARNkgjjLc5BhY)

Em seguida, clique com o botão direito do mouse em New Attribute:

![](/files/AsALAXV8r8g1PJxjwiWK)

Escolha `UID` e preencha com o valor do `UID`.

{% hint style="info" %}
O valor do `UID` deve vir do administrador de usuários do sistema.
{% endhint %}

Em seguida, o atributo `userPassword`:

![](/files/bCUiTq8d5mUGUQ9Zdn1q)

Ao encerrar, será aberta a tela para definir a senha. Escolha `CRYPT-SHA-512` e preencha com a senha desejada:

![](/files/7r3X324KqdjLcQZLurOL)

Finalmente, exclua o *objectClass* `organizationalPerson (structural)` clicando com o botão direito e escolhendo Delete Value:

![](/files/60EfbIhYLlCzDn4HvsTc)

### Adição de grupo a um usuário

Em *Users*, abra o cadastro de um usuário e copie o **DN** do usuário mostrado no cabeçalho da tela:

![](/files/5s0N5Anrp5D90p9zSxij)

{% hint style="info" %}
**DN** é a sigla para *Distinguished Name*, que é o **Nome Distinto** do objeto no LDAP. É a maneira de identificar um objeto de forma única no diretório. Ele fornece o caminho para a entrada específica dentro da hierarquia do diretório LDAP, que é organizada em uma estrutura de árvore. Um DN é composto por uma sequência de nomes distintos relativos (RDNs) conectados por vírgulas. Cada RDN é um componente do DN que representa um valor de atributo específico.

Por exemplo:

<img src="/files/Ykn46l5JbzlXh4U52qh7" alt="" data-size="original">

* `cn=leandro.pinheiro`: **Nome Comum** (`cn`) da entrada. Geralmente é utilizado para nomes de pessoas ou objetos.
* `ou=Users`: **Unidade Organizacional** (`ou`) onde a entrada está localizada.
* `dc=oldap`: **Componente de Domínio** (`dc`). Pode representar um subdomínio ou uma parte específica do domínio dentro da estrutura LDAP.
* `dc=igp`: Outro **Componente de Domínio** (`dc`). Representa outra parte do domínio, possivelmente indicando um departamento ou subdivisão dentro da organização.
* `dc=griaule`: **Componente de Domínio** (`dc`) de nível mais alto. Representa o domínio principal da organização.

Portanto, o DN `cn=leandro.pinheiro,ou=Users,dc=oldap,dc=igp,dc=griaule` identifica um usuário específico chamado `leandro.pinheiro` dentro da unidade organizacional `Users`, que faz parte do subdomínio `oldap`, do domínio `igp`, dentro do domínio principal `griaule`. Este DN fornece um caminho claro e exclusivo para localizar esta entrada específica no diretório LDAP da organização.
{% endhint %}

Em seguida, abra o raiz de *Groups* e escolha o grupo desejado. Clique com o botão direito no grupo e em New Attribute. Em `Attribute Type`, escolha `member`. Clique em Finish.

![](/files/nZai3lbcUQ1DZQp839M0)

Na tela **DN Editor**, cole o **DN** completo do usuário (copiado no primeiro passo). Clique em OK:

![](/files/6KvMALXzv0cZP8LFkhvY)

### Adição rápida de grupo a um usuário

Quando o grupo já possui usuários / membros, a adição de um novo usuário ao grupo é mais ágil: basta clicar com o botão direito no componente `member` e escolher New Value. A tela **DN Editor** abrirá. Então, como mostrado na seção anterior, cole o **DN** completo do usuário e clique em OK.

![](/files/2bO1Tq1Oh9cDWz4L28zn)

### Exclusão do usuário de um grupo

Abra o grupo em que o usuário está:

![](/files/O9fkEIuwmMV3trFhsMSk)

Clique com o botão direito no `member` do usuário que se deseja remover do grupo e clique em Delete Value:

![](/files/pGkev5JUzNiYFlYkACYP)

Confirme clicando em OK:

![](/files/OcIHHmjAEgGj4A4hBxl1)

### Criação de grupo

Para criar um novo grupo, clique com botão direito em cima de `ou=Groups` e escolha New -> New Entry.

![](/files/0y6isycwmsiWWPSsi2Dd)

Será aberta a tela de criação, semelhante à criação de usuários. Escolha a opção `organizationalUnit`.

![](/files/56GdPGhVin1sgzseg203)

Escolha `ou` e preencha um nome, no exemplo abaixo foi escolhido `LDAP`. Finalize a criação do grupo clicando em Finish.

![](/files/uprpizo0uzs6ND4GM7ct)

## Navegação no LDAP

### Pesquisa de grupos do usuário pelo "Quick Search"

Para localizar os grupos de um usuário, acesse o buscador do LDAP e selecione a opção `cn` ou `member`.

{% hint style="info" %}
Selecionando `member`, será necessário pesquisar utilizando o **DN** completo do usuário.
{% endhint %}

Na parte superior direita, verifique se o seguinte ícone está selecionado:

![](/files/IUAjeHT4jVDiAOokvW5k)

Se não estiver, selecione-o. Isso permitirá fazer uma busca por toda árvore do groups (opções `search one level only` ou `search whole subtree`).

![](/files/8kKAM8eMZPbrkFJnhHzq)

Verifique a resposta no `Quick Search`:

![](/files/pUGroAnyL8MFZn1hmtAg)

{% hint style="danger" %}
**Nunca realizar exclusão de usuário usando o resultado da pesquisa** (no item Quick Search), pois foram pesquisados os grupos que esta pessoa pertence. Portanto, **apagar uma linha do Quick Search significa apagar o grupo** e não o usuário.
{% endhint %}

### Lista de grupos do usuário na descrição do usuário

Outra forma de verificar os grupos que o usuário pertence é através do *Fetch*.

Para isso, clique com o botão direito do mouse no nome do usuário e escolha Fetch -> Fetch Operacional Attributes:

![](/files/N46FGJDkncsCmbhG1ww6)

Também é possível inserir o *Fetch Operacional Attributes* clicando com o botão direito do mouse e escolhendo Properties. Em seguida, clique em `Connection` e abra a aba `Browser Options`. Então, na seção `Features`, marque a opção `Fetch operational attributes while browsing`:

![](/files/75OFOCCF3t7OeMB29If5)

Assim, os grupos que o usuário pertence serão exibidos durante a navegação:

![](/files/SJt9qcRx6vC4mI9h9vyp)

### Troca de senha

Localize o usuário pelo Quick Search, como mostrado [neste passo a passo](#pesquisa-de-grupos-do-usuario-pelo-quick-search).

Após localizar o usuário, clique duas vezes em userPassword e abra a aba `New Password`.

![](/files/vJ7xYYoX3f0UVfadElkL)

Insira a nova senha e confirme.

Após aplicar a nova senha, aparecerá a tela do *Modification Logs* confirmando sua alteração.

### Verificação de senha

Para verificação de senha, primeiro localize o usuário pelo Quick Search, como mostrado [neste passo a passo](#pesquisa-de-grupos-do-usuario-pelo-quick-search).

Após localizar o usuário, clique duas vezes em userPassword e abra a aba `Current Password`.

No campo, `Verify Password`, insira a senha atual do usuário e clique em Verify.

Se a senha estiver correta, a mensagem "*Password verified successfully*" será exibida.

![](/files/oEDPMp8BV880UDoG5XsY)

## Organização de usuários

### Usuários por subgrupos

A organização eficiente dos usuários em um diretório LDAP pode ser realizada por meio das subárvores. Essa estrutura facilita a administração do diretório, permitindo uma segmentação clara dos usuários com base em critérios específicos como empresa, departamento ou contratos.

#### Conceito de Subárvore de Usuários

Para otimizar a gestão de usuários, é recomendado a implementação de uma subárvore hierárquica com um ou dois níveis no máximo de profundidade. Essa prática garante uma separação lógica dos usuários, trazendo clareza e eficiência na administração do diretório.

#### Vantagens da Subárvore de Usuários

1. **Simplificação da Administração**: Reduz a complexidade da administração do LDAP.
2. **Organização Estruturada**: Facilita a localização e o gerenciamento de objetos LDAP.
3. **Melhoria de Performance**: Minimiza o tempo de resposta em consultas e operações no LDAP.

![](/files/Lc6y1VQr1yHx3Y5miSqx)

Esta estrutura exemplifica:

* **ROOT**: Nível raiz do diretório LDAP.
* **Organização**: Unidade organizacional principal.
* **UF**: Unidade Federativa, exemplificando com `SP` (São Paulo).
* **CONTRATO**: Subdivisão de contratos, como `Polícia Científica`.
* **USER**: Usuários dentro do contrato específico.
* **Permissão**: Permissões associadas aos usuários.

Outro exemplo, esse diretamente no LDAP, consiste em uma árvore de subgrupos. Onde tem-se um grupo `policiaCivil` e dentro dele um subgrupo `SC`.

![](/files/HUQnIAyQtlljzjuyBT6H)


# Configuração do BCC Services

## Introdução

Este documento descreve os parâmetros de configuração do BCC Services, suas opções e valores padrão.

## Localização do Arquivo

Na instalação padrão, o arquivo de configuração (`bcc-services.properties`) estará localizado em `C:\Griaule\BCC\conf`.

## Propriedades

O arquivo de configuração deve seguir alguns requisitos para ser interpretado corretamente. Esses requisitos são:

1. O nome e a localização do arquivo devem ser exatamente como mencionados neste manual;

   > Parâmetros de configuração inválidos serão desconsiderados e um valor padrão será usado.
2. Deve haver exatamente um parâmetro de configuração por linha;
3. Cada parâmetro de configuração deve estar no formato `{parameter}={value}`, sem quebras de linha;

## Parâmetros de Configuração

Esta seção descreve os parâmetros de configuração que podem ser listados no arquivo `bcc-services.properties` e como eles afetam a operação do sistema.

### useFingerprintQualityLib

Este parâmetro define se a biblioteca de qualidade de impressão digital deve ser usada em capturas roladas.

**Valores Possíveis:**

> * `true`
> * `false`

### useFingerprintSDKAsService

Este parâmetro define se o Fingerprint SDK deve ser usado como um serviço separado.

{% hint style="warning" %}
Este parâmetro se aplica apenas à versão de 32 bits.
{% endhint %}

**Valores Possíveis:**

> * `true`
> * `false`

### reinitializeSDKOnCapture

Este parâmetro define se o aplicativo irá reinicializar o Fingerprint SDK em cada captura.

**Valores Possíveis:**

> * `true`
> * `false`

### useChecksum

Este parâmetro define se o checksum deve ser usado para importar e exportar arquivos.

**Valores Possíveis:**

> * `true`
> * `false`

### useCryptography

Este parâmetro define se a criptografia deve ser usada para importar e exportar arquivos.

**Valores Possíveis:**

> * `true`
> * `false`

### distance.crop.face

Este parâmetro define a resolução da largura e da altura da face recortada.

**Valores Possíveis:**

> * `CROP_480X640`
> * `CROP_1200X1600`

### templateFormat

Este parâmetro define o formato que os templates devem ser exportados.

**Valores Possíveis:**

> * `ANSI`
> * `ISO`
> * `CLASSIC`
> * `DEFAULT`
> * `FORENSIC`
> * `GR001`
> * `GR002`
> * `GR003`
> * `GR006`
> * `GR007`

### useLabels

Este parâmetro define se os rótulos (labels) serão enviados ao GBDS.

**Valores Possíveis:**

> * `true`
> * `false`

### enroll.labels

Este parâmetro define quais rótulos (labels) serão enviados ao GBDS quando `useLabels` for definido como `true`. Um máximo de seis rótulos podem ser definidos, esses rótulos devem ser separados por vírgula.

**Example:**

> `enroll.labels=label1,label2,label3,label4,label5,label6`

### report.folder.path

Este parâmetro define o caminho da pasta para salvar relatórios automaticamente.

### ebts.exporting.enabled

Este parâmetro define se a exportação do EBTS será habilitada para o BCC Services.

**Valores Possíveis:**

> * `true`
> * `false`

### ebts.exporting.path

Este parâmetro define o caminho onde estarão localizados os arquivos EBTS exportados.

### ebts.ori

Este parâmetro define o código do emissor do arquivo EBTS.

### gbds.keyStore.path

Caminho para o arquivo de keystore. Este parâmetro é necessário se o aplicativo estiver se comunicando com GBDS com SSL.

### gbds.keyStore.password

Arquivo de senha criptografada do keystore. Este parâmetro é necessário se o aplicativo estiver se comunicando com GBDS com SSL.

### gbds.trustStore.path

Caminho para o arquivo de truststore. Este parâmetro é necessário se o aplicativo estiver se comunicando com GBDS com SSL.

### gbds.trustStore.password

Arquivo de senha criptografada da truststore. Este parâmetro é necessário se o aplicativo estiver se comunicando com GBDS com SSL.

### config.generalTabOnly

Este parâmetro, quando definido como verdadeiro, listará apenas a guia `Geral` nas guias de configurações do BCC Services, ocultando outras.

**Valores Possíveis:**

> * `true`
> * `false`

### responsible.fytech.quality

Este parâmetro define o limite mínimo de qualidade das capturas de impressões digitais do responsável pelo bebê ao usar o sensor Fytech.

### baby.palm.fytech.quality

Este parâmetro define o limite mínimo de qualidade das capturas de impressão palmar do bebê ao usar o sensor Fytech.

**Default Value:**

> `65`

### capture.baby.fingerprints

Este parâmetro define se a impressão digital do bebê deve ser capturada.

**Valores Possíveis:**

> * `true`
> * `false`

### baby.finger.fytech.quality

Este parâmetro define o limite mínimo de qualidade das capturas de impressões digitais do bebê ao usar o sensor Fytech.

### fytech.timeout

Este parâmetro define o timeout no uso do sensor Fytech.

**Default Value:**

> `20`

### save.baby.palms.as.png

Este parâmetro define se as impressões palmares do bebê devem ser salvas no formato .png.

**Valores Possíveis:**

> * `true`
> * `false`

### bodyImageShapes

Este parâmetro define como será a seleção da parte do corpo para imagens auxiliares. Existem dois valores possíveis, simplificado e completo. Simplificado selecionará uma área inteira (por exemplo, braço), e o completo dará ao usuário a possibilidade de selecionar mais áreas de uma parte anatômica e com nomes mais específicos.

**Valores Possíveis:**

> * `true`
> * `false`

### minimun.biometrics

Este parâmetro define o número mínimo de biometrias necessárias para realizar um enroll.

### minimum.real.captured.fingers

Este parâmetro define o número mínimo de dedos sem anomalia necessários para realizar um enroll.

### maximum.anomalies

Este parâmetro define o número máximo de dedos com anomalia aceitos em uma operação de enroll.

### application.modules

Este parâmetro define quais módulos do aplicativo são instalados. Este parâmetro pode conter mais de um valor que devem ser separados por espaço.

**Valores Possíveis::**

> * `FACE`
> * `SIGNATURE`
> * `PALM`
> * `AUXILIARY_IMAGES`
> * `IRISES`

**Example:**

> `application.modules=FACE SIGNATURE PALM`

### match.sequence

Esta captura define se a captura das impressões digitais individuais deve ser comparada com a captura do controle de sequência.

**Valores Possíveis:**

> * `true`
> * `false`

### face.camera.type

Este parâmetro define qual tipo de câmera o aplicativo usará para capturas de face.

**Valores Possíveis:**

> * `WEBCAM`
> * `CANON_EOS`
> * `CANON_POWERSHOT`

### face.webcam.device

Este parâmetro define o índice da webcam que será utilizada na captura de face. Se houver apenas uma webcam instalada, esse número deve ser `0`.

### face.flash.mode

Este parâmetro define se a função flash será ativada ou não para captura de face.

**Valores Possíveis:**

> * `ON`
> * `OFF`

{% hint style="warning" %}
Este parâmetro só funciona com câmeras Canon Powershot.
{% endhint %}

### face.camera.rotation

Este parâmetro define a rotação da imagem obtida pelo dispositivo de captura de face.

**Valores Possíveis:**

> Qualquer número inteiro de `0` a `359`.

### body.camera.type

Este parâmetro define qual tipo de câmera o aplicativo usará para capturar o corpo.

**Valores Possíveis:**

> * `WEBCAM`
> * `CANON_EOS`
> * `CANON_POWERSHOT`

### body.webcam.device

Este parâmetro define o índice da webcam que será utilizada na captura de corpo. Se houver apenas uma webcam instalada, esse número deve ser `0`.

### body.flash.mode

Este parâmetro define se a função flash será ativada ou não para captura de corpo.

**Valores Possíveis:**

> * `ON`
> * `OFF`

{% hint style="warning" %}
Este parâmetro só funciona com câmeras Canon Powershot.
{% endhint %}

### body.camera.rotation

Este parâmetro define a rotação da imagem obtida pelo dispositivo de captura de corpo.

**Valores Possíveis:**

> Qualquer número inteiro de `0` a `359`.

### capture.type

Este parâmetro define o tipo de captura de impressões digitais individuais.

**Valores Possíveis:**

> * `FLAT`
> * `ROLLED`

### signature.type

Esse parâmetro define que dispositivo de assinatura da Topaz será usado para capturar as assinaturas.

**Valores Possíveis:**

> * `SignatureGem1X5`
> * `SignatureGem4X5`
> * `SignatureGemLCD`
> * `SignatureGemLCD4X3New`
> * `SignatureGemLCD4X5`
> * `ClipGem`
> * `ClipGemLGL`

### signature.device

Este parâmetro define qual a marca do dispositivo de assinatura que será usado.

**Valores Possíveis:**

> * `WACOM`
> * `TOPAZ`
> * `MSP`
> * `SIGNOTEC`

### signature.imageType

Este parâmetro define em qual formato de imagem a assinatura será salva.

**Valores Possíveis:**

> * `JPEG`
> * `TIFF`
> * `PNG`

### iris.device

Este parâmetro define qual dispositivo de íris será usado.

**Valores Possíveis:**

> * `CROSSMATCH`
> * `IRITECH`
> * `HUMMINGBIRD`

### advance.mode

Este parâmetro define o avanço após uma captura. Se estiver definido como automático o BCC Services avançará para a próxima captura após cada captura. Se estiver configurado como semiautomático, mostrará uma tela com a captura para o operador e será necessário avançar manualmente a captura.

**Valores Possíveis:**

> * `AUTOMATIC`
> * `SEMI_AUTOMATIC`

### sequenceControl.type

Este parâmetro define qual tipo de controle de sequência será usado. É possível configurar para 4-4-2, 2-2-1 ou nenhuma captura de controle de sequência.

**Valores Possíveis:**

> * `CTRL_221`
> * `CTRL_442`
> * `NONE`

### minQuality

Este parâmetro define a porcentagem mínima de qualidade do template de dedo para a captura ser aceita.

**Valores Possíveis:**

> Qualquer número inteiro no intervalo de `0` a `100`.

### triesToAccept

Este parâmetro define o número de tentativas para permitir a aceitação de templates de dedo de baixa qualidade.

### whiteBalance.mode

Este parâmetro define a opção do modo de balanço de branco ao usar uma câmera profissional.

**Valores Possíveis:**

> * `AUTO`
> * `CUSTOM`

### whiteBalance.blueAmber

Este parâmetro define o deslocamento azul-âmbar do balanço de branco quando o modo personalizado é ativado.

**Valores Possíveis:**

> Qualquer número inteiro no intervalo de `-9` a `9`.

### whiteBalance.greenMagenta

Este parâmetro define o deslocamento verde-magenta do balanço de branco quando o modo personalizado é ativado.

**Valores Possíveis:**

> Qualquer número inteiro no intervalo de `-9` a `9`.

### processLiveView

Este parâmetro define se brilho, contraste e zoom devem ser processados no Live View.

{% hint style="warning" %}
Este parâmetro só funciona com câmeras Canon EOS.
{% endhint %}

**Valores Possíveis:**

> * `true`
> * `false`

### nfiq.minimum

Este parâmetro define o valor mínimo de qualidade NFIQ para aceitar uma captura.

A qualidade NFIQ é um número inteiro no intervalo de 1 a 5 e um número baixo representa melhor qualidade.

### nfiq.action

Este parâmetro define a ação que o BCC tomará se a captura estiver acima da qualidade mínima do nfiq. `KEEP` manterá a captura, `REMOVE` removerá a captura.

**Valores Possíveis:**

> * `KEEP`
> * `REMOVE`

### nfiq.anomaly

Este parâmetro define como o BCC classificará uma captura que foi mantida quando a captura NFIQ estava acima do mínimo.

**Valores Possíveis:**

> * `NONE`
> * `LOW_QUALITY`
> * `AMPUTED`
> * `SCAR`
> * `MARK`
> * `IGNORED`
> * `DAMAGED`

### theme

Este parâmetro define o tema BCC.

**Valores Possíveis:**

> * `DARK`
> * `LIGHT`

### theme.color

Este parâmetro define a cor do tema do BCC.

**Valores Possíveis:**

> * `BLUE_GRAY`
> * `BLUE`
> * `BROWN`
> * `CYAN`
> * `DEEP_PURPLE`
> * `GREY`
> * `INDIGO`
> * `LIGHT_GREEN`
> * `ORANGE`
> * `PINK`
> * `RED`
> * `TEAL`

### cropImages

Este parâmetro define se o BCC deve cortar as capturas de impressão digital e as exportações de imagem. Se falso, a imagem permanecerá como obtida por captura/do perfil.

**Valores Possíveis:**

> * `true`
> * `false`

### jpegQuality

Este parâmetro define a qualidade de todas as imagens .jpeg geradas ou manipuladas.

**Valores Possíveis:**

> Qualquer número inteiro no intervalo de `0` a `100`.

### signatureBitDepth

Este parâmetro define a profundidade de bits da imagem de assinatura.

**Valores Possíveis:**

> * `GREYSCALE` (8-bit)
> * `COLOR` (24-bit)

### anomalySetType

Este parâmetro define o tipo de seleção da anomalia que pode ser classificada pelo usuário no BCC. Existem dois valores possíveis, simplificado e técnico.

Simplificado terá os valores mais genéricos como `AMPUTADO, CICATRIZ, MARCA DANIFICADA`.

O técnico terá valores mais específicos para a anomalia, possibilitando ao usuário selecionar a causa da anomalia.

**Valores Possíveis:**

> * `SIMPLIFIED`
> * `TECHNICAL`

### fingerVerifyThresold.\<finger>

Este parâmetro permite que o usuário defina um limite de verificação para dedos individuais.

Cada dedo pode ter seu limiar. Para cada dedo, este parâmetro deve ser repetido com o nome do dedo.

Este parâmetro é válido para o DEDO e será aplicado no dedo em AMBAS AS MÃOS.

**Exemplo:**

`fingerVerifyThresold.little=15`

`fingerVerifyThresold.ring=15`

`fingerVerifyThresold.middle=15`

`fingerVerifyThresold.index=15`

`fingerVerifyThresold.thumb=15`

### fingerVerifyThresold.default

Este parâmetro permite que o usuário defina os limites de verificação global para impressões digitais.

Se nenhum limite individual for usado, o limite padrão será usado.

### faceVerifyThresold.default

Este parâmetro define o limite de verificação de face.

### sequence221

Este parâmetro define a ordem de captura para o controle de sequência 2-2-1. Cada dedo é delimitado por espaço e a captura é delimitada por vírgula.

**Valores Possíveis:**

Podem ser usados os nomes de dedos ou índice de dedos como valores, conforme mostrado abaixo:

| Nome do Dedo  | Índice |
| ------------- | ------ |
| left\_little  | 0      |
| left\_ring    | 1      |
| left\_middle  | 2      |
| left\_index   | 3      |
| left\_thumb   | 4      |
| right\_thumb  | 5      |
| right\_index  | 6      |
| right\_middle | 7      |
| right\_ring   | 8      |
| right\_little | 9      |

**Exemplo:**

Para definir a seguinte sequência de captura:

> * Mínimo e anelar esquerdo
> * Médio e indicador esquerdo
> * Polegar esquerdo
> * Mínimo e anelar direito
> * Médio e indicador direito
> * Polegar direito

O parâmetro deve ser uma das duas opções:

`sequence221=LEFT_LITTLE,LEFT_RING LEFT_MIDDLE,LEFT_INDEX LEFT_THUMB RIGHT_RING,RIGHT_LITTLE RIGHT_INDEX,RIGHT_MIDDLE RIGHT_THUMB`

`sequence221=0,1 2,3 4 8,9 6,7 5`

### sequence442

Este parâmetro define a ordem de captura para o controle de sequência 4-4-2. Cada dedo é delimitado por espaço e a captura é delimitada por vírgula.

**Valores Possíveis:**

Podem ser usados os nomes de dedos ou índice de dedos como valores, conforme mostrado abaixo:

| Nome do Dedo  | Índice |
| ------------- | ------ |
| left\_little  | 0      |
| left\_ring    | 1      |
| left\_middle  | 2      |
| left\_index   | 3      |
| left\_thumb   | 4      |
| right\_thumb  | 5      |
| right\_index  | 6      |
| right\_middle | 7      |
| right\_ring   | 8      |
| right\_little | 9      |

**Exemplo:**

Para definir a seguinte sequência de captura:

> * Mínimo, anelar, médio e indicador esquerdo
> * Mínimo, anelar, médio e indicador direito
> * Polegar esquerdo e polegar direito

O parâmetro deve ser uma das duas opções:

`sequence442=LEFT_LITTLE,LEFT_RING,LEFT_MIDDLE,LEFT_INDEX RIGHT_INDEX,RIGHT_MIDDLE,RIGHT_RING,RIGHT_LITTLE LEFT_THUMB,RIGHT_THUMB`

`sequence442=0,1,2,3 6,7,8,9 4,5`

### sequenceMain

Este parâmetro define a sequência de captura das impressões digitais individuais. Cada captura de impressão digital é delimitada por espaço.

**Valores Possíveis:**

Podem ser usados os nomes de dedos ou índice de dedos como valores, conforme mostrado abaixo:

| Nome do Dedo  | Índice |
| ------------- | ------ |
| left\_little  | 0      |
| left\_ring    | 1      |
| left\_middle  | 2      |
| left\_index   | 3      |
| left\_thumb   | 4      |
| right\_thumb  | 5      |
| right\_index  | 6      |
| right\_middle | 7      |
| right\_ring   | 8      |
| right\_little | 9      |

**Exemplo:**

Para definir uma sequência de captura, insira os índices ou nomes dos dedos conforme mostrado abaixo:

`sequenceMain=LEFT_LITTLE LEFT_RING LEFT_MIDDLE LEFT_INDEX LEFT_THUMB RIGHT_THUMB RIGHT_INDEX RIGHT_MIDDLE RIGHT_RING RIGHT_LITTLE`

`sequenceMain=0 1 2 3 4 5 6 7 8 9`

### sequencePalm

Este parâmetro define a sequência de captura para a captura de palma. Cada captura de impressão palmar é delimitada por espaço.

**Valores Possíveis:**

| Área da Palma       | Índice |
| ------------------- | ------ |
| left\_interdigital  | 31     |
| left\_thenar        | 32     |
| left\_hypothenar    | 33     |
| right\_interdigital | 34     |
| right\_thenar       | 35     |
| right\_hypothenar   | 36     |
| left\_full          | 40     |
| left\_writer        | 41     |
| right\_full         | 45     |
| right\_writer       | 46     |

**Exemplo:**

Para definir a seguinte sequência de captura:

tenar, hipotenar e interdigital

> * Interdigital esquerdo
> * Tenar esquerdo
> * Interdigital direito
> * Tenar direito

O parâmetro deve ser uma das duas opções:

`sequencePalm=LEFT_INTERDIGITAL LEFT_THENAR RIGHT_INTERDIGITAL RIGHT_THENAR`

`sequencePalm=31 32 34 35`

### babySequencePalm

Este parâmetro define a sequência de captura para a captura da palma do bebê. Cada captura de impressão palmar é delimitada por espaço.

O BCC Services pode realizar duas capturas da mesma palma. A melhor será enviada como captura principal e a outra será enviada como imagem auxiliar.

| Área da Palma  | Índice |
| -------------- | ------ |
| left\_palm     | 200    |
| left\_palm\_2  | 201    |
| right\_palm    | 210    |
| right\_palm\_2 | 211    |

**Valores Possíveis:**

> * `LEFT_PALM`
> * `LEFT_PALM2`
> * `RIGHT_PALM`
> * `RIGHT_PALM2`

### minutiaOrientation

Este parâmetro define de que forma o BCC Services mostrará o indicador de ângulo de minúcias.

**Valores Possíveis:**

> * `DEFAULT`
> * `ÌSO`


# Target Biométrico

Documentação relacionada ao Target Biométrico e seu comportamento.\
Essa funcionalidade está disponível apenas a partir da versão 5 do GBDS.

## Comportamento

### Em qualquer enroll/update

Se uma transação nao possui "origin", o que significa que não há nenhuma label referente a uma organização de origem, a transação terá, para propósitos de exceção, origem de organizações de nível mais alto.

{% hint style="info" %}
Exemplo: Uma transação cadastrada em um ambiente com organização `ori_griaule` como organização de nível mais alto (sem organização pai), terá `ori_griaule` como origem
{% endhint %}

### Em geração de exceção

{% hint style="info" %}
CSI significa Ciclo de Inconformidade Simplificado. É um sistema usado para avaliar dados biométricos, determinando se um candidato biométrico é HIT, NO\_HIT ou UNCERTAIN com base em limites específicos durante o cadastro ou atualizações. Um candidato é marcado como HIT se sua correspondência estiver acima do limite do CSI, NO\_HIT se não estiver e UNCERTAIN se sua correspondência estiver abaixo do limite.
{% endhint %}

{% hint style="info" %}

* Hit de dedo: todos os matches para dedos atingem contagem biométrica mínima

* No Hit de Dedo: todos os não matches de dedo atingem contagem biométrica minima

* Hit de Face: todos os matches para face

* No Hit de Face: todos os não matches de face atingem contagem biométrica mínima
  {% endhint %}

* Cada candidato será marcado como HIT, NO\_HIT, ou UNCERTAIN
  * Se o candidato biométrico não for um match, será um NO\_HIT
  * Se o candidato biométrico for um match com um valor abaixo do limite de CSI será UNCERTAIN, de acordo com as configurações de enroll/update e finger/face
  * Se o candidato biométrico der match com um valor acima do limite de CSI, será um HIT, de acordo com as configurações de enroll/update/ e finger/face

* Exceções serão marcadas como target BIOMETRIC, BIOMETRIC\_INCONCLUSIVE, BIOMETRIC\_MISMATCH ou BIOGRAPHIC:

Cadastro

| Dedo   | Face   | Exceção             |
| ------ | ------ | ------------------- |
| HIT    | HIT    | BIOGRAPHIC          |
| HIT    | NO HIT | BIOMETRIC\_MISMATCH |
| NO HIT | HIT    | BIOMETRIC\_MISMATCH |

* Sem hit de dedo ou face e sem não hit de dedo ou face:
  * com incerteza biométrica, gera uma exceção `BIOMETRIC`
  * com certeza biométrica, gera uma exceção `BIOMETRIC_INCONCLUSIVE`

Update

| Dedo   | Face   | Exceção             |
| ------ | ------ | ------------------- |
| NO HIT | NO HIT | BIOGRAPHIC          |
| HIT    | NO HIT | BIOMETRIC\_MISMATCH |
| NO HIT | HIT    | BIOMETRIC\_MISMATCH |

Se nenhum dedo ou face for considerado HIT nem NO\_HIT:

* com incerteza biométrica, gera uma exceção BIOMETRIC
* com certeza biométrica, gera uma exceção BIOMETRIC\_INCONCLUSIVE

#### Próxima biometria

A próxima biometria a ser avaliada será:

* Pertencente a um candidato com exceção em ANALYSIS
* Com uma decisão geral de UNCERTAIN
* Não alocada a ninguém
* De uma exceção onde a transação entrante ou a transação entrante e de referência contenham uma label com pelo menos uma das organizações das labels de permissão do usuário
  * Pode ser configurado a partir do endpoint com o parâmetro `origin`
    * `ENTRANT`, será filtrado apelas pela transação entrante
    * `BOTH`, será filtrado por ambas as transações

{% hint style="info" %}
A lista de organizações fornecida é hierárquica, o que significa que, se uma organização tiver filhos, todos os filhos serão considerados para encontrar exceções.\
Com a segurança ativada, esta lista de organizações é recuperada das permissões do usuário, sendo todas as permissões que começam com o prefixo da organização configurado, padrão "ori\_".
{% endhint %}

Digital e/ou face serão retornados de acordo com a permissão configurada do usuário, por padrão "tpca" para digitais e "fca" para face, ou de acordo com a requisição para digital ou face

Se a configuração de "double blind" estiver ativada, o usuário alocado para a biometria não pode ter decidido sobre previamente sobre biometria

A ordem para pr'xoima biometria é decidida por prioridade e a ordem fornecida no endpoint. Caso nenhuma seja fornecida, por padrão a ordem é a partir do mais antigo.

GET next biometric irá retornar o número de biometrias disponíveis para serem tratadas, que são

* Todas as UNCERTAIN de target BIOMETRIC com status ANALYSIS não decididas pelo usuário que está fazendo a requisição de next biometric, disponíveis para a organização a que o usuário pertence e, caso seja pedido por digital ou face, serão contadas a partir da seleção escolhida

Com uma biometria selecionada, ela será alocada para o usuário por 5 minutos.

### Destravamento Manual

Pode ser feito usando o endpoint `Unlock biometric`

### Para cada tratamento biométrico

As validações a serem feitas são:

* Usuário deve ser fornecido, a menos que a segurança esteja ativada, nesse caso, o usuário é fornecido pelo token
* Timeout é zero por padrão, quando o tratamento é final e a exceção é tratada como APPROVE, esse valor é utilizado
* Parâmetros obrigatórios: `enroll TGUID, exception PGUID, decision` e `index`
* Exceção deve existir e estar em ANALYSIS e em target BIOMETRIC (os outros tipos não são tratados nessa etapa)
* Candidato da exceção deve ter um índice e classficado como UNCERTAIN
* O candidato a biometria deve estar alocado para o usuário ou não alocado para nenhum outro usuário
* O usuário não pode ter tomado uma decisão para esse candidato anteriormente
* A biometria deve estar alocada ao usuário

Se tudo passar, a decisão é marcada no candidato e o candidato é liberado (desalocado)

### Double Blind

| Double Blind | Decisão                                                                                                       |
| ------------ | ------------------------------------------------------------------------------------------------------------- |
| Ligado       | A decisão é final quando houverem decisões iguais suficientes (configurado em gbds.csi.doubleBlind.threshold) |
| Desligado    | Final                                                                                                         |

### Decisão final

Caso a decisão não seja final, o status da exceção é NOT\_FINAL

Se a decisão for final e todas os tratamentos necessários são concluídos:

#### Cadastro

**APPROVE -** Não hit de **d**edo e face atingem a quantia mínima de contagem para cadastro, sendo considerado falso positivo

**BIOGRAPHIC -** Hit de dedo e face atingem o a contagem mínima para cadastro

**BIOMETRIC\_MISMATCH -** Se os hits de dedo e os não hits de face/não hits de dedo e hits de face atingem o mínimo de contagem para cadastro

**BIOMETRIC\_INCONCLUSIVE -** Caso todas as decisões forem tomadas mas nenhuma conclusão é atingida

#### Atualização

**APPROVE -** Caso hit de dedo e face atingem o valor mínimo de contaem para atualização, sendo considerado falso negativo

**BIOGRAPHIC -** Não hit de dedo e face atingem o a contagem mínima para atualização

**BIOMETRIC\_MISMATCH -** Se os hits de dedo e os não hits de face/não hits de dedo e hits de face atingem o mínimo de contagem para atualização

**BIOMETRIC\_INCONCLUSIVE -** Caso todas as decisões forem tomadas mas nenhuma conclusão é atingida (todos HIT, NO\_HIT ou UNCERTAIN\_EXPERT, mas sem um valor mínimo definido)

### Prioridade

Quando uma exceção é priorizada ou despriorizada, todas as exceções para o mesmo entrante são afetadas.


# Target Biográfico

Documentação relacionada ao Target Biográfico e seu comportamento.\
Essa funcionalidade está disponível apenas a partir da versão 5 do GBDS.

## Comportamento

### Em geração de exceção

Toda vez que uma exceção é gerada, um grupo correspondente é criado/atualizado com:

* status: ANALYSIS
* target: de acordo com o tipo de exceção; se há mais de uma exceção para um dado TGUID, o tipo do grupo é BIOMETRIC se houver alguma exceção BIOMETRIC
* Sem prioridade
* Organizações: todas as organizações de exceção apontando para o grupo e exceção com indicação de origem ENTRANT ou REFERENCE

### Em cada tratamento de exceção biométrica

Caso não haja um grupo de exceção, ele será criado a partir dos TGUIDs das exceções

#### Definição de Target

* Caso haja alguma exceção BIOMETRIC\_MISMATCH, o grupo será definido como BIOMETRIC\_MISMATCH
* Caso todas as exceções do sejam BIOMETRIC\_INCONCLUSIVE, BIOMETRIC\_MISMATCH ou BIOGRAPHIC:
  * BIOMETRIC\_MISMATCH se houver alguma exceção BIOMETRIC\_MISMATCH
  * BIOMETRIC\_INCONCLUSIVE se houver alguma exceção BIOMETRIC\_INCONCLUSIVE
  * Caso contrário, o grupo será do tipo BIOGRAPHIC
* Caso a exceção tenha um resultado final associado, no caso em que todas as exceções para TGUID forem tratadas sem CSI, a decisão do grupo mudará:
  * Resultado final APPROVED, decisão do grupo é alterada para APPROVED
  * Se o resultado final for REJECT, a decisão do grupo é alterada para REJECT

### Priorização de exceção biométrica

Quando uma exceção é priorizada usando endpoint set priority, o grupo também será priorizado

Caso todas as exceções sejam despriorizadas, o grupo será despriorizado também (usando o mesmo endpoint)

### Próximo grupo de exceção

Quando o próximo grupo de exceção é requisitado, ele deve ter:

* status ANALYSIS
* target BIOGRAPHIC, BIOMETRIC\_MISMATCH ou BIOMETRIC\_INCONCLUSIVE
* Não estar alocado para ninguém
* O grupo deve possuir uma organização dentre as organizações do usuário
  * Caso não tenha sido requisitada uma origem da organização, será considerado o grupo com todas as organizações
  * Caso a origem requisitada seja ENTRANT ou BOTH, será considerado o grupo com a organização na origem pedida.
* Os grupos são ordenados por prioridade, pendência e data de criação em ordem crescente, por padrão
* O usuário deve possuir permissão biográfica

Com um grupo selecionado, o usuário será alocado para esse grupo por um dado tempo, de acordo com a configuração. Se a configuração tiver valor -1 o grupo nunca será desalocado e precisará ser desalocado manualmente através do endpoint **Unlock Group.**

### Alocação e desalocação manual

Pode ser feito a partir dos endpoints **Lock group** e **Unlock group**

Um grupo não pode ser alocado se ele já estiver alocado para outro usuário e não pode ser desalocado se não estiver alocado para o usuário em fornecido

### Para cada tratamento de grupo

As validações a serem feitas são:

* Usuário e permissões devem ser fornecidos, a menos que a segurança esteja ativada, nesse caso, ambos são fornecidos pelo token
* Timeout é zero por padrão, quando o tratamento é final e a exceção é tratada como APPROVE, esse valor é utilizado
* GGUID do grupo e o status de decisão do grupo (KEEP or REJECT) são obrigatórios
* Grupo deve existir e estar em status/target ANALYSIS/BIOGRAPHIC, BIOMETRIC\_MISMATCH ou BIOMETRIC\_INCONCLUSIVE
* Grupo deve estar alocado ao usuário
* O usuário deve ter alguma organização presente no grupo
* O usuário não pode ter tomado uma decisão para esse candidato anteriormente
* A biometria deve estar alocada ao usuário

Caso a decisão de status seja **KEEP**:\
**Cadastro -** Parâmetros devem ser fornecidos com pelo menos uma chave, biográficos e labels são opcionais e todos os TGUIDs a serem armazenados devem ser de exceções do grupo, do entrante ou da referência

**Atualização -** os TGUIDs a serem armazenados devem ser de exceções do grupo, podem ser mantidos entrante e/ou referência.

Se todas as validações forem aprovadas, a decisão do usuário, o usuário, comentários e parâmetros serão salvos no grupo

### Remocão de transações do grupo em tratamento

Para remover transações que pertencam a exceções de BIOMETRIC\_MISMATCH ou BIOMETRIC\_INCONCLUSIVE as transações devem ser fornecidas através de parâmetros que serão removidos usando `removeTransactions` nos parâmetros.

Nesse caso:

* O grupo deve ser um grupo de exceção de cadastro
* Não é permitido remover a transação entrante
* As transações removidas devem ser do grupo de transações de referência de qualquer grupo de exceção biométrica inconclusiva ou não correspondente (mismatch)
* Transações de remoção não devem conflitar com transações de permanência

### Decisão pendente

Caso o usuário requisite uma rejeição de alguma transação cujas organizações não se encontram em suas organizações, o grupo é marcado com status PENDING e o tratamento do grupo é feito pelo endpoint `treat pending group`&#x20;

### Atualização de grupo de exceção

* REJECT: rejeita entrante e referência e deleta as referências
* KEEP: mantém apenas referência
  * Rejeita todas as exceções
* KEEP: mantém o entrante
  * Rejeita todas as exceções
  * Deleta as referências
  * Reenvia a transação entrante como cadastro
* KEEP: referência e entrante são mantidos
  * Todas as exceções são aprovadas

{% hint style="info" %}
Caso sejam fornecidas transações para serem removidas, elas não serão aplicadas ao perfil unificado e seus perfis não serão deletados
{% endhint %}

### Grupo em tratamento pendente

Para grupos em que a decisão de tratamento está pendente, o tratamento é feito com o endpoint de `treat pending group`&#x20;

A validações diferem do tratamento regular em:

* O grupo deve estar pendente de decisão
* o usuário deve ter uma organização presente em todas as transações do grupo.

Caso a transação seja rejeitada, o grupo volta para o status de ANALYSIS

Se for aceita, o tratamento será feito como descrito acima.

### Prioridade

Quando um grupo é priorizado ou despriorizado, todas as exceções para o mesmo grupo são afetadas.


# Validação de Chaves

A partir do GBDS 5 foram adicionadas novas configurações na API

<table><thead><tr><th width="261.727294921875">Configuração</th><th>Valor Padrão</th></tr></thead><tbody><tr><td>gbds.keyValidation.oneKeyOnly</td><td>false</td></tr><tr><td>gbds.keyValidation.keyFormat</td><td>false</td></tr><tr><td>gbds.keyValidation.inconsistentKeys</td><td>true</td></tr></tbody></table>

## Comportamento

### Validação de chave única

A API rejeitará qualquer transação que possua mais de uma chave (enroll, update, trusted enroll e trusted update)

### Validação de formato de chave

A API rejeitará qualquer transação cujas chaves não passarem na validação de formato.

A API irá avaliar o formato na tabela `gbds.key_format` para cada ID de chave fornecida

A API irá checar os seguintes:

| Tipo         | Validação                                                                         |
| ------------ | --------------------------------------------------------------------------------- |
| CPF          | Deve passar a validação de soma para CPF                                          |
| TITULO       | Deve passar a validação de soma para o título                                     |
| REGEX        | Deve passar o regex fornecido no campo `regex`                                    |
| ALPHANUMERIC | Chave deve possuir apenas caracteres alfa numéricos                               |
| NUMERIC      | Chave deve possuir apenas caracteres numéricos                                    |
| ALPHABETIC   | Chave deve possuir apenas caracteres alfabéticos                                  |
| LENGTH       | Caso seja configurado um tamanho mínimo/máximo, a chave terá seu tamanho validado |

### Chaves Inconsistentes

Quando essa configuração está ativada, a transação será rejeitada em enroll/update/trusted com chaves potencialmente inconsistentes quando uma atualização for executada

Casos de chaves inconsistentes:

* Se o payload for fornecido com mais de uma chave e essas chaves coincidirem com mais de uma pessoa

| IDs       | Chaves no Payload | Pessoa 1 na Database | Pessoa 2 na Database |
| --------- | ----------------- | -------------------- | -------------------- |
| ***cpf*** | cpf-01            | cpf-01               | -                    |
| ***rg***  | rg-01             | -                    | rg-01                |

* Se o payload for fornecido com mais de uma chave e uma chave coincidir com a chave de uma pessoa mas essa pessoa possui qualquer outra chave com ID que coincide com outra chave no payload, mas com valor diferente.

| IDs       | Chaves no Payload | Pessoa na Database |
| --------- | ----------------- | ------------------ |
| ***cpf*** | cpf-01            | cpf-01             |
| ***rg***  | rg-01             | rg-02              |

O id "rg" coincide no payload e na pessoa na database, mas ambos tem valores diferentes

{% hint style="info" %}
Com a configuração desativada, a transação acima irá gerar uma exceção como ocorre no GBDS 4
{% endhint %}


# Tratamento Recusado

Quando uma transação é recusada (REFUSED), uma exceção é criada. Agora um grupo será criado também, com status REFUSED.

{% hint style="info" %}
Uma transação é recusada quando o perfil entrante coincide com um perfil na base que já está envolvido em uma exceção
{% endhint %}

O grupo de exceção recusada agora é relacionado com todos os grupos de exceção responsáveis pela recusa da transação

Quando um grupo de exceção é tratado, todos os grupos de exceção recusado que estejam ligados ao grupo de exceção tratados são analisados. \
Caso todos os grupos de exceção que bloquearam o grupo de exceção recusada  forem tratados, a transação recusada será enviada de novo como uma nova transação, de acordo com a operação original (enroll ou update)\
A nova operação pode gerar suas próprias exceções, de acordo com o fluxo da operação escolhida

Esse processo é registrado no log de operação e o status de reenvio e o novo TGUID são armazenados no grupo de exceção recusada de origem, sendo retornados em `get/list exception groups` (status e novo TGUID) e `get/list transaction` (apenas o novo TGUID).

O processo é executado na LEADER API em uma thread separada de tratamentos regulares.

### Priorização

Com relação a prioridade, quando uma exceção ou um grupo é priorizado/despriorizado, todos os grupos de exceção recusada relacionados e grupos dependentes também são.

Um grupo de exceção recusada sempre irá aguardar pelos grupos de exceção que o travam, a não ser que o status de REFUSED seja mudado. O status pode ser alterado para REMOVED o que fará com que, mesmo que a exceção bloqueante seja tratada, ele não seja reenviado automaticamente. O status pode ser alterado de volta para que volte a aguardar o tratamento das exceções.

O processo é feito através do endpoint `Change refused status` .

<br>


# Análise de Lights Out

Quando um cadastro resulta em uma exceção, após o grupo de exceção ser criado e todas as exceções serem inseridas ele passará por uma análise de Lights Out.

{% hint style="warning" %}
A análise de Lights Out é uma funcionalidade disponível apenas a partir das versões 5 do GBDS
{% endhint %}

Uma exceção será analisada pelo Lights Out quando:

* Um grupo de exceções tiver todos os tratamentos biométricos finalizados
  * Nesse caso, a análise e tratamento de Lights Out são sincronizados com o tratamento na API.
* Quando um cadastro é terminado no Cluster do GBDS, gera uma exceção e o grupo de exceção possui target BIOGRAPHIC
  * Nesse caso, o GBDS Cluster irá marcar o grupo de exceção como READY para a análise de Lights Out na coluna `lights_out_status` em `gbds.exception_group`  e a análise é feita de maneira assincrona na API depois
  * O grupo de exceção pode ter uma ou mais exceções.

### Thread de Lights Out

Para analisar grupos de exceção para Lights Out, a API terá uma thread de serviço que irá executar na API classificada como `LEADER` na tabela `gbds.apis` quando:

* `gbds.lightsout.enabled` for true
* E os grupos de exceção estiverem marcados como READY na coluna `lights_out_status` da tabela `gbds.exception_group`

{% hint style="info" %}
A API irá se comportar como LEADER apenas se o hostname e porta configurados forem iguais aos descritos na tabela `gbds.apis`
{% endhint %}

### Análise de Lights Out

Dado que a API classificada como LEADER está rodando e um grupo de exceção marcado como READY foi selecionado para análise, os requisitos para que esse grupo seja tratado automaticamente são:

* O grupo de exceção deve ser de cadastro (enroll)
* O grupo de exceção não deve ter conflito de ID de chaves em suas transações (entrante incluso)
  * Chaves configuradas em `gbds.lightsout.enroll.unify.weakKeys` não são consideradas
* O grupo de exceção deve ter dados biográficos coincidentes entre todas suas transações (os IDs biográficos são configuráveis)
  * As chaves biográficas que devem coincidir são configuradas em `gbds.lightsout.enroll.unify.matchBiographics`&#x20;
  * Para que coincidam, **valor e ID** devem ser iguais (acentos não são diferenciados no valor)

### Tratamento de Lights Out

O grupo será tratado automaticamente uma vez que todos os requisitos anteriores forem cumpridos

#### KEEP

Serão mantidas:

* Todas as transações
* Todas as chaves
* Todos os biográficos de todas as transações
  * Se houver um conflito em ID biográfico, será mantido o valor da última transação
* Todas as labels são inclusas
* O usuário de tratamento será `lightsout`&#x20;
* O comentário de tratamento de grupo será definido para `Lights out automatic treatment`&#x20;

O grupo de exceção terá o critério usado salvo para referência futura, podendo ser (nonConflitantKeys, weakKeys, matchedBiographics)

### Busca de LightsOut

O status de um tratamento de Lights Out pode ser buscado da Base de Dados Relacional utilizando a query:

Para agrupar os tratamentos por status

```sql
SELECT eg.lights_out_status, COUNT(*)
FROM gbds.exception_group eg
group by eg.lights_out_status;
```

Para checar um grupo individualmente, buscando a linha inteira através do GGUID:

```sql
SELECT * FROM gbds.exception_group eg WHERE eg.gguid = 'xxxx';
```

### Reprocessamento

Para enviar um grupo de exceção para análise de Lights Out basta mudar o status do grupo na tabela `gbds.exception_group` através da query (alterando o GGUID para o correspondente):&#x20;

```
UPDATE gbds.exception_group SET lights_out_status = 'READY' WHERE gguid = 'xxxx';
```

{% hint style="danger" %}
Não é recomendado que se altere grupos que já foram processados por AUTO\_TREAT
{% endhint %}

### Configurações

As configurações do Banco de Dados para Lights Out são:

<table><thead><tr><th width="266.09088134765625">Configuração</th><th>Tipo</th><th>Valor padrão</th><th>Descrição</th></tr></thead><tbody><tr><td>gbds.lightsout.enabled</td><td>API</td><td>true</td><td>Valor responsável por habilitar o Lights Out</td></tr><tr><td>gbds.lightsout.enroll.unify.weakKeys</td><td>API</td><td>-</td><td>Lista separada por vírgulas que define as chaves fracas (não serão consideradas na checagem de chaves)</td></tr><tr><td>gbds.lightsout.enroll.unify.matchBiographics</td><td>API</td><td>-</td><td>Lista separada por vírgulas que define quais biográficos deverão coincidir chave e valor (acentos não são considerados)</td></tr></tbody></table>

{% hint style="warning" %}
API deve estar classificada como LEADER na tabela `gbds.apis` e deve estar ativa
{% endhint %}


# Integração do GBDS

## Introdução

Este manual descreve brevemente cada fluxo padrão do GBDS como uma sequência de chamadas de API, que são pedidos HTTP/HTTPS para um servidor GBDS. Para referência completa das chamadas da API do GBDS, consulte o manual [GBDS API specification](https://docs.griaule.com/apis/).

O GBDS provê notificações assíncronas para operações demoradas. Os fluxos de notificação estão detalhados no [Manual de Fluxos de Notificação](/integracao-do-gbds/notifier).

A autenticação para todas as chamadas de API é realizada com a apresentação de um token válido. Um novo token pode ser criado com a chamada [createToken](https://gitbook.griaule.com/apis/gbds-4/tokens#post-tokens). Um token pode e deve ser usado para múltiplas chamadas. Criar um novo token antes de cada chamada afeta negativamente a performance do sistema.

Todos os diagramas neste manual seguem esta convenção:

![Convenções de Diagrama](/files/uB4jwd96RL2hbcfwQ3IE)

Além disso, o GBDS segue um índice para identificação biométrica, conforme representado na tabela abaixo:

| Índice | Biometria                                     |
| ------ | --------------------------------------------- |
| 0      | Mínimo Esquerdo                               |
| 1      | Anelar Esquerdo                               |
| 2      | Médio Esquerdo                                |
| 3      | Indicador Esquerdo                            |
| 4      | Polegar Esquerdo                              |
| 5      | Polegar Direito                               |
| 6      | Indicador Direito                             |
| 7      | Médio Direito                                 |
| 8      | Anelar Direito                                |
| 9      | Mínimo Direito                                |
| 10     | Face                                          |
| 13     | Íris Esquerda                                 |
| 14     | Íris Direita                                  |
| 20     | Assinatura                                    |
| 31     | Interdigital da Palmar Esquerda               |
| 32     | Tenar da Palmar Esquerda                      |
| 33     | Hipotenar da Palmar Esquerda                  |
| 34     | Interdigital da Palmar Direita                |
| 35     | Tenar da Palmar Direita                       |
| 36     | Hipotenar da Palmar Direita                   |
| 40     | Palmar Esquerda Completa                      |
| 41     | Writer da Palmar Esquerda                     |
| 45     | Palmar Direita Completa                       |
| 46     | Writer da Palmar Direita                      |
| 200    | Palmar Esquerda de Recém-Nascidos             |
| 210    | Palmar Direita de Recém-Nascidos              |
| 900    | Controle de Sequência - Mínimo Esquerdo       |
| 901    | Controle de Sequência - Anelar Esquerdo       |
| 902    | Controle de Sequência - Médio Esquerdo        |
| 903    | Controle de Sequência - Indicador Esquerdo    |
| 904    | Controle de Sequência - Polegar Esquerdo      |
| 905    | Controle de Sequência - Polegar Direito       |
| 906    | Controle de Sequência - Indicador Direito     |
| 907    | Controle de Sequência - Médio Direito         |
| 908    | Controle de Sequência - Anelar Direito        |
| 909    | Controle de Sequência - Mínimo Direito        |
| 940    | Controle de Sequência - Quatro Dedos Esquerdo |
| 941    | Controle de Sequência - Quatro Dedos Direito  |
| 942    | Controle de Sequência - Dois Polegares        |

## Fluxo de Cadastro (Enroll)

Neste caso, o usuário quer inserir uma nova pessoa no ABIS. Para tal, o usuário realiza uma chamada [enroll](https://gitbook.griaule.com/apis/gbds-4/people#post-people) (uma solicitação *POST* para o endpoint */gbds/v2/people*).

![Fluxo de Cadastro](/files/jQrLTPIPH1UjdI5Acjxn)

Uma chamada de enroll bem-formada retornará uma resposta HTTP com um ID único de transação (*tguid*) como **data.tguid** e uma string de status em **data.status**.

O **tguid** será usado para identificar esta transação em chamadas futuras e notificações assíncronas.

O usuário será [notificado](/integracao-do-gbds/notifier) quando o GBDS concluir o processamento da transação. O usuário também pode consultar o status da transação com a chamada [getTransaction](https://gitbook.griaule.com/apis/gbds-4/transaction#get-people-transactions-tguid) (uma solicitação *GET* para o endpoint */gbds/v2/people/transactions/{tguid}*).

Se a transação for concluída com sucesso (status *ENROLLED*), um identificador único de pessoa (**pguid**) será gerado para operações de consulta como *getPerson*.

O status de uma transação de cadastro pode ser:

**ENQUEUED**

> A transação foi enfileirada para processamento.

**PROCESSING**

> A transação está sendo processada.

**FAILED**

> A transação de cadastro não pôde ser completada. Esta situação é consequência de tratamento de exceção ou de tratamento de controle de qualidade.

**EXCEPTION**

> O cadastro gerou pelo menos uma exceção, e a transação permanecerá neste estado até que a exceção seja tratada (pela aplicação GBS ETR ou programaticamente).

**PENDING**

> O cadastro falhou no controle automático de qualidade, e a transação permanecerá neste estado até que a análise de qualidade seja realizada (pela aplicação GBS MIR ou programaticamente).

**ENROLLED**

> O cadastro foi concluído com sucesso, e a transação é associdada a um identificador único de pessoa válido (**pguid**), que pode ser obtido com a chamada *getTransaction*.

**REFUSED**

> A transação entrante foi recusada por ter casado com outra transação associada a uma ou mais exceções ativas pendentes.

## Fluxo de Atualização (Update)

Neste caso, o usuário deseja atualizar os dados associados a uma pessoa já existente no ABIS. Se o usuário não tem o identificador de pessoa (**pguid**), ele deve obtê-lo usando uma chave biográfica ou um identificador de transação (**tguid**):

* Para obter um **pguid** a partir de chaves biográficas, o usuário deve chamar [getPGuidUsingKeys](https://gitbook.griaule.com/apis/gbds-4/people#get-people-pguid-1) (uma solicitação *GET* para o endpoint */gbds/v2/people/pguid*).
* Para obter o **pguid** associado a um **tguid** conhecido, o usuário deve chamar [getTransaction](https://gitbook.griaule.com/apis/gbds-4/transaction#get-people-transactions-tguid).

Para realizar a atualização, o usuário deve chamar [update](https://gitbook.griaule.com/apis/gbds-4/people#put-people-pguid) (uma solicitação *PUT* para o endpoint */gbds/v2/people/{pguid}*).

![Fluxo de Atualização](/files/NQ4EwL9Hb9CDM29AAz2j)

Uma chamada de atualização bem-formada retornará uma resposta HTTP com um identificador único de transação (*tguid*) como **data.tguid** e uma string de status em **data.status**.

Chamadas de atualização que modifiquem dados biométricos serão processadas de modo similar a transações de cadastro (Enroll), podendo gerar exceções e análise de qualidade (status *EXCEPTION* e *PENDING*), e gerarão notificações para quem iniciou a transação. O status da transação também pode ser consultado com chamadas *getTransaction*.

Chamadas de atualização que modifiquem apenas dados biográficos serão processadas de forma síncrona. A resposta HTTP conterá apenas um status *OK* ou *ERROR*.

## Fluxo de Verificação

Nesta caso, o usuário deseja realizar uma busca de *Verificação* (1:1), comparando dados biométricos a uma pessoa específica no ABIS. O alvo da busca deve ser identificado por um único **pguid** ou por uma chave biográfica.

Para realizar a verificação, o usuário deve chamar [search](https://gitbook.griaule.com/apis/gbds-4/searches#post-people-searches) (uma solicitação *POST* para o endpoint */gbds/v2/people/searches*). O perfil alvo da comparação deve ser dado por uma chave biográfica no parâmetro **data.keys** ou por um *pguid* em **data.pguids**.

![Fluxo de Verificação](/files/nvP2wC4f7tj9PCaD8IN2)

A resposta HTTP trará o resultado da verificação no campo **data.status**, que pode ser:

**MATCH**

> Os dados biométricos fornecidos casaram com o registro da pessoa no ABIS.

**NOT\_MATCH**

> Os dados biométricos fornecidos não casaram com o registro da pessoa no ABIS.

**PERSON\_NOT\_FOUND**

> A pessoa-alvo (**pguid** ou chave biográfica) não foi encontrada na base de dados.

Um identificador de transação (**data.tguid**) também será retornado, e maiores detalhes sobre a operação de verificação podem ser obtidos com a chamada [getSearchResult](https://gitbook.griaule.com/apis/gbds-4/searches#get-people-searches-tguid) (uma solicitação *GET* para o endpoint */gbds/v2/people/searches/{tguid}*).

### Verificação com Múltiplos GUIDs

O endpoint `/gbds/v2/people/searches` permite requisições de verificação com multiplos PGUIDs ou multiplos UGUIDs no caso de verificação de latentes.

Isso permite alguns novos recursos:

1. Verificação de vários PGUIDs
   * Valida verificação com lista de pguids. Apenas se `isUlSearch` for definido como `false`.
   * Valida verificação com lista de chaves, usando o atributo `keys`.
     * A lista filtra apenas uma pessoa.
     * Este recurso é válido apenas se `isUlSearch` for definido como `false`.
2. Verificação de vários UGUIDs usando `isUlSearch=true`.
   * Usa o atributo `uguids` como uma lista de strings.
   * Valida a verificação com esta lista de uguid. Apenas se `isUlSearch` for definido como `true`.
3. Pesquisa de latente em pguids/uguids
   * A pesquisa de latente estará ativada se `isLatentSearch` definido como `true` para busca de pguids. Para busca de uguids o valor é sempre `true`.

## Fluxo de Identificação

Neste caso, o usuário deseja realizar uma busca de *Identificação* (1:N), comparando dados biométricos para vários (possivelmente todos) registros no ABIS.

Para realizar a identificação, o usuário deve chamar [search](https://gitbook.griaule.com/apis/gbds-4/searches#post-people-searches) (uma solicitação *POST* para o endpoint */gbds/v2/people/searches*) mantendo vazios os parâmetros **data.keys** e **data.pguids**.

{% hint style="warning" %}
No caso de uma busca de identificação, o atributo `matcher` **DEVE** ser definido como `DEFAULT`. Usar o valor `MOBILE` resultará no retorno de um erro ao usuário.
{% endhint %}

![Fluxo de Identificação](/files/HTFlHIXHyKKZp1xbnwAD)

Buscas de identificação são realizadas de forma assíncrona. Uma chamada de busca bem-sucedida retornará uma resposta HTTP com um identificador de transação (**data.tguid**) e um status (**data.status**).

O usuário receberá uma notificação quando a busca for concluída. O usuário também pode consultar o status da transação com a chamada [getSearchResult](https://gitbook.griaule.com/apis/gbds-4/searches#get-people-searches-tguid) (uma solicitação *GET* para o endpoint */gbds/v2/people/searches/{tguid}*).

O status da transação de busca pode ser:

**ENQUEUED**

> A busca está enfileirada, e ainda não começou a ser processada.

**PREPARED**, **PROCESSING**

> Estes valores indicam que a busca está sendo processada.

**MATCH**

> A busca foi processada, e pelo menos um casamento foi encontrado. Os casamentos são retornados no campo **data.cadidates** da resposta a *getSearchResult*.

**NOT\_MATCH**

> A busca foi processada e nenhum casamento foi encontrado.

**PERSON\_NOT\_FOUND**

> O domínio de busca estava vazio: o filtros especificados, como lista de pguids e/ou filtros de labels resultaram em um conjunto vazio de candidatos.

## Fluxos de Recuperação de Cadastro

Essa seção apresentará os fluxos para recuperar informações de perfis usando o GBDS. Para opções avançadas de filtragem nas chamadas de `listPeople` e `listTransactions`, consulte o Manual [Usando Coringas para Recuperar Informação do GBDS](#usando-coringas-para-recuperar-informacao-do-gbds).

### Recuperando o Cadastro de uma Única Pessoa

Para obter os dados mais atuais associados a uma pessoa específica, o usuário deve chamar [getPerson](https://gitbook.griaule.com/apis/gbds-4/people#get-people-pguid) (uma solicitação *GET* para o endpoint */gbds/v2/people/{pguid}*).

![Fluxo de getPerson](/files/qnZMp68t1GcIZCve0XYn)

A resposta HTTP conterá os dados biográficos da pessoa e a mais recente transação de cadastro (Enroll) associada a ela.

### Obtendo o Pguid a partir de Chaves Biográficas

Para obter o identificar único de uma pessoa (**pguid**) a partir de uma chave biográfica, o usuário deve chamar [getPguidUsingKeys](https://gitbook.griaule.com/apis/gbds-4/people#get-people-pguid-1) (uma solicitação *GET* para o endpoint */gbds/v2/people/pguid*).

![Fluxo de getPguidUsingKeys](/files/DWfsFtPYKaAfCJtzHuDd)

### Obtendo o Pguid a partir de Dados Biográficos

Para obter uma lista de identificadores de pessoa (**pguids**) que casam dados biográficos (e não apenas chaves), o usuário pode chamar [listPeople](https://gitbook.griaule.com/apis/gbds-4/people#post-people-list) (uma solicitação *POST* para o endpoint */gbds/v2/people/list*).

![Fluxo de listPeople](/files/TB3BY2TogXNvv7PtcXiR)

{% hint style="info" %}
É possível realizar uma chamada de listPeople fornecendo somente o `valor` que será usado para filtrar por chave ou biográfico.

Esse formato de solicitação só pode ser usada para listas filtradas por chaves ou biográficos. Se o critério de filtragem for qualquer outro campo, deve ser especificado no formato de `campo:valor`.
{% endhint %}

#### Critérios do Campo Restriction

É possível realizar uma chamada de [listPeople](https://gitbook.griaule.com/apis/gbds-4/people#post-people-list) fornecendo os critérios para filtrar a lista retornada. O campo `restriction` deve conter um array de objetos que variam de acordo com o tipo de dado (representado pelo campo `type`) usado como patâmetro de filtragem. Cada chamada pode conter uma ou mais restrições, os tipos aceitos são: **BIOGRAPHIC**, **DATE**, **KEY** e **LABEL**. Os objetos para cada tipo são listados abaixo:

* **BIOGRAPHIC**:

| Campo                                    | Requerido                                                                                | Tipo                                  |
| ---------------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------- |
| type                                     | Sim. O valor DEVE ser BIOGRPAHIC                                                         | String                                |
| id                                       | Sim                                                                                      | String                                |
| value                                    | Sim                                                                                      | String                                |
| exists                                   | Sim. Padrão true.                                                                        | Boolean                               |
| <p>matchMode<br><br><br><br><br><br></p> | <p>Padrão EXACT. Enum:<br>- START<br>- EXACT<br>- ANYWHERE<br>- END<br>- NOT\_EQUALS</p> | <p>String<br><br><br><br><br><br></p> |

* **DATE**:

| Campo     | Requerido                        | Tipo   |
| --------- | -------------------------------- | ------ |
| type      | Sim. O valor DEVE ser DATE       | String |
| startTime | Sim. Deve estar em milisegundos. | String |
| endTime   | Não. Deve estar em milisegundos  | String |

* **KEY**:

| Campo                                    | Requerido                                                                                | Tipo                                  |
| ---------------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------- |
| type                                     | Sim. O valor DEVE ser KEY                                                                | String                                |
| id                                       | Sim                                                                                      | String                                |
| value                                    | Sim                                                                                      | String                                |
| exists                                   | Sim. Padrão true.                                                                        | Boolean                               |
| <p>matchMode<br><br><br><br><br><br></p> | <p>Padrão EXACT. Enum:<br>- START<br>- EXACT<br>- ANYWHERE<br>- END<br>- NOT\_EQUALS</p> | <p>String<br><br><br><br><br><br></p> |

* **LABEL**:

| Campo  | Requerido                 | Tipo    |
| ------ | ------------------------- | ------- |
| type   | Sim. O valor DEVE ser KEY | String  |
| label  | Sim                       | String  |
| exists | Sim. Default true.        | Boolean |

## Fluxo de Transações Recusadas (*REFUSED*)

O resultado *REFUSED* irá ocorrer em atualizações e cadastros quando uma nova transação casar com uma transação existente que estiver associada a uma exceção biométrica pendente.

### Transações Síncronas

Quando uma transação é submetida a uma operação síncrona, a resposta conterá um campo `data.status` com o valor *REFUSED*:

```json
{
	"data":
	{
		"status":"REFUSED",
		"tguid": "string"
	}
}
```

### Transações Assíncronas

No caso de uma transação de cadastro submetida assincronamente, a resposta conterá um campo `data.status` com o valor *ENQUEUED*:

```json
{
	"data":
	{
		"status":"ENQUEUED",
		"tguid": "string"
	}
}
```

#### Recebendo a Notificação

Quando o GBDS finaliza o processamento de uma transação, o *GBS Notifier* envia uma notificação a um *endpoint* configurado com o TGUID e o resultado do processamento (*status*) da transação. Se a transação for recusada, o *Notifier* mandará uma notificação no formato:

```json
{
	"operation": "ENROLL",
	"tguid": "string",
	"status": "REFUSED"
}
```

ou

```json
{
	"operation": "UPDATE",
	"tguid": "string",
	"status": "REFUSED"
}
```

{% hint style="warning" %}
Depois de receber a notificação de uma transação recusada (*REFUSED*), uma chamada de *getTransaction* deve ser submetida ao GBDS com o TGUID como parâmetro para que possa se obter os detalhes envolvendo a transação e suas exceções.

A operação de *getTransaction* é descrita na próxima seção, enquanto a informação sobre como tratar uma transação recusada é descrita na seção [Tratando uma Transação Recusada](#tratando-uma-transacao-recusada-refused).
{% endhint %}

#### Realizando Consulta Ativa

Para realizar consulta ativa para obter os resultados de uma transação, uma chamada de *getTransaction* deverá ser submetida ao GBDS com o TGUID do cadastro como um parâmetro com o seguinte *endpoint*:

`http://<ip>:8085/gbds/v2/people/transactions/{tguid}`

O resultado dessa chamada conterá um campo `data.status` com o valor *REFUSED*, como mostrado no exemplo abaixo:

```json
{
	"data":
	{
		"tguid": "string",
		"pguid": "string",
		"status": "REFUSED",
		"timestamp": 0,
		"progress": 0,
		"Candidates": [],
		"Person": {},
		"qualityAnalysis": {},
		"failReason": "Enroll matches 2 person(s) that are already involved in a pending exception. PGUIDs: 75ABF575-6825-41D7-A2A7-2C0D64CF9FE7, B393C481-C0AF-456C-9155-1510AFDC7D86",
		"isCurrentTransaction": false
	}
}
```

### Tratando uma Transação Recusada (REFUSED)

Como mencionado previamente, uma transação recusada ocorre quando um perfil entrante casa com um existente que está vinculado a uma exceção ativa. Quando uma transação finaliza com esse status, o perfil entrante é descartado e uma nova transação deve ser submetida para esse perfil após as exceções ativas pendentes serem tratadas.

Depois de identificar o cadastro recusado e executar as chamadas de *getTransaction*, o campo *`failReason`* da resposta do *getTransaction* conterá os PGUIDs do perfil de referência que o perfil entrante casou. A quantidade de PGUIDs retornada na resposta é ilimitada e separada por vírgulas.

Depois que todas as exceções forem tratadas, o cadastro recusado pode ser ressubmetido.

O fluxo de trabalho completo para resolver com cadastros recusados é:

{% hint style="warning" %}
O mesmo fluxo de trabalho pode ser usado para resolver atualizações recusadas usando os comandos equivalentes.
{% endhint %}

**Exemplo:**

1. Cadastro 1 - Gera TGUID 1 e PGUID 1;
   1. TGUID 1 - cria uma exceção biométrica com um PGUID 0 já existente;
   2. A aplicação é notificada com:

      ```json
      {
      	"operation": "ENROLL",
      	"tguid": "<TGUID 1>",
      	"status": "EXCEPTION"
      }
      ```
   3. Salve TGUID 1 e PGUID 1
2. A aplicação executa GET /gbds/v2/exceptions/{tguid}
   1. E a resposta é:

      ```json
      {
      	"data": [
      		{
      			"transactionTimestamp": 0,
      			"match": {
      				"matchedPersonPguid": "PGUID 0",
      				"matchedPersonTguid": "TGUID 0",
      				"biometricMatches": []
      			}
      		}
      	],
      	"pagination": {
      		"total": 0,
      		"count": 0,
      		"pageSize": 0,
      		"currentPage": 0,
      		"totalPages": 0
      	}
      }
      ```
   2. Crie e salve um mapeamento artificial do PGUID 0 ao PGUID 1 / TGUID 1
3. Cadastro 2 - TGUID 2;
   1. TGUID 2 casa com PGUID 0;
   2. TGUID 2 - recebe status *REFUSED* porque casou com o PGUID 0 que já estava vinculado a uma exceção;

      ```json
      {
      	"data": {
      		"tguid": "string",
      		"pguid": "string",
      		"status": "REFUSED",
      		"timestamp": 0,
      		"progress": 0,
      		"Candidates": [],
      		"Person": {},
      		"qualityAnalysis": {},
      		"failReason": "Enroll matches 1 person(s) that are already involved in a pending exception. PGUIDs: PGUID 0",
      		"isCurrentTransaction": false
      	}
      }
      ```
4. Salve o PGUID `<PGUID 0>` associado com TGUID 2;
   1. Atualize o mapeamento indicando que PGUID 0 / PGUID 1 / TGUID 1 / TGUID 2 estão vinculados
5. Um examinador resolve a exceção gerada no Passo 1:
   1. A aplicação é notificada com:

      ```json
      {
      	"operation": "TREAT_EXCEPTION",
      	"tguid": "<TGUID 1>",
      	"status": "OK",
      	"treatment": "TREATMENT_OPTION"
      }
      ```
6. Envie um novo cadastro para o TGUID 2.

{% hint style="warning" %}
É possível que um PGUID que casou ter multiplas exceções vinculadas a ele. Nesse cenário, todas exceções para o PGUID devem ser tratadas antes de tentar ressubmeter o cadastro ou atualização recusada.
{% endhint %}

É importante mencionar que o fluxo de trabalho acima deve ser implementado para completar automaticamente as transações sem nenhuma intervenção manual.

Em outras palavras, para obter o resultado final para essa transação (TGUID 2), é necessário aguardar a notificação do *GBS Notifier* informando o tratamento da exceção para a exceção existente (TGUID 1) e executar a chamada de *getTransaction* para recuperar a informação sobre os PGUIDs que casaram do GBDS (veja as seções [Recebendo a Notificação](#recebendo-a-notificacao) e [Realizando Consulta Ativa](#realizando-consulta-ativa)).

## Usando Coringas para Recuperar Informação do GBDS

Quando recupera-se informação do GBDS usando [List Transactions](https://gitbook.griaule.com/apis/gbds-4/transaction#get-people-transactions) e [List People](https://gitbook.griaule.com/apis/gbds-4/people#post-people-list), é possível usar operadores coringas para filtrar os resultados.

Quando realiza-se uma chamada de [List Transactions](https://gitbook.griaule.com/apis/gbds-4/transaction#get-people-transactions) usando o parâmetro `qualityStatus`, os campos `key`, `biographic`, e `label` podem ser filtrados usando operadores conringas.

Os operadores coringas são descritos abaixo:

### List Transactions

#### Sufixos

Os campos key ou biographic podem conter um `id:value` ou `id|value`, como por exemplo `Name:John Doe`, onde quatro sufixos podem ser inseridos.

* **\[anywhere]**: Esse é o sufixo padrão, se nenhum for escrito, esse será selecionado. Nesse caso, a aplicação procurará pelo id ou valor fornecido em qualquer parte da string.

  > Exemplo: Se a chave é `name[anywhere]:rob`, será procurado por nomes (name) como "Robbin" sobrenomes (surname) "Robarts".
* **\[atstart]**: Se esse sufixo for usado, a aplicação procurará pelo id ou valor fornecido no início da string.

  > Exemplo: Se a chave for `passportNumber:123[atstart]`, será procurado por números de passaporte que começam com 123 e retornará todos casos válidos.
* **\[atend]**: Se esse sufixo for usado, a aplicação procurará pelo id ou valor fornecido no final da string.

  > Exemplo: Se a chave for `passportNumber:123[atend]`, será procurado por números de passaporte que acabam com 123. `name[atend]:son` procurará por nomes (name) e sobrenomes (surname) que acabam com "son".
* **\[exact]**: Se esse sufixo é usado, a aplicação procurará por casamentos identicos ao fornecido na string de procura.

  > Exemplo: Se a chave for `passportNumber:123[exact]`, será procurado por números de passaporte que são exatamente iguais a 123.

{% hint style="warning" %}
Esses operadores coringa são **SUFIXOS**, então eles devem ser inseridos DEPOIS do ID e/ou DEPOIS do VALOR.
{% endhint %}

{% hint style="info" %}
Adicionalmente, id e valor podem ter diferentes sufixos para cada, então é possível haver operações como: `name[exact]:rob[atstart]`, onde será procurado por campos que são nomeados exatamente `name` por valores que começam com "rob".
{% endhint %}

#### Prefixos

O campo de biograficos pode também ter um prefixo. Esse prefixo pode ser usado somente no PRIMEIRO biográfico, antes do `id`. Outros prefixos serão ignorados. Esse prefixo irá definir qual operação lógica a aplicação executará entre **TODOS** os campos de biográficos e de chaves. Os valores aceitos são `[and]` e `[or]`, o primeiro sendo o valor padrão.

> Exemplo: Se o biográfico é `[or]id:value`, uma operação OR será executada em todas as chaves e biográficos, como: (Key1 OR Biographic1 OR Biographic2).

Esse prefixo pode ser combinado com um sufixo, então valores como `[or]id:value[exact]` são aceitos.

### List People

Quando realiza-se uma chamada de [List People](https://gitbook.griaule.com/apis/gbds-4/people#post-people-list), o parâmetro `operator` pode ser tanto `and` ou `or`. O operador selecionado será aplicado nas comparações entre `key`, `biographic` e `label`. Após, uma comparação `and` será feita com o valor de data desejado para filtragem dos dados.

Exemplo: Se o operador selecionado for `or`, a comparação para filtragem dos dados será: ((Key1 OR Biographic1 OR Biographic2 OR Label1) AND Date).

#### Restrictions matchMode

Dentro do objeto de restrições (restrictions), é possível selecionar um de cinco `matchMode` quando a restrição for um Biográfico ou uma Chave. Os possíveis valores e suas operações estão listados abaixo.

{% hint style="danger" %}
Tudo o que não é uma letra, um número ou um sublinhado é um separador. Um separador entre números ou letras causará a tokenização da palavra/número completo em todos os modos, exceto EXACT e NOT\_EQUALS.
{% endhint %}

{% hint style="warning" %}
No valor do filtro de restrição, apenas o espaço em branco \`\` \`\` é um delimitador e tokenizará as palavras/números. Esse comportamento não ocorre em EXACT e NOT\_EQUALS.
{% endhint %}

{% hint style="warning" %}
O parâmetro de pesquisa é sensível a caracteres especiais em letras, como â, é, ñ e outros.
{% endhint %}

{% stepper %}
{% step %}

#### EXACT

A operação *exact* pesquisa todo o valor fornecido. O uso de *exact* não tokenizará a expressão restrita. Este modo diferencia maiúsculas de minúsculas.

* Exemplo: A chamada deve retornar o valor "Jose Arruda". Usar EXACT com "Jose" ou "Arruda" funcionará para retornar o valor desejado.

{% hint style="info" %}
Pesquisas como "Jo" ou "rrud" não retornarão Jose Arruda.
{% endhint %}

* Examplo 2: A chamada deve retornar um valor numérico de um documento, como "123456". Usando EXACT o valor DEVE ser "123456".

{% hint style="info" %}
Pesquisas com o valor "123" ou "456" não retornarão o valor correto.
{% endhint %}

{% hint style="warning" %}
Se o valor for armazenado com um separador, o separador deverá estar no valor de restrição.
{% endhint %}
{% endstep %}

{% step %}

#### START

A operação de *start* filtrará os valores tokenizando cada palavra ou conjunto de números dividido por um separador.

* Exemplo: Se o usuário está restringindo START para o valor "Jo", alguns retornos possíveis podem ser:

  ```default
  Jose Arruda
  John Doe
  Marie Johnson
  ```
* Exemplo 2: Caso o usuário esteja restringindo START para o valor "Jose Arruda", alguns retornos possíveis podem ser:

  ```default
  Jose Arruda
  Jose Silva
  Pedro Thomas Arruda
  ```
* Exemplo 3: Se o usuário estiver restringindo START para o valor "123", alguns retornos possíveis podem ser:

  ```default
  1234567
  123.456
  456-123
  a-b 123
  ```
* Exemplo 4: Se o usuário está restringindo START para o valor "123.456", alguns retornos possíveis podem ser:

  ```default
  123.456
  123.456.789-90
  ```

{% endstep %}

{% step %}

#### ANYWHERE

A operação em *anywhere* buscará o valor em qualquer parte da palavra ou número.

* Exemplo: Se a restrição do usuário for ANYWHERE para o valor "Jo", alguns retornos possíveis podem ser:

  ```default
  Jose Arruda
  Major
  Pejorative
  Banjo
  ```
* Exemplo 2: Pesquisar por "12" pode retornar:

  ```default
  123456
  641256
  114-4312
  a-b 123
  ```
* Exemplo 3: Se a restrição do usuário for ANYWHERE para o valor "Jo Ru", alguns retornos possíveis podem ser:

  ```default
  Jose Arruda
  Ruth Silva
  Havier Russel
  ```

{% endstep %}

{% step %}

#### END

A operação *end* buscará o valor no FIM do token. Como START, esta operação tokenizará as palavras/números para cada separador.

* Exemplo: Se a restrição do usuário END para o valor "son", alguns retornos possíveis podem ser:

  ```default
  Eric Johnson
  Hudson Santos
  ```
* Exemplo 2: Se o usuário estiver restringindo END para o valor "Jose Arruda", alguns retornos possíveis podem ser:

  ```default
  Jose Arruda
  Jose Silva
  Pedro Thomas Arruda
  Arruda Bastos
  ```
* Exemplo 3: Se o usuário estiver restringindo END para o valor "123", alguns retornos possíveis podem ser:

  ```default
  4567123
  123.456
  456-123
  a-b 123
  ```
* Exemplo 4: Se o usuário estiver restringindo END para o valor "123.456", alguns retornos possíveis podem ser:

  ```default
  123.456
  789.123.456
  ```

{% endstep %}

{% step %}

#### NOT\_EQUALS

A operação *Not equals* funciona de modo inverso à operação EXACT. Ele filtrará e DESCARTARÁ correspondências exatas para o valor fornecido e mostrará TODOS OS OUTROS valores. Este modo diferencia maiúsculas de minúsculas.

* Exemplo: Usando NOT\_EQUALS com o valor "Jose" pode retornar:

  ```default
  John Doe
  Marie Johnson
  Josemar Rodrigues
  ```
* Exemplo 2: Usar NOT\_EQUALS com o valor "123" pode retornar:

  ```default
  4567123
  123456
  ```

{% endstep %}
{% endstepper %}


# Fluxos de Notificação

Quando o GBDS realiza operações de cadastro (enroll) e atualização (update), notificações são enviadas para endpoints designados para informar seus resultados. A entidade responsável por este fluxo é chamada Notificador.

Este documento descreve alguns fluxos de notificação durante operações de cadastro e atualização.

{% hint style="info" %}
Para informações adicionais sobre fluxos de notificação durante controle de sequência e controle de qualidade, consulte a documentação de [controle de sequência e controle de qualidade](/integracao-do-gbds/qualitycontrol).
{% endhint %}

{% hint style="info" %}
Todas as notificações enviadas pelo Notificador são HTTP POST para um endpoint configurado (`http://<endereço>:<porta>`), contendo um objeto JSON. O modelo do JSON para cada notificação está apresentado abaixo.
{% endhint %}

{% hint style="warning" %}
O endpoint que receberá a notificação **deve ser implementado individualmente** para cada sistema.
{% endhint %}

## Transação Aceita

Todas as transações assíncronas recebidas serão enfileiradas. Após o processamento, uma notificação é enviada informando que a operação foi concluída.

A mensagem de notificação será como no exemplo abaixo:

```json
{
	"operation": "<operação>",
	"tguid": "<tguid>",
	"status": "ENROLLED"
}
```

{% hint style="info" %}
As possíveis operações neste passo são: `ENROLL`, `UPDATE`, or `SEARCH`.
{% endhint %}

O notificador pode retornar status diferentes, conforme o tipo de transação sendo realizada. Os possíveis status **finais** são:

| Operação      | Status                                             |
| ------------- | -------------------------------------------------- |
| Enroll/Update | `ENROLLED`, `FAILED`                               |
| Search        | `MATCH`, `NOT_MATCH`, `FAILED`, `PERSON_NOT_FOUND` |

O status `FAILED` ocorre sempre que uma transação for abortada our não puder ser finalizada.

O status `PERSON_NOT_FOUND` ocorre quando uma busca 1:1 é recebida, mas o perfil de referência não existe para a chave fornecida.

Em alguns casos, o GBDS identifica transações que não podem ser finalizadas e necessitam de intervenção. Estes casos geram diferentes status e estão descritos nas seções abaixo.

## Transação Enviada para Revisão Manual

Nos casos em que o GBDS identificou problemas relacionados ao controle de sequência ou controle de qualidade, e a transação foi enviada para revisão manual, uma notificação será enviada indicando que o cadastro está pendente, como no exemplo abaixo:

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "PENDING"
}
```

{% hint style="info" %}
Para informações adicionais sobre fluxos de notificação durante controle de sequência e controle de qualidade, consulte a documentação de [controle de sequência e controle de qualidade](/integracao-do-gbds/qualitycontrol).
{% endhint %}

{% hint style="info" %}
Consulte o Manual do MIR para maiores detalhes sobre resolução de transações enviadas para revisão manual.
{% endhint %}

## Transação com Exceção Biométrica

Se uma exceção for gerada ao processar a transação, a transação entrante será enviada ao tratamento de exceções para análise. Neste caso, a notificação é enviada informando que transação causou uma exceção, como mostrado no exemplo abaixo:

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "EXCEPTION"
}
```

{% hint style="info" %}
Notificações geradas por operações de Atualização (Update) não alteram o campo `operation`, e a seção `"operation": "ENROLL"` será igual para operações de cadastro e atualização.
{% endhint %}

{% hint style="info" %}
Consulte o Manual do ETR para maiores detalhes sobre tratamento de exceções.
{% endhint %}

### Tratamento de Exceções

O processo de tratamento de exceções gerará diferentes notificações de acordo com as decisões tomadas. Esta seção apresenta os fluxos de notificação no tratamento de exceções.

#### Exceção de Cadastro - Mesmos Dedos

Esta decisão confirma que as biometrias nos dois registros são da mesma pessoa, portanto a transação entrante falha e é descartada. O endpoint de notificação, neste caso, receberá uma notificação indicando a decisão de tratamento de exceção seguida de outra indicando a falha na transação de cadastro, como mostrado abaixo:

```json
{
	"operation": "TREAT_EXCEPTION",
	"tguid": "<tguid>",
	"status": "OK",
	"treatment": "SAME_FINGERS"
}
```

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "FAILED"
}
```

#### Exceção de Cadastro - Dedos Diferentes

Esta decisão indica que o resultado foi um falso positivo, portanto o entrante e o registro de referência contêm conjuntos biométricos distintos. Neste caso, o cadastro será efetivado, e a notificação descrevendo o tratamento da exceção será seguida por outra indicando o cadastro bem-sucedido, como mostrado abaixo:

```json
{
	"operation": "TREAT_EXCEPTION",
	"tguid": "<tguid>",
	"status": "OK",
	"treatment": "DIFFERENT_FINGERS"
}
```

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "ENROLLED"
}
```

#### Tratamento de Exceção - Fundir Transações

Esta opção confirma que as biometrias em ambos registros são da mesma pessoa, mas decide fundir o conteúdo biográfico e biométrico dos dois registros. Neste caso, o cadastro será efetivado, e a notificação descrevendo o tratamento da exceção será seguida por outra indicando o cadastro bem-sucedido, como mostrado abaixo:

```json
{
	"operation": "TREAT_EXCEPTION",
	"tguid": "<tguid>",
	"status": "OK",
	"treatment": "MERGE_TRANSACTIONS"
}
```

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "ENROLLED"
}
```

#### Tratamento de Exceção - Recoletar

Esta decisão indica que houve um erro no cadastro entrante, e que as biometrias devem ser recoletadas. Neste caso, a transação entrante falhará. A notificação indicando a decisão de tratamento da exceção será seguida pela notificação indicando a falha da transação de cadastro, como mostrado a seguir:

```json
{
	"operation": "TREAT_EXCEPTION",
	"tguid": "<tguid>",
	"status": "OK",
	"treatment": "RECOLLECT"
}
```

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "FAILED"
}
```

#### Exceção de Atualização - Mesmos Dedos

Esta decisão indica que o não-casamento foi um falso negativo, e as biometrias nos dois registros são da mesma pessoa. Portanto, a transação entrante é cadastrada com sucesso. O endpoint de notificação receberá uma notificação indicando o tratamento da exceção seguida pela notificação de sucesso da transação de atualização, como mostrado abaixo:

```json
{
	"operation": "TREAT_EXCEPTION",
	"tguid": "<tguid>",
	"status": "OK",
	"treatment": "SAME_FINGERS"
}
```

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "ENROLLED"
}
```

#### Exceção de Atualização - Dedos Diferentes

Esta decisão confirma que as biometrias nos dois registros não são da mesma pessoa, portanto a transação entrante falha e é descartada. O endpoint de notificação receberá uma notificação do tratamento de exceção seguida pela notificação de falha da transação de atualização, como no exemplo abaixo:

```json
{
	"operation": "TREAT_EXCEPTION",
	"tguid": "<tguid>",
	"status": "OK",
	"treatment": "DIFFERENT_FINGERS"
}
```

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "FAILED"
}
```

#### Exceção de Atualização - Recoletar

Esta decisão indica que houve erro na coleta da transação entrante, e que as biometria precisam ser recoletadas. A transação entrante falhará, e o endpoint de notificação receberá uma notificação da decisão de tratamento da exceção seguida pela notificação da falha da transação entrante, como mostrado abaixo:

```json
{
	"operation": "TREAT_EXCEPTION",
	"tguid": "<tguid>",
	"status": "OK",
	"treatment": "RECOLLECT"
}
```

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "FAILED"
}
```

#### Exceção de Atualização - Cadastro Incorreto

Esta decisão indica que há um erro no registro de referência, e que este registro deve ser descartado e substituído pela transação entrante. A notificação descrevendo o tratamento da exceção será seguida pela notificação de sucesso da transação de atualização, como no exemplo abaixo:

```json
{
	"operation": "TREAT_EXCEPTION",
	"tguid": "<tguid>",
	"status": "OK",
	"treatment": "INCORRECT_ENROLL"
}
```

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "ENROLLED"
}
```

## Casamento com Latente Não Resolvida

Ao realizar uma busca contra uma base de latentes não resolvidas, quaisquer casamentos encontrados gerarão notificações de casamento reverso de latente (Reverse latent match), contendo o UGUID da latente não resolvida (UL, Unsolved Latent) casada. A transação de cadastro ou atualização prosseguirá normalmente, sendo comparada com a base referência. Esta busca normal pode resultar em conclusão normal ou gerar exceção. O exemplo abaixo mostra as notificações recebidas em uma situação de casamento de latente não resolvida seguida de cadastro bem-sucedido:

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "REVERSE_LATENT_MATCH",
	"uguid": "<uguid>"
}
```

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "ENROLLED"
}
```


# Banco de Dados Relacional GBDS 4

## Introdução

Este manual descreve todas as tabelas, esquemas e informações dos bancos de dados relacionais do GBDS 4.x . O GBDS utiliza um banco de dados relacional para armazenar metadados sobre pessoas, transações, grupos de notificação, substituições de configurações e exceções.

O documento está dividido em quatro seções que descrevem:

* As tabelas gerais ;
* As tabelas de Latentes Não Resolvidas (UL) ;
* As tabelas de Notificação ;
* As tabelas de configurações do GBDS .

## Tabelas gerais <a href="#general-tables" id="general-tables"></a>

As tabelas gerais são tabelas que armazenam informações vitais para a operação do GBDS, como exceções, informações sobre pessoas, informações sobre transações e outras. Essas tabelas são descritas abaixo.

### gbds.people

A `people`tabela destina-se a armazenar os índices de todas as pessoas armazenadas no banco de dados GBDS e é descrita da seguinte forma:

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informação adicional</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária;<br><br>Chave privada do banco de dados relacional</td></tr><tr><td>pguid</td><td>varchar</td><td>255</td><td>not null</td><td>UGUID pessoal armazenado no HBase</td></tr><tr><td>deleted</td><td>tinyint</td><td>1</td><td>null</td><td>Indica se o candidato foi deletado, para que ele não seja incluido quando operações de listagem forem performadas</td></tr></tbody></table>

### gbds.people\_version

A `people_version`tabela destina-se a armazenar as informações sobre as últimas alterações no cadastro de uma pessoa e é descrita da seguinte forma:

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="116.6666259765625">Tamanho</th><th width="100">Valor</th><th>Informações adicionais</th></tr></thead><tbody><tr><td>version</td><td>int</td><td>11</td><td>not null</td><td>Chave primária; Índice de versão (incremental a partir da primeira alteração)</td></tr><tr><td>person_id</td><td>bigint</td><td>20</td><td>not null</td><td>Referência à pessoa<code>gbds.people.id</code></td></tr><tr><td>_timestamp</td><td>datetime</td><td>6</td><td>null</td><td>timestamp de data e hora para a versão atual de uma pessoa</td></tr><tr><td>deleted</td><td>tinyint</td><td>1</td><td>null</td><td>Indica se o candidato foi excluído para ser executado ao realizar operações de listagem de candidatos</td></tr><tr><td>active</td><td>tinyint</td><td>1</td><td>null</td><td>Define se uma versão de um povo é elegível para transações de registro mestre</td></tr></tbody></table>

### gbds.transactions\_ref

A `transactions`tabela destina-se a armazenar os índices de todas as transações armazenadas no banco de dados GBDS e é descrita da seguinte forma:

<table><thead><tr><th width="100">Coluna</th><th width="100">TIpo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Chave privada do banco de dados relacional</td></tr><tr><td>tguid</td><td>varchar</td><td>255</td><td>not null</td><td><p>UGUID da transação armazenada do HBase</p><h4 id="gbds.transactions"><br></h4></td></tr></tbody></table>

### gbds.transactions

A `transactions`tabela destina-se a armazenar informações sobre a análise de qualidade dos dados biométricos de uma transação.

<table><thead><tr><th width="200">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Chave privada do banco de dados relacional</td></tr><tr><td>tguid</td><td>varchar</td><td>255</td><td>not null</td><td>Referência à transação<code>transactions_ref.tguid</code></td></tr><tr><td>pguid</td><td>varchar</td><td>255</td><td>null</td><td>UGUID da pessoa armazenada no HBase</td></tr><tr><td>active</td><td>tinyint</td><td>1</td><td>not null</td><td>Define se uma versão de uma pessoa é elegível para transações do Registro Mestre</td></tr><tr><td>finger_quality_extracted</td><td>tinyint</td><td>1</td><td>null</td><td>Falso se as impressões digitais puderem ser extraídas</td></tr><tr><td>face_quality_extracted</td><td>tinyint</td><td>1</td><td>null</td><td>Falso se o rosto puder ser extraído em segundo plano. Verdadeiro se já tiver sido extraído.</td></tr><tr><td>created</td><td>datetime</td><td>6</td><td>null</td><td>timestamp de data e hora de criação da transação</td></tr><tr><td>updated</td><td>datetime</td><td>6</td><td>null</td><td>timestamp de data e hora da última modificação da transação</td></tr><tr><td>enroll_status</td><td>varchar</td><td>255</td><td>null</td><td>Status da inscrição (como <code>ENQUEUED</code>, <code>PROCESSING</code>, <code>FAILED</code>, e outros)</td></tr><tr><td>quality_status</td><td>varchar</td><td>255</td><td>null</td><td>Status da análise de qualidade (como <code>OK</code>, <code>PENDING</code>, <code>APPROVED</code>, e outros)</td></tr><tr><td>extraction_time</td><td>varchar</td><td>255</td><td>null</td><td>Tempo decorrido para extrações de modelos</td></tr><tr><td>extraction_quality</td><td>varchar</td><td>255</td><td>null</td><td>Tempo decorrido para extrações de qualidade</td></tr><tr><td>match_time</td><td>int</td><td>11</td><td>null</td><td>Tempo de correspondência decorrido para esta transação</td></tr><tr><td>total_time</td><td>int</td><td>11</td><td>null</td><td>Operação total menos tempo de espera na fila</td></tr><tr><td>type</td><td>varchar</td><td>20</td><td>null</td><td>Tipo de transação. Enum: <code>ENROLL</code>, <code>UPDATE</code>, <code>VERIFY</code>,<code>IDENTIFY</code></td></tr><tr><td>fingerprint_global_quality</td><td>int</td><td>11</td><td>null</td><td>Pontuação de qualidade global de impressão digital</td></tr><tr><td>global_quality</td><td>int</td><td>11</td><td>null</td><td>Pontuação de qualidade global do perfil</td></tr><tr><td>quality_extraction_api_id</td><td>varchar</td><td>255</td><td>null</td><td>ID da API que realizará ou realizou a extração de qualidade</td></tr><tr><td>latent</td><td>tinyint</td><td>1</td><td>null</td><td>Sinaliza se a transação é uma pesquisa latente</td></tr><tr><td>ul</td><td>tinyint</td><td>1</td><td>null</td><td>Sinaliza se a transação é uma pesquisa UL</td></tr><tr><td>api_id</td><td>varchar</td><td>255</td><td>null</td><td>O ID da instância da API que recebeu a transação</td></tr><tr><td>num_fingers</td><td>int</td><td>11</td><td>null</td><td>O número de impressões digitais na transação</td></tr><tr><td>num_faces</td><td>int</td><td>11</td><td>null</td><td>O número de imagens de rosto na transação (0 ou 1)</td></tr><tr><td>gbds_version</td><td>varchar</td><td>255</td><td>not null</td><td>Versão do GBDS que processou a transação</td></tr><tr><td>ginger_extractor_type</td><td>enum</td><td>n/a</td><td>null</td><td>Tipo de extrator de gengibre utilizado na transação. Enum: <code>GRIAULE_FAST</code>, <code>GRIAULE_BASIC</code>, <code>GRIAULE_2020</code>, <code>GRIAULE_2024</code>, <code>GRIAULE_2018</code>.</td></tr></tbody></table>

### gbds.transaction\_fields

A `transaction_fields`tabela tem como objetivo armazenar as informações sobre as informações de qualidade e vinculá-las às informações não biométricas da `fields`tabela.

<table><thead><tr><th width="120">Coluna</th><th width="100">Tipo</th><th width="100"> Tamanho</th><th width="100">Valor</th><th>Informações adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Chave privada do banco de dados relacional</td></tr><tr><td>fkey</td><td>varchar</td><td>255</td><td>null</td><td>Chave de campo que descreve as informações contidas (por exemplo, se é um tipo sanguíneo, nome da mãe, data de nascimento, documento, etc.) Referência a<code>fields.fkey</code></td></tr><tr><td>type</td><td>varchar</td><td>255</td><td>null</td><td>Tipo de informação (pesquisa ou <code>label</code>) Referência a<code>fields.type</code></td></tr><tr><td>fvalue</td><td>varchar</td><td>255</td><td>null</td><td>Valor efetivo do campo (por exemplo, o número do documento) Referência a<code>fields.fvalue</code></td></tr><tr><td>transaction_id</td><td>bigint</td><td>20</td><td>not null</td><td>Id da transação. Referência a<code>transaction.id</code></td></tr></tbody></table>

### gbds.transaction\_fingerprint\_quality

As colunas da tabela abaixo são dinâmicas, de acordo com a extração de qualidade. Caso ocorra alguma edição dos campos em versões futuras, os dados aqui podem ficar desatualizados por um momento.

| Coluna            | Tipo    | Tamanho | Valor    |
| ----------------- | ------- | ------- | -------- |
| transaction\_id   | bigint  | 20      | not null |
| idx               | int     | 11      | not null |
| image\_quality    | int     | 11      | null     |
| template\_quality | int     | 11      | null     |
| minutiae\_count   | int     | 11      | null     |
| blank             | varchar | 100     | null     |
| contrast          | varchar | 100     | null     |
| fingerArea        | varchar | 100     | null     |
| fingerCenterX     | varchar | 100     | null     |
| fingerCenterY     | varchar | 100     | null     |
| fingerExtentX     | varchar | 100     | null     |
| fingerExtentY     | varchar | 100     | null     |
| hasjoint          | varchar | 100     | null     |
| \_\_index         | varchar | 100     | null     |
| marginBiteEast    | varchar | 100     | null     |
| marginBiteNorth   | varchar | 100     | null     |
| marginBiteSouth   | varchar | 100     | null     |
| marginBiteWest    | varchar | 100     | null     |
| nfiq              | varchar | 100     | null     |
| orientation       | varchar | 100     | null     |
| sizeX             | varchar | 100     | null     |
| sizeY             | varchar | 100     | null     |

### gbds.transaction\_face\_quality

As colunas da tabela abaixo são dinâmicas, de acordo com a extração de qualidade. Caso ocorra alguma edição dos campos em versões futuras, os dados aqui podem ficar desatualizados por um momento.

<table><thead><tr><th width="300">Coluna</th><th>Tipo</th><th>Tamanho</th><th>Valor</th></tr></thead><tbody><tr><td>transaction_id</td><td>bigint</td><td>20</td><td>not null</td></tr><tr><td>idx</td><td>int</td><td>11</td><td>not null</td></tr><tr><td>image_quality</td><td>int</td><td>11</td><td>null</td></tr><tr><td>template_quality</td><td>int</td><td>11</td><td>null</td></tr><tr><td>autoBrightness</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgBelowPictureQuality</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgBlueStandardDeviation</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgDarknessQuality</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgGreenStandardDeviation</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgRedStandardDeviation</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgUniformityQuality</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>blurCompliance</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>busyBackground</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>busyBackgroundInCropped</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>cropContainmentError</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesLookDown</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesLookLeft</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesLookRight</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesLookUp</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesObstruction</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesTooClosed</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesTooOpen</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceDown</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceLeft</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceObstruction</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceOrientationPitchCompliance</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceOrientationRollAngle</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceOrientationYawCompliance</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceRight</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceUp</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>glasses</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>grayscaleSpan</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>hat</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>heavyGlasses</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>icaoCompliance</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>leftEyeX</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>leftEyeY</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>mouthObstruction</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>mouthOpen</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>obstruction</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>openMouth</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>pictureHeight</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>pictureWidth</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>pixelated</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>redEye</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>result</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>rightEyeX</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>rightEyeY</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>saturated</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>saturationGrayscaleDistribGrade</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>saturationNumGrayTones</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>saturationOverExposure</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>shadows</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>skinColorCompliance</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>smile</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>smilingMouth</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>spoof</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>spoofGrade</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>tiltAngle</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>tooDark</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>unnaturalSkinColor</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>visibleTeeth</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>wrongFacePose</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>wrongShoulderPoseLeft</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>wrongShoulderPoseRight</td><td>varchar</td><td>100</td><td>null</td></tr></tbody></table>

### gbds.biometrics

A tabela `biometrics`destina-se a armazenar os dados biométricos de uma pessoa, estando vinculada às tabelas `transaction`e ao `people_version`sistema. Ela é descrita da seguinte forma:

<table><thead><tr><th width="120">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Chave privada do banco de dados relacional</td></tr><tr><td>idx</td><td>int</td><td>11</td><td>null</td><td>Índice da biometria atual</td></tr><tr><td>quality</td><td>int</td><td>11</td><td>null</td><td>Pontuação de qualidade para o modelo biométrico extraído</td></tr><tr><td>type</td><td>varchar</td><td>255</td><td>null</td><td>Modalidade da biometria atual</td></tr><tr><td>person_id</td><td>bigint</td><td>20</td><td>not null</td><td>Referência à pessoa<code>gbds.people.id</code></td></tr><tr><td>transaction_id</td><td>bigint</td><td>20</td><td>not null</td><td>Referência à transação<code>transactions_ref.id</code></td></tr><tr><td>person_version</td><td>bigint</td><td>11</td><td>not null</td><td>Referência à pessoa<code>people_version.version</code></td></tr></tbody></table>

### gbds.fields

A tabela `fields`       destina-se a armazenar as informações não biométricas de uma pessoa, estando vinculada às `transaction`tabelas `people_version`. Ela é descrita da seguinte forma:

<table><thead><tr><th width="120">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Chave privada do banco de dados relacional</td></tr><tr><td>fkey</td><td>varchar</td><td>255</td><td>null</td><td>Chave de campo que descreve as informações contidas (por exemplo, se é um tipo sanguíneo, nome da mãe, data de nascimento, documento, etc.)</td></tr><tr><td>type</td><td>varchar</td><td>255</td><td>null</td><td>Tipo de informação (pesquisa ou <code>label</code>)</td></tr><tr><td>fvalue</td><td>varchar</td><td>255</td><td>null</td><td>Valor efetivo do campo (por exemplo, o número do documento)</td></tr><tr><td>person_id</td><td>bigint</td><td>20</td><td>not null</td><td>Referência à pessoa<code>person.id</code></td></tr><tr><td>person_version</td><td>int</td><td>11</td><td>not null</td><td>Referência à pessoa<code>people_version.version</code></td></tr></tbody></table>

### gbds.exceptions

A tabela `exceptions`destina-se a armazenar as informações de qualquer exceção biométrica e seu tratamento. Ela é descrita a seguir:

<table><thead><tr><th width="185">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Chave privada do banco de dados relacional</td></tr><tr><td>aguid</td><td>varchar</td><td>255</td><td>not null</td><td>Exceção armazenada do HBase UGUID</td></tr><tr><td>comments</td><td>varchar</td><td>255</td><td>null</td><td>Quaisquer comentários fornecidos ao tratar a exceção</td></tr><tr><td>_timestamp</td><td>datetime</td><td>6</td><td>null</td><td>timestamp de data e hora para a criação da exceção</td></tr><tr><td>status</td><td>varchar</td><td>255</td><td>not null</td><td>O status atual da exceção é definido se ela está tratada ou pendente</td></tr><tr><td>user</td><td>varchar</td><td>255</td><td>null</td><td>Identificação do usuário responsável pelo tratamento da exceção</td></tr><tr><td>reference_person_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave estrangeira: Referência à pessoa de referência<code>people.id</code></td></tr><tr><td>entrant_person_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave estrangeira: Referência à pessoa que entra<code>people.id</code></td></tr><tr><td>transaction_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave estrangeira: Referência à transação<code>transactions_ref.id</code></td></tr><tr><td>reference_person_version</td><td>int</td><td>11</td><td>not null</td><td>Chave estrangeira: Referência à pessoa de referência<code>people_version.version</code></td></tr><tr><td>entrant_person_version</td><td>int</td><td>11</td><td>not null</td><td>Chave estrangeira: Referência à pessoa que entra<code>people_version.version</code></td></tr></tbody></table>

### gbds.apis

O `apis`é usado pelo GBDS para gerenciar várias APIs ativas ao mesmo tempo.

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>api-id</td><td>varchar</td><td>255</td><td>not null</td><td>ID da instância de API exclusiva</td></tr><tr><td>hostname</td><td>varchar</td><td>255</td><td>not null</td><td>Nome do host do nó onde a API está sendo executada</td></tr><tr><td>port</td><td>int</td><td>11</td><td>not null</td><td>Porta onde a API está sendo executada</td></tr><tr><td>type</td><td>varchar</td><td>255</td><td>null</td><td>Tipo de instância da API (LEADER, RUNNER ou nulo)</td></tr></tbody></table>

Na inicialização da API, cada API procurará por si mesma nesta tabela. Se não for encontrada com nome de host/IP e porta, ela se insere na tabela com um GUID como *api-id* e *tipo nulo* , o que significa que não está pronta para extração de qualidade. Alterações aplicadas diretamente a esta tabela serão analisadas a cada 15 minutos.

## Tabelas latentes não resolvidas (UL) <a href="#unsolved-latent-ul-tables" id="unsolved-latent-ul-tables"></a>

As tabelas de Latentes Não Resolvidas são usadas para armazenar informações sobre os dados da UL e os candidatos. As tabelas são descritas abaixo.

### gbds.ul

A tabela `ul`foi projetada para armazenar todos os GBDS UL's e é descrita da seguinte forma:

<table><thead><tr><th width="150">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>uguid</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária; UGUID armazenado em HBase</td></tr><tr><td>ul_status</td><td>varchar</td><td>255</td><td>not null</td><td><br><code>UNSOLVED</code>ou <code>SOLVED</code>; HBase replica esse status</td></tr><tr><td>creation_time</td><td>timestamp</td><td>4</td><td>not null</td><td><code>current_timestamp</code>por padrão</td></tr><tr><td>person_pguid</td><td>varchar</td><td>255</td><td>null</td><td>PGUID da pessoa correspondente quando<code>SOLVED</code></td></tr><tr><td>person_tguid</td><td>varchar</td><td>255</td><td>null</td><td>TGUID da pessoa correspondente quando<code>SOLVED</code></td></tr><tr><td>fragment_id</td><td>varchar</td><td>255</td><td>null</td><td>ID do fragmento original para o fragmento que gerou o UL</td></tr><tr><td>fragment_case_id</td><td>varchar</td><td>255</td><td>null</td><td>ID do caso original para o fragmento que gerou o UL</td></tr><tr><td>fragment_index</td><td>int</td><td>11</td><td>null</td><td>Índice de fragmentos para o UL. Por padrão, o índice é definido como <code>-1</code>(índice desconhecido, qualquer índice)</td></tr><tr><td>analysis_user</td><td>varchar</td><td>255</td><td>null</td><td>Usuário responsável pela análise UL</td></tr><tr><td>analysis_timestamp</td><td>timestamp</td><td>4</td><td>null</td><td>timestamp de data e hora da análise</td></tr><tr><td>group_guid</td><td>varchar</td><td>255</td><td>not null</td><td>GUID de agrupamento (para listar ULs vinculados)</td></tr></tbody></table>

### gbds.ul\_candidates

A tabela `ul_candidates` foi projetada para armazenar os candidatos de cada UL que o GBDS mantém após qualquer *CORRESPONDÊNCIA LATENTE REVERSA* realizada em inscrições que geraram uma *correspondência* com uma UL, e é descrita da seguinte forma:

<table><thead><tr><th width="110">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor </th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>ul_uguid</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária; UL UGUID</td></tr><tr><td>person_pguid</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária; PGUID do candidato</td></tr><tr><td>person_tguid</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária; TGUID do candidato</td></tr><tr><td>person_index</td><td>int</td><td>11</td><td>not null</td><td>Chave primária; Dedo indicador candidato</td></tr><tr><td>score</td><td>int</td><td>11</td><td>not null</td><td>Pontuação de matching correspondente para o candidato</td></tr><tr><td>deleted</td><td>tinyint</td><td>1</td><td>not null</td><td><code>0</code>por padrão, indica se o candidato foi excluído para ser excluído ao realizar operações de listagem de candidatos</td></tr><tr><td>minutiae</td><td>longblob</td><td>Up to 4Gb</td><td>null</td><td>Serialização JSON contendo as minúcias correspondentes. É uma lista com a seguinte estrutura:<br> - <code>queryIndex</code>, <code>int</code> <br>- <code>referenceIndex</code>,<code>int</code></td></tr></tbody></table>

## Tabelas de notificação

As tabelas de notificação são usadas para armazenar dados para fins de auditoria, como e-mails, pessoas que serão notificadas e grupos.

### gbds.notify\_user

A tabela `notify_user` foi projetada para armazenar os dados do usuário autenticado pelo gbds.

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; ID exclusivo do usuário.</td></tr><tr><td>username</td><td>varchar</td><td>255</td><td>not null</td><td>nome de usuário gbds autenticado</td></tr></tbody></table>

### gbds.notify\_group

A tabela `notify_group`foi projetada para armazenar informações dos grupos de notificação.

<table><thead><tr><th width="100">Column</th><th width="100">Type</th><th width="100">Size</th><th width="100">Value</th><th>Additional Information</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária;</td></tr><tr><td>name</td><td>varchar</td><td>255</td><td>not null</td><td>Nome do grupo</td></tr><tr><td>enabled</td><td>tinyint</td><td>1</td><td>not null</td><td>Define se o grupo estará ativo ou não</td></tr></tbody></table>

### gbds.notify\_group\_email

A tabela `notify_group_email` foi projetada para armazenar os e-mails de um determinado grupo.

<table><thead><tr><th width="130">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>notify_group_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; ID do grupo.</td></tr><tr><td>email</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária; <br>E-mail que pertence ao grupo</td></tr></tbody></table>

### gbds.notify\_user\_group

A tabela `notify_user_group` foi projetada para armazenar informações de qual grupo um determinado usuário faz parte.

<table><thead><tr><th width="130">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>notify_user_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Referência ao usuário<code>notify_user.id</code></td></tr><tr><td>notify_group_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Referência ao grupo<code>notify_group_email.notify_group.id</code></td></tr></tbody></table>

### gbds.people\_transparency

A tabela `people_transparency` foi projetada para armazenar informações sobre uma determinada pessoa e quais ações são tomadas quando essa pessoa é pesquisada.

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária;</td></tr><tr><td>pguid</td><td>varchar</td><td>255</td><td>not null</td><td>Referência à pessoa<code>people.pguid</code></td></tr><tr><td>enabled</td><td>tinyint</td><td>1</td><td>not null</td><td>Referência à pessoa<code>people.pguid</code></td></tr><tr><td>action</td><td>varchar</td><td>255</td><td>null</td><td>Ação a ser tomada</td></tr></tbody></table>

### gbds.people\_transparency\_group

A tabela `people_transparency_group` foi projetada para armazenar informações sobre os grupos aos quais uma pessoa pertence.

<table><thead><tr><th width="180">Column</th><th width="100">Type</th><th width="100">Size</th><th width="100">Value</th><th>Additional Information</th></tr></thead><tbody><tr><td>people_transparency_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Referência a people_transparency's<code>people_transparency.id</code></td></tr><tr><td>notify_group_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Referência ao grupo<code>notify_group_email.notify_group.id</code></td></tr></tbody></table>

## Tabelas de configurações do GBDS

O GBDS utiliza um banco de dados relacional para armazenar algumas configurações da API e do GBDS. A tabela de configurações é uma tabela especial projetada para controlar determinadas configurações do GBDS e da API do GBDS. Essas configurações são armazenadas na `gbds.settings`tabela. A tabela pode conter configurações presentes na API do GBDS, no GBDS ou em ambos, seguindo o esquema abaixo:

<table><thead><tr><th width="100">Tipo</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>skey</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária. Nome da chave de parâmetro.</td></tr><tr><td>stype</td><td>varchar</td><td>50</td><td>not null</td><td>Local de onde vem o parâmetro. API ou GBDS</td></tr><tr><td>svalue</td><td>varchar</td><td>4096</td><td>null</td><td>Valor do parâmetro</td></tr><tr><td>description</td><td>varchar</td><td>4096</td><td>null</td><td>Descrição do parâmetro</td></tr><tr><td>stimestamp</td><td>datetime</td><td>6</td><td>not null</td><td>Carimbo de data e hora</td></tr><tr><td>host</td><td>varchar</td><td>1024</td><td>null</td><td>Nome do host de um nó</td></tr></tbody></table>

Todas as configurações encontradas na tabela serão gravadas no respectivo arquivo, `gbdsapi.properties`tanto para a API do GBDS quanto `application.conf`para o GBDS, a cada 15 minutos. Além disso, todas as configurações atualizadas na memória, tanto na API quanto no GBDS, serão propagadas.

{% hint style="info" %}
O valor do parâmetro definido na `gbds.settings`tabela será propagado para TODOS os nós.
{% endhint %}

Este recurso é controlado por um parâmetro de configuração na tabela, `gbds.rdbSystemConfiguration.enabled`. Este parâmetro permitirá a substituição dos valores de configuração do GBDS e da API. Definir o valor do parâmetro como `BOTH`fará com que as configurações do GBDS e da API sejam substituídas.

| gbds.settings / Chave de configuração de arquivo                      | Tipo |
| --------------------------------------------------------------------- | ---- |
| gbscluster.min.quality                                                | API  |
| gbds.enroll.fingerprints.min-nr-template                              | API  |
| gbds.enroll.face.min-nr-template                                      | API  |
| gbds.enroll.iris.min-nr-template                                      | API  |
| gbds.enroll.palmprint.min-nr-template                                 | API  |
| gbds.enroll.newborn-palmprint.min-nr-template                         | API  |
| gbscluster.enroll.fingerprints.verify.matchthreshold                  | API  |
| gbscluster.update.min.quality                                         | API  |
| gbds.transparency.search.identify.request.notify.enabled              | API  |
| gbds.transparency.search.identify.result.actions.enabled              | API  |
| gbds.api.logLevel                                                     | API  |
| gbds.extraction.service                                               | API  |
| gbds.extraction.service.face.count                                    | API  |
| gbds.extraction.service.ginger.count                                  | API  |
| gbds.extraction.service.girl.count                                    | API  |
| gbds.extraction.service.hostname                                      | API  |
| gbds.extraction.service.initialPort                                   | API  |
| gbds.extraction.service.logLevel                                      | API  |
| gbds.extraction.service.maxTries                                      | API  |
| gbds.extraction.service.linkLibSegfault                               | API  |
| gbds.extraction.quality.service                                       | API  |
| gbds.extraction.quality.fillTransactionQualityPropertiesTable         | API  |
| gbds.faces.extraction.quality.api                                     | API  |
| gbds.faces.extraction.quality.background                              | API  |
| gbds.fingerprints.extraction.quality.api                              | API  |
| gbds.fingerprints.extraction.quality.background                       | API  |
| gbds.extraction.quality.service.finger.count                          | API  |
| gbds.extraction.quality.service.face.count                            | API  |
| gbds.extraction.quality.service.initialPort                           | API  |
| gbds.extraction.quality.service.logLevel                              | API  |
| gbds.extraction.quality.service.timeout                               | API  |
| gbds.extraction.quality.service.hostname                              | API  |
| gbds.extraction.quality.service.maxTries                              | API  |
| gbds.extraction.quality.service.linkLibSegfault                       | API  |
| gbds.extraction.quality.service.rows-on-select                        | API  |
| gbds.extraction.quality.service.submitted-queue-factor                | API  |
| gbds.enroll.face.min.quality                                          | API  |
| gbds.update.face.min.quality                                          | API  |
| gbds.monitor.url                                                      | API  |
| gbds.template.face.multiplicity                                       | API  |
| gbds.biographicBase.enabled                                           | API  |
| gbds.biographicBase.endpoints                                         | API  |
| gbds.biographicBase.get.timeout.ms                                    | API  |
| gbds.biographicBase.list.timeout.ms                                   | API  |
| gbds.biographicBase.logLevel                                          | API  |
| gbds.biographicBase.clientID                                          | API  |
| gbds.biographicBase.clientSecret                                      | API  |
| gbds.biographicBase.lookAllServers                                    | API  |
| gbscluster.fingerprints.extraction.enroll.type                        | API  |
| gbscluster.fingerprints.extraction.verify.type                        | API  |
| gbds.update.exception.reextract                                       | API  |
| gbds.update.exception.reextract.save                                  | API  |
| gbds.biographicBase.autoUpdate                                        | API  |
| gbds.biographicBase.sendPguidAsKey                                    | API  |
| gbds.biographicBase.sendTguidAsKey                                    | API  |
| gbds.log.diagnose                                                     | GBDS |
| gbds.ul.boot.scan.enabled                                             | GBDS |
| gbds.boot.scan.ignoreErrorsOnRegion                                   | GBDS |
| gbds.boot.matcher.creation.sleepTime.ms                               | GBDS |
| gbds.biometric.fingerprint.identify.threshold                         | GBDS |
| gbds.biometric.fingerprint.exception.threshold                        | GBDS |
| gbds.biometric.fingerprint.exception.enabled                          | GBDS |
| gbds.biometric.fingerprint.exception.enroll.min-matches-for-exception | GBDS |
| gbds.biometric.face.identify.threshold                                | GBDS |
| gbds.biometric.face.exception.threshold                               | GBDS |
| gbds.peopleList.countFromRDB                                          | GBDS |
| gbds.biometric.face.enabled.threshold                                 | GBDS |
| gbds.driver.logLevel                                                  | GBDS |
| gbds.log.loadUnload                                                   | GBDS |
| gbds.template.memory.format                                           | GBDS |
| gbds.match.service.enabled                                            | GBDS |
| gbds.match.service.initialPort                                        | GBDS |
| gbds.match.service.logLevel                                           | GBDS |
| gbds.match.service.timeout                                            | GBDS |
| gbds.match.service.templateSend.parallelByModality                    | GBDS |
| gbds.match.service.linkLibSegfault                                    | GBDS |
| gbds.match.service.maxTries                                           | GBDS |
| gbds.match.service.maxConnectionErrors                                | GBDS |
| gbds.memory-monitor                                                   | GBDS |
| gbds.watchdog.interval                                                | GBDS |
| gbds.watchdog.log.mode                                                | GBDS |
| gbds.watchdog.log.level                                               | GBDS |
| gbds.verifyPostMatch.enabled                                          | GBDS |
| gbds.transparency.search.identify.result.notify.enabled               | BOTH |
| gbds.transparency.email-notifier.url                                  | BOTH |
| gbds.transparency.email-notifier.log-level                            | BOTH |
| gbds.transparency.email-notifier.timeout                              | BOTH |
| gbscluster.update.consider.fingerprints                               | BOTH |
| gbscluster.update.consider.faces                                      | BOTH |
| gbscluster.update.consider.faces.beforeFingerprints                   | BOTH |
| gbscluster.update.faces.verify.matchthreshold                         | BOTH |
| gbscluster.update.minimum.fingers                                     | BOTH |
| gbds.search.verify.adjust-resolution                                  | BOTH |

Outras configurações podem ser colocadas na tabela `gbds.settings`em rdb e todas serão gravadas na API ou no arquivo GBDS, de acordo com o tipo de configuração. No entanto, as recargas de memória em tempo de execução não serão realizadas para essas novas configurações, somente após a reinicialização da API e/ou do GBDS.


# Banco de Dados Relacional GBDS 5

## Introdução

Este manual descreve todas as tabelas, esquemas e informações dos bancos de dados relacionais do GBDS. O GBDS utiliza um banco de dados relacional para armazenar metadados sobre pessoas, transações, grupos de notificação, substituições de configurações e exceções.

O documento está dividido em quatro seções que descrevem:

* As tabelas gerais ;
* As tabelas de Latentes Não Resolvidas (UL) ;
* As tabelas de Notificação ;
* As tabelas de configurações do GBDS .

## Tabelas gerais <a href="#general-tables" id="general-tables"></a>

As tabelas gerais são tabelas que armazenam informações vitais para a operação do GBDS, como exceções, informações sobre pessoas, informações sobre transações e outras. Essas tabelas são descritas abaixo.

### gbds.people

A `people`tabela destina-se a armazenar os índices de todas as pessoas armazenadas no banco de dados GBDS e é descrita da seguinte forma:

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informação adicional</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária;<br><br>Chave privada do banco de dados relacional</td></tr><tr><td>pguid</td><td>varchar</td><td>255</td><td>not null</td><td>UGUID pessoal armazenado no HBase</td></tr><tr><td>deleted</td><td>tinyint</td><td>1</td><td>null</td><td>Indica se o candidato foi deletado, para que ele não seja incluido quando operações de listagem forem performadas</td></tr></tbody></table>

### gbds.people\_version

A `people_version`tabela destina-se a armazenar as informações sobre as últimas alterações no cadastro de uma pessoa e é descrita da seguinte forma:

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="116.6666259765625">Tamanho</th><th width="100">Valor</th><th>Informações adicionais</th></tr></thead><tbody><tr><td>version</td><td>int</td><td>11</td><td>not null</td><td>Chave primária; Índice de versão (incremental a partir da primeira alteração)</td></tr><tr><td>person_id</td><td>bigint</td><td>20</td><td>not null</td><td>Referência à pessoa<code>gbds.people.id</code></td></tr><tr><td>_timestamp</td><td>datetime</td><td>6</td><td>null</td><td>timestamp de data e hora para a versão atual de uma pessoa</td></tr><tr><td>deleted</td><td>tinyint</td><td>1</td><td>null</td><td>Indica se o candidato foi excluído para ser executado ao realizar operações de listagem de candidatos</td></tr><tr><td>active</td><td>tinyint</td><td>1</td><td>null</td><td>Define se uma versão de um povo é elegível para transações de registro mestre</td></tr></tbody></table>

### gbds.organization

A tabela `organization` é responsável por armazenar as informações sobre as organizações registradas no GBDS

| Coluna      | Tipo    | Tamanho | Valor    | Informações Adicionais                              |
| ----------- | ------- | ------- | -------- | --------------------------------------------------- |
| id          | bigint  | 20      | not null | Chave primária; Identifica a organização unicamente |
| parent\_id  | bigint  | 20      | null     | Identifica a organização responsável, chave;        |
| name        | varchar | 255     | not null | Nome da organização                                 |
| description | varchar | 1000    | not null | Descrição                                           |

### gbds.transactions

A `transactions`tabela destina-se a armazenar informações sobre a análise de qualidade dos dados biométricos de uma transação.

<table><thead><tr><th width="200">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Chave privada do banco de dados relacional</td></tr><tr><td>tguid</td><td>varchar</td><td>255</td><td>not null</td><td>Referência à transação<code>transactions.tguid</code></td></tr><tr><td>pguid</td><td>varchar</td><td>255</td><td>null</td><td>UGUID da pessoa armazenada no HBase</td></tr><tr><td>active</td><td>tinyint</td><td>1</td><td>not null</td><td>Define se uma versão de uma pessoa é elegível para transações do Registro Mestre</td></tr><tr><td>priority</td><td>enum</td><td>n/a</td><td>null</td><td>enum<code>('GOD_PRIORITY','HIGHEST_PRIORITY','HIGHER_PRIORITY','HIGH_PRIORITY','DEFAULT_PRIORITY','LOW_PRIORITY','LOWER_PRIORITY','LOWEST_PRIORITY')</code></td></tr><tr><td>created</td><td>datetime</td><td>6</td><td>null</td><td>timestamp de data e hora de criação da transação</td></tr><tr><td>updated</td><td>datetime</td><td>6</td><td>null</td><td>timestamp de data e hora da última modificação da transação</td></tr><tr><td>quality_status</td><td>enum</td><td>n/a</td><td>null</td><td>Status da análise de qualidade (como <code>OK</code>, <code>PENDING</code>, <code>APPROVED</code>, e outros)</td></tr><tr><td>enroll_status</td><td>enum</td><td>n/a</td><td>null</td><td>Status da inscrição (como <code>ENQUEUED</code>, <code>PROCESSING</code>, <code>FAILED</code>, e outros)</td></tr><tr><td>search_status</td><td>enum</td><td>n/a</td><td>null</td><td>enum<code>('ENQUEUED','PREPARED','PROCESSING','MATCH','NOT_MATCH','UNCERTAIN','MISMATCH','FAILED','PENDING','PERSON_NOT_FOUND','NONE','UL_NOT_FOUND','REFUSED','RESENT_ENROLL')</code></td></tr><tr><td>extraction_time</td><td>int</td><td>11</td><td>null</td><td>Tempo decorrido para extrações de modelos</td></tr><tr><td>extraction_quality_time</td><td>int</td><td>11</td><td>null</td><td>Tempo decorrido para extrações de qualidade</td></tr><tr><td>match_time</td><td>int</td><td>11</td><td>null</td><td>Tempo de correspondência decorrido para esta transação</td></tr><tr><td>post_match_time</td><td>int</td><td>11</td><td>null</td><td>Tempo decorrido após a correspondência para esta transação</td></tr><tr><td>total_time</td><td>int</td><td>11</td><td>null</td><td>Operação total menos tempo de espera na fila</td></tr><tr><td>transaction_type</td><td>enum</td><td>n/a</td><td>null</td><td>Tipo de transação.<br>enum<code>('ENROLL','UPDATE','VERIFY','IDENTIFY')</code></td></tr><tr><td>latent</td><td>tinyint</td><td>1</td><td>null</td><td>Sinaliza se a transação é uma pesquisa latente</td></tr><tr><td>ul</td><td>tinyint</td><td>1</td><td>null</td><td>Sinaliza se a transação é uma pesquisa UL</td></tr><tr><td>num_fingers</td><td>int</td><td>11</td><td>null</td><td>O número de impressões digitais na transação</td></tr><tr><td>num_faces</td><td>int</td><td>11</td><td>null</td><td>O número de imagens de rosto na transação (0 ou 1)</td></tr><tr><td>finger_quality_extracted</td><td>tinyint</td><td>1</td><td>null</td><td>Falso se as impressões digitais puderem ser extraídas</td></tr><tr><td>face_quality_extracted</td><td>tinyint</td><td>1</td><td>null</td><td>Falso se o rosto puder ser extraído em segundo plano. Verdadeiro se já tiver sido extraído.</td></tr><tr><td>ginger_extractor_type</td><td>enum</td><td>n/a</td><td>null</td><td>Tipo de extrator de gengibre utilizado na transação. Enum: <code>GRIAULE_FAST</code>, <code>GRIAULE_BASIC</code>, <code>GRIAULE_2020</code>, <code>GRIAULE_2024</code>, <code>GRIAULE_2018</code>.</td></tr><tr><td>finger_global_quality</td><td>int</td><td>11</td><td>null</td><td>Pontuação de qualidade global de impressão digital</td></tr><tr><td>global_quality</td><td>int</td><td>11</td><td>null</td><td>Pontuação de qualidade global do perfil</td></tr><tr><td>quality_extraction_api_id</td><td>varchar</td><td>255</td><td>null</td><td>ID da API que realizará ou realizou a extração de qualidade</td></tr><tr><td>quality_extraction_msg</td><td>varchar</td><td>512</td><td>null</td><td>Mensagem referente a extração de qualidade</td></tr><tr><td>api_id</td><td>varchar</td><td>255</td><td>null</td><td>O ID da instância da API que recebeu a transação</td></tr><tr><td>gbds_version</td><td>varchar</td><td>255</td><td>null</td><td>Versão do GBDS que processou a transação</td></tr></tbody></table>

### gbds.transaction\_fields

A `transaction_fields`tabela tem como objetivo armazenar as informações sobre as informações de qualidade e vinculá-las às informações não biométricas da `fields`tabela.

<table><thead><tr><th width="120">Coluna</th><th width="100">Tipo</th><th width="100"> Tamanho</th><th width="100">Valor</th><th>Informações adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Chave privada do banco de dados relacional</td></tr><tr><td>fkey</td><td>varchar</td><td>255</td><td>null</td><td>Chave de campo que descreve as informações contidas (por exemplo, se é um tipo sanguíneo, nome da mãe, data de nascimento, documento, etc.) Referência a<code>fields.fkey</code></td></tr><tr><td>type</td><td>varchar</td><td>255</td><td>null</td><td>Tipo de informação (pesquisa ou <code>label</code>) Referência a<code>fields.type</code></td></tr><tr><td>fvalue</td><td>varchar</td><td>255</td><td>null</td><td>Valor efetivo do campo (por exemplo, o número do documento) Referência a<code>fields.fvalue</code></td></tr><tr><td>transaction_id</td><td>bigint</td><td>20</td><td>not null</td><td>Id da transação. Referência a<code>transaction.id</code></td></tr></tbody></table>

### gbds.transaction\_fingerprint\_quality

| Coluna            | Tipo    | Tamanho | Valor    |
| ----------------- | ------- | ------- | -------- |
| transaction\_id   | bigint  | 20      | not null |
| idx               | int     | 11      | not null |
| image\_quality    | int     | 11      | null     |
| template\_quality | int     | 11      | null     |
| minutiae\_count   | int     | 11      | null     |
| blank             | varchar | 100     | null     |
| contrast          | varchar | 100     | null     |
| fingerArea        | varchar | 100     | null     |
| fingerCenterX     | varchar | 100     | null     |
| fingerCenterY     | varchar | 100     | null     |
| fingerExtentX     | varchar | 100     | null     |
| fingerExtentY     | varchar | 100     | null     |
| hasjoint          | varchar | 100     | null     |
| \_\_index         | varchar | 100     | null     |
| marginBiteEast    | varchar | 100     | null     |
| marginBiteNorth   | varchar | 100     | null     |
| marginBiteSouth   | varchar | 100     | null     |
| marginBiteWest    | varchar | 100     | null     |
| nfiq              | varchar | 100     | null     |
| orientation       | varchar | 100     | null     |
| sizeX             | varchar | 100     | null     |
| sizeY             | varchar | 100     | null     |

### gbds.transaction\_face\_quality

<table><thead><tr><th width="300">Coluna</th><th>Tipo</th><th>Tamanho</th><th>Valor</th></tr></thead><tbody><tr><td>transaction_id</td><td>bigint</td><td>20</td><td>not null</td></tr><tr><td>idx</td><td>int</td><td>11</td><td>not null</td></tr><tr><td>image_quality</td><td>int</td><td>11</td><td>null</td></tr><tr><td>template_quality</td><td>int</td><td>11</td><td>null</td></tr><tr><td>autoBrightness</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgBelowPictureQuality</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgBlueStandardDeviation</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgDarknessQuality</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgGreenStandardDeviation</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgRedStandardDeviation</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>bgUniformityQuality</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>blurCompliance</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>busyBackground</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>busyBackgroundInCropped</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>cropContainmentError</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesLookDown</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesLookLeft</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesLookRight</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesLookUp</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesObstruction</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesTooClosed</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>eyesTooOpen</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceDown</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceLeft</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceObstruction</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceOrientationPitchCompliance</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceOrientationRollAngle</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceOrientationYawCompliance</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceRight</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>faceUp</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>glasses</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>grayscaleSpan</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>hat</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>heavyGlasses</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>icaoCompliance</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>leftEyeX</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>leftEyeY</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>mouthObstruction</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>mouthOpen</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>obstruction</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>openMouth</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>pictureHeight</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>pictureWidth</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>pixelated</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>redEye</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>result</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>rightEyeX</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>rightEyeY</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>saturated</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>saturationGrayscaleDistribGrade</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>saturationNumGrayTones</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>saturationOverExposure</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>shadows</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>skinColorCompliance</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>smile</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>smilingMouth</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>spoof</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>spoofGrade</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>tiltAngle</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>tooDark</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>unnaturalSkinColor</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>visibleTeeth</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>wrongFacePose</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>wrongShoulderPoseLeft</td><td>varchar</td><td>100</td><td>null</td></tr><tr><td>wrongShoulderPoseRight</td><td>varchar</td><td>100</td><td>null</td></tr></tbody></table>

### gbds.fields

A tabela `fields`       destina-se a armazenar as informações não biométricas de uma pessoa, estando vinculada às `transaction`tabelas `people_version`. Ela é descrita da seguinte forma:

<table><thead><tr><th width="120">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Chave privada do banco de dados relacional</td></tr><tr><td>fkey</td><td>varchar</td><td>255</td><td>null</td><td>Chave de campo que descreve as informações contidas (por exemplo, se é um tipo sanguíneo, nome da mãe, data de nascimento, documento, etc.)</td></tr><tr><td>field_type</td><td>varchar</td><td>255</td><td>null</td><td>Tipo de informação (pesquisa ou <code>label</code>)</td></tr><tr><td>fvalue</td><td>varchar</td><td>255</td><td>null</td><td>Valor efetivo do campo (por exemplo, o número do documento)</td></tr><tr><td>person_id</td><td>bigint</td><td>20</td><td>not null</td><td>Referência à pessoa<code>person.id</code></td></tr><tr><td>person_version</td><td>int</td><td>11</td><td>not null</td><td>Referência à pessoa<code>people_version.version</code></td></tr></tbody></table>

### gbds.exceptions

A tabela `exceptions`destina-se a armazenar as informações de qualquer exceção biométrica e seu tratamento. Ela é descrita a seguir:

<table><thead><tr><th width="185">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Chave privada do banco de dados relacional</td></tr><tr><td>aguid</td><td>varchar</td><td>255</td><td>not null</td><td>Exceção armazenada do HBase UGUID</td></tr><tr><td>comments</td><td>varchar</td><td>255</td><td>null</td><td>Quaisquer comentários fornecidos ao tratar a exceção</td></tr><tr><td>_timestamp</td><td>datetime</td><td>6</td><td>null</td><td>timestamp de data e hora para a criação da exceção</td></tr><tr><td>exception_status</td><td>enum</td><td>n/a</td><td>not null</td><td>enum <code>('ANALYSIS', 'DIFFERENT_FINGERS', 'SAME_FINGERS', 'INCORRECT_ENROLL', 'RECOLLECT', 'MERGE_TRANSACTIONS', 'APPROVE', 'REJECT', 'ERROR', 'REFUSED')</code></td></tr><tr><td>target</td><td>enum</td><td>n/a</td><td>not null</td><td>enum<code>('BIOMETRIC','BIOMETRIC_INCONCLUSIVE','BIOMETRIC_MISMATCH','BIOGRAPHIC')</code>;<br>Padrão: <code>BIOMETRIC</code></td></tr><tr><td>priority</td><td>tinyint</td><td>1</td><td>not null</td><td>Referencia prioridade da exceção, com valor default 0</td></tr><tr><td>user</td><td>varchar</td><td>255</td><td>null</td><td>Identificação do usuário responsável pelo tratamento da exceção</td></tr><tr><td>transaction_id_50</td><td>bigint</td><td>20</td><td>not null</td><td>Chave estrangeira: Referência à transação<code>transactions.id</code></td></tr><tr><td>reference_person_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave estrangeira: Referência à pessoa de referência<code>people.id</code></td></tr><tr><td>trusted_master_record</td><td>tinyint</td><td>1</td><td>null</td><td>Flag para uso dos dados da transação em análises futuras</td></tr><tr><td>reference_indexes</td><td>varchar</td><td>1000</td><td>null</td><td></td></tr><tr><td>exception_group_id</td><td>int</td><td>11</td><td>not null</td><td>ID do grupo de exceção pertencente</td></tr><tr><td>fusion_score</td><td>int</td><td>11</td><td>not null</td><td>Armazena o score avaliado na fusão</td></tr><tr><td>fusion_decision</td><td>enum</td><td>n/a</td><td>null</td><td>Armazena a decisão tomada pelas regras de fusão;<br>enum<code>('HIT','NO_HIT','UNCERTAIN','UNCERTAIN_EXPERT','MISMATCH','ERROR')</code></td></tr></tbody></table>

### gbds.exception\_decision

A tabela `exception_decision`destina-se a armazenar as informações das decisões com relação a uma exceção. Ela é descrita a seguir:

<table><thead><tr><th width="110">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>candidate_id</td><td>bigint</td><td>20</td><td>not null</td><td>Identifica o candidato da exceção;<br>Forma chave primária com user</td></tr><tr><td>user</td><td>varchar</td><td>100</td><td>not null</td><td>Usuário responsável pelo tratamento da exceção</td></tr><tr><td>locked_timestamp</td><td>datetime</td><td>6</td><td>not null</td><td>Data em que a exceção foi alocada</td></tr><tr><td>decision_timestamp</td><td>datetime</td><td>6</td><td>not null</td><td>Data em que a decisão foi gerada</td></tr><tr><td>decision</td><td>enum</td><td>n/a</td><td>not null</td><td>Decisão tomada para a exceção<br>enum<code>('HIT','NO_HIT','UNCERTAIN','UNCERTAIN_EXPERT','ERROR')</code></td></tr></tbody></table>

### gbds.exception\_candidates

A tabela `exception_candidates`destina-se a armazenar as informações dos candidatos a uma exceção biométrica. Ela é descrita a seguir:

<table><thead><tr><th width="185">Coluna</th><th width="102">Tipo</th><th width="100">Tamanho</th><th width="89.0909423828125">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Chave privada do banco de dados relacional</td></tr><tr><td>exception_id</td><td>bigint</td><td>20</td><td>not null</td><td>ID da exceção</td></tr><tr><td>reference_transaction_id</td><td>bigint</td><td>20</td><td>null</td><td>ID da transação de referência</td></tr><tr><td>query_index</td><td>int</td><td>11</td><td>not null</td><td>Índice da biometria entrante</td></tr><tr><td>reference_index</td><td>int</td><td>11</td><td>not null</td><td>Índice da biometria de referência</td></tr><tr><td>query_quality</td><td>int</td><td>11</td><td>null</td><td>Qualidade da biometria entrante</td></tr><tr><td>reference_quality</td><td>int</td><td>255</td><td>null</td><td>Qualidade da biometria de referência</td></tr><tr><td>score</td><td>int</td><td>20</td><td>null</td><td>Pontuação de matching correspondente</td></tr><tr><td>locked_user</td><td>varchar</td><td>20</td><td>null</td><td>Usuário alocado para tratamento da exceção</td></tr><tr><td>locked_timestamp</td><td>datetime</td><td>20</td><td>null</td><td>Data em que a exceção foi alocada</td></tr><tr><td>locked_timeout</td><td>datetime</td><td>11</td><td>null</td><td>Data em que a exceção será desalocada por inatividade</td></tr><tr><td>decision</td><td>enum</td><td>n/a</td><td>null</td><td>enum<code>(HIT, NO_HIT, UNCERTAIN, UNCERTAIN_EXPERT, ERROR)</code></td></tr><tr><td>minutiae</td><td>mediumblob</td><td>1</td><td>n/a</td><td></td></tr></tbody></table>

### gbds.exception\_group

A tabela `exception_group`destina-se a armazenar as informações dos candidatos a uma exceção biométrica. Ela é descrita a seguir:

<table><thead><tr><th width="188.6363525390625">Coluna</th><th width="103.54547119140625">Tipo</th><th width="104.3636474609375">Tamanho</th><th width="111.6363525390625">Valor </th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Identifica unicamente o grupo de exceção</td></tr><tr><td>gguid</td><td>varchar</td><td>100</td><td>not null</td><td>UGUID do grupo de exceção armazenado no HBase</td></tr><tr><td>tguid</td><td>varchar</td><td>100</td><td>not null</td><td>UGUID da transação armazenada no HBase</td></tr><tr><td>target</td><td>enum</td><td>n/a</td><td>not null</td><td>Tipo de exceção ao qual o grupo se refere.<br>enum<code>('BIOMETRIC','BIOMETRIC_INCONCLUSIVE','BIOMETRIC_MISMATCH','BIOGRAPHIC')</code></td></tr><tr><td>decision</td><td>enum</td><td>n/a</td><td>null</td><td>Decisão tomada para tratamento da exceção<br>enum<code>('APPROVE','REJECT','KEEP')</code></td></tr><tr><td>status</td><td>enum</td><td>n/a</td><td>not null</td><td>Status em que se encontra o o processo de tratamento da exceção<br>enum<code>('ANALYSIS','PENDING','READY','PROCESSING','DONE','REFUSED','ERROR')</code></td></tr><tr><td>priority</td><td>tinyint</td><td>1</td><td>not null</td><td>Referencia prioridade da exceção, com valor default 0</td></tr><tr><td>created</td><td>datetime</td><td>6</td><td>not null</td><td>Timestamp de criação do grupo</td></tr><tr><td>updated</td><td>timestamp</td><td>n/a</td><td>not null</td><td>Timestamp de criação </td></tr><tr><td>user</td><td>varchar</td><td>100</td><td>null</td><td>Usuário que tratou o grupo</td></tr><tr><td>message</td><td>varchar</td><td>4000</td><td>null</td><td>Mensagem deixada após o tratamento</td></tr><tr><td>comments</td><td>varchar</td><td>4000</td><td>null</td><td>Comentários a serem deixados em caso de lights out</td></tr><tr><td>locked_user</td><td>varchar</td><td>100</td><td>null</td><td>Usuário alocado para tratamento do grupo</td></tr><tr><td>locked_timestamp</td><td>datetime</td><td>6</td><td>null</td><td>Data em que o grupo de exceção foi alocado</td></tr><tr><td>locked_timeout</td><td>datetime</td><td>6</td><td>null</td><td>Data em que a alocação irá expirar caso não seja tratada</td></tr><tr><td>decision_parameters</td><td>varchar</td><td>5000</td><td>null</td><td>Parâmetros de decisão utilizados (id, valores e labels)</td></tr><tr><td>new_tguid</td><td>varchar</td><td>100</td><td>null</td><td></td></tr><tr><td>refused_status</td><td>enum</td><td>n/a</td><td>null</td><td>enum<code>('CREATED','REMOVED','READY_TO_RESEND','SENDING','SENT','ERROR')</code></td></tr><tr><td>refused_new_tguid</td><td>varchar</td><td>100</td><td>null</td><td>TGUID novo gerado em caso de REFUSED</td></tr><tr><td>lights_out_criteria</td><td>varchar</td><td>5000</td><td>null</td><td>Indica o que foi considerado no Lights Out<br>EX: {"matchedBiographics":["nome","data de nascimento","filiação"]}</td></tr><tr><td>lights_out_status</td><td>enum</td><td>n/a</td><td>null</td><td>enum <code>('READY','ANALYSING','KEEP','AUTO_TREAT','ERROR')</code></td></tr></tbody></table>

### gbds.exception\_group\_organizations

A tabela exception\_group\_organizations destina-se a armazenar informações sobre organizações relacionadas a um grupo de exceções.

<table><thead><tr><th width="120">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>exception_group_id</td><td>bigint</td><td>20</td><td>not null</td><td>ID do grupo de exceção;<br>Forma chave primária com <code>exception_id</code></td></tr><tr><td>exception_id</td><td>bigint</td><td>20</td><td>not null</td><td>ID da exceção a que se refere a organização;<br>Forma chave primária com <code>exception_group_id</code>;</td></tr><tr><td>organization</td><td>varchar</td><td>100</td><td>not null</td><td>Nome da organização</td></tr><tr><td>origin</td><td>enum</td><td>n/a</td><td>not null</td><td>Referencia o tipo de origem da organização dentro da exceção<br><code>DEFAULT 'BOTH'</code><br>enum<code>('ENTRANT','REFERENCE','BOTH')</code><br><br><br><br><br><br><br></td></tr></tbody></table>

### gbds.exception\_group\_refused

A tabela `exception_group_refused` destina-se a armazenar informações sobre os grupos de exceção recusados e os grupos responsáveis pela recusa.

<table><thead><tr><th width="110">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>exception_group_id</td><td>bigint</td><td>20</td><td>not nuIl</td><td>ID do grupo de exceção referência</td></tr><tr><td>refused_exception_group_id</td><td>bigint</td><td>20</td><td>not null</td><td>ID do grupo de exceção recusado</td></tr></tbody></table>

### gbds.key\_format

A tabela gbds.key\_format destina-se a armazenar as chaves e os formatos para validação de chave.

<table><thead><tr><th width="110">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>key_id</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária;<br>Define o ID da chave</td></tr><tr><td>format_type</td><td>enum</td><td>6</td><td>not null</td><td>Padrão <code>ALPHANUMERIC</code><br>enum<code>('TITULO','CPF','ALPHANUMERIC','NUMERIC','ALPHABETIC','REGEX')</code></td></tr><tr><td>regex</td><td>varchar</td><td>20</td><td>null</td><td></td></tr><tr><td>min_length</td><td>int</td><td>20</td><td>null</td><td>Define o tamanho mínimo da chave</td></tr><tr><td>max_length</td><td>int</td><td>Up to 4Gb</td><td>null</td><td>Define o tamanho máximo da chave</td></tr></tbody></table>

### gbds.operation\_log

A tabela gbds.operation\_log é utilizada para armazenar logs de operações.

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>ID interno de identificação</td></tr><tr><td>guid</td><td>varchar</td><td>100</td><td>null</td><td>Identificador único universal</td></tr><tr><td>user</td><td>varchar</td><td>100</td><td>null</td><td>Usuário responsável pela ação</td></tr><tr><td>log_timestamp</td><td>datetime</td><td>-</td><td>not null</td><td>Data de criação do log</td></tr><tr><td>log_type</td><td>enum</td><td>n/a</td><td>not null</td><td>enum('EXCEPTION','EXCEPTION_BIOMETRIC','EXCEPTION_GROUP','TRANSACTION)</td></tr><tr><td>operation</td><td>enum</td><td>n/a</td><td>not null</td><td>enum('UNKNOWN','CONNECT','DISCONNECT','AUTHENTICATE','ENROLL','EXTERNAL_AUTHENTICATE','BATCH_ENROLL','REGISTER_SEARCH','SEARCH','DELETE','GET_RESULT','CLOSE_SESSION','FILTER','COUNT_ANOMALIES','FIND_ANOMALIES','GET_ANOMALY','ASSIGN_ANOMALY','UNASSIGN_ANOMALY','TRUST_ENROLL','GET_TRANSACTION','CHANGE_PRIORITY','ADD_TO_REFERENCE','REMOVE_FROM_REFERENCE','REMOVE_KEYS','GET_PEOPLE_TRANSACTIONS','ANOMALY_ENROLL','GET_EXCEPTION_RESULT','QUALITY_ANALYSIS','REGISTER_ENROLL','STOP_SERVICE','REGISTER_UL_BIOMETRIC','REMOVE_UL_BIOMETRIC','UPDATE_PERSON_BIOMETRIC','DISABLE_PERSON_TRANSACTION','CREATE_EXCEPTION','CREATE_EXCEPTION_GROUP','PRIORITY_EXCEPTION','PRIORITY_EXCEPTION_GROUP','TREAT_EXCEPTION','TREAT_EXCEPTION_BIOMETRIC','TREAT_EXCEPTION_GROUP','CHANGE_REFUSED_STATUS','RESEND_REFUSED','LIGHTS_OUT')</td></tr><tr><td>status</td><td>enum</td><td>n/a</td><td>null</td><td>enum('ANALYSIS','READY','PROCESSING','DONE','REFUSED','PENDING','ERROR','ENQUEUED','OK','NOT_FINAL','BIOMETRIC','BIOMETRIC_INCONCLUSIVE','BIOMETRIC_MISMATCH','BIOGRAPHIC','APPROVE','REJECT','LIGHTS_OUT')</td></tr><tr><td>bio_index</td><td>int</td><td>11</td><td>null</td><td>Índice da biometria</td></tr><tr><td>decision</td><td>enum</td><td>n/a</td><td>null</td><td>enum<code>('UNCERTAIN','UNCERTAIN_EXPERT','NO_HIT','HIT','MISMATCH','ERROR','APPROVE','REJECT','KEEP','CREATED','REMOVED','READY_TO_RESEND')</code></td></tr><tr><td>message</td><td>varchar</td><td>1000</td><td>null</td><td>Descrição da operação a que se refere a operação</td></tr><tr><td>tguid</td><td>varchar</td><td>100</td><td>null</td><td>Identificador único da transação</td></tr><tr><td>pguid</td><td>varchar</td><td>100</td><td>null</td><td>Identificador único do perfil a que se refere a operação</td></tr><tr><td>kept_tguids</td><td>varchar</td><td>1000</td><td>null</td><td>TGUIDs a serem mantidos pela operação de KEEP do Lights Out</td></tr></tbody></table>

### gbds.apis

O `apis`é usado pelo GBDS para gerenciar várias APIs ativas ao mesmo tempo.

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>api_id</td><td>varchar</td><td>255</td><td>not null</td><td>ID da instância de API exclusiva</td></tr><tr><td>hostname</td><td>varchar</td><td>255</td><td>not null</td><td>Nome do host do nó onde a API está sendo executada</td></tr><tr><td>port</td><td>int</td><td>11</td><td>not null</td><td>Porta onde a API está sendo executada</td></tr><tr><td>type</td><td>varchar</td><td>255</td><td>null</td><td>Tipo de instância da API (LEADER, RUNNER ou nulo)</td></tr></tbody></table>

Na inicialização da API, cada API procurará por si mesma nesta tabela. Se não for encontrada com nome de host/IP e porta, ela se insere na tabela com um GUID como *api-id* e *tipo nulo* , o que significa que não está pronta para extração de qualidade. Alterações aplicadas diretamente a esta tabela serão analisadas a cada 15 minutos.

## Tabelas latentes não resolvidas (UL) <a href="#unsolved-latent-ul-tables" id="unsolved-latent-ul-tables"></a>

As tabelas de Latentes Não Resolvidas são usadas para armazenar informações sobre os dados da UL e os candidatos. As tabelas são descritas abaixo.

### gbds.ul

A tabela `ul`foi projetada para armazenar todos os GBDS UL's e é descrita da seguinte forma:

<table><thead><tr><th width="150">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>uguid</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária; UGUID armazenado em HBase</td></tr><tr><td>ul_status</td><td>varchar</td><td>255</td><td>not null</td><td><br><code>UNSOLVED</code>ou <code>SOLVED</code>; HBase replica esse status</td></tr><tr><td>creation_time</td><td>timestamp</td><td>4</td><td>not null</td><td><code>current_timestamp</code>por padrão</td></tr><tr><td>person_pguid</td><td>varchar</td><td>255</td><td>null</td><td>PGUID da pessoa correspondente quando<code>SOLVED</code></td></tr><tr><td>person_tguid</td><td>varchar</td><td>255</td><td>null</td><td>TGUID da pessoa correspondente quando<code>SOLVED</code></td></tr><tr><td>fragment_id</td><td>varchar</td><td>255</td><td>null</td><td>ID do fragmento original para o fragmento que gerou o UL</td></tr><tr><td>fragment_case_id</td><td>varchar</td><td>255</td><td>null</td><td>ID do caso original para o fragmento que gerou o UL</td></tr><tr><td>fragment_index</td><td>int</td><td>11</td><td>null</td><td>Índice de fragmentos para o UL. Por padrão, o índice é definido como <code>-1</code>(índice desconhecido, qualquer índice)</td></tr><tr><td>analysis_user</td><td>varchar</td><td>255</td><td>null</td><td>Usuário responsável pela análise UL</td></tr><tr><td>analysis_timestamp</td><td>timestamp</td><td>4</td><td>null</td><td>timestamp de data e hora da análise</td></tr><tr><td>group_guid</td><td>varchar</td><td>255</td><td>not null</td><td>GUID de agrupamento (para listar ULs vinculados)</td></tr></tbody></table>

### gbds.ul\_candidates

A tabela `ul_candidates` foi projetada para armazenar os candidatos de cada UL que o GBDS mantém após qualquer *CORRESPONDÊNCIA LATENTE REVERSA* realizada em inscrições que geraram uma *correspondência* com uma UL, e é descrita da seguinte forma:

<table><thead><tr><th width="110">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor </th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>ul_uguid</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária; UL UGUID</td></tr><tr><td>person_pguid</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária; PGUID do candidato</td></tr><tr><td>person_tguid</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária; TGUID do candidato</td></tr><tr><td>person_index</td><td>int</td><td>11</td><td>not null</td><td>Chave primária; Dedo indicador candidato</td></tr><tr><td>score</td><td>int</td><td>11</td><td>not null</td><td>Pontuação de matching correspondente para o candidato</td></tr><tr><td>deleted</td><td>tinyint</td><td>1</td><td>not null</td><td><code>0</code>por padrão, indica se o candidato foi excluído para ser excluído ao realizar operações de listagem de candidatos</td></tr><tr><td>minutiae</td><td>longblob</td><td>Up to 4Gb</td><td>null</td><td>Serialização JSON contendo as minúcias correspondentes. É uma lista com a seguinte estrutura:<br> - <code>queryIndex</code>, <code>int</code> <br>- <code>referenceIndex</code>,<code>int</code></td></tr></tbody></table>

## Tabelas de notificação

As tabelas de notificação são usadas para armazenar dados para fins de auditoria, como e-mails, pessoas que serão notificadas e grupos.

### gbds.notifications

A tabela `gbds.notifications` foi projetada para armazenar informações relacionadas as notificações de operações do GBDS

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Indice interno autoincrementado;<br>Chave primária;</td></tr><tr><td>nguid</td><td>varchar</td><td>40</td><td>not null</td><td>Identificador único da notificação</td></tr><tr><td>tguid</td><td>varchar</td><td>40</td><td>not null</td><td>Identificador único da transação responsável pela notificação</td></tr><tr><td>created</td><td>datetime</td><td>6</td><td>not null</td><td>Timestamp da data de criação da notificação</td></tr><tr><td>operation</td><td>enum</td><td>n/a</td><td>null</td><td>enum<code>('UNKNOWN','CONNECT','DISCONNECT','AUTHENTICATE','ENROLL','EXTERNAL_AUTHENTICATE','BATCH_ENROLL','REGISTER_SEARCH','SEARCH','DELETE','GET_RESULT','CLOSE_SESSION','FILTER','COUNT_ANOMALIES','FIND_ANOMALIES','GET_ANOMALY','ASSIGN_ANOMALY','UNASSIGN_ANOMALY','TRUST_ENROLL','GET_TRANSACTION','CHANGE_PRIORITY','ADD_TO_REFERENCE','REMOVE_FROM_REFERENCE','REMOVE_KEYS','GET_PEOPLE_TRANSACTIONS','ANOMALY_ENROLL','GET_EXCEPTION_RESULT','QUALITY_ANALYSIS','REGISTER_ENROLL','STOP_SERVICE','REGISTER_UL_BIOMETRIC','REMOVE_UL_BIOMETRIC','UPDATE_PERSON_BIOMETRIC','DISABLE_PERSON_TRANSACTION','CREATE_EXCEPTION','CREATE_EXCEPTION_GROUP','PRIORITY_EXCEPTION','PRIORITY_EXCEPTION_GROUP','TREAT_EXCEPTION','TREAT_EXCEPTION_BIOMETRIC','TREAT_EXCEPTION_GROUP','CHANGE_REFUSED_STATUS','RESEND_REFUSED','LIGHTS_OUT')</code></td></tr><tr><td>status</td><td>varchar</td><td>255</td><td>null</td><td>Status da operação descrita em operation</td></tr><tr><td>sender</td><td>varchar</td><td>255</td><td>null</td><td>Módulo responsável pela notificação</td></tr><tr><td>uguid</td><td>varchar</td><td>40</td><td>null</td><td>Identificador do usuário</td></tr><tr><td>pguid</td><td>varchar</td><td>40</td><td>null</td><td>PGUID a que se refere a operação</td></tr><tr><td>new_tguid</td><td>varchar</td><td>40</td><td>null</td><td>TGUID novo gerado, por exemplo, quando gera um enroll</td></tr><tr><td>enroll_pguid</td><td>varchar</td><td>40</td><td>null</td><td>-</td></tr><tr><td>treatment</td><td>varchar</td><td>100</td><td>null</td><td>Tratamento no caso de análise de Lights Out</td></tr><tr><td>_update</td><td>tinyint</td><td>1</td><td>null</td><td>Flag de update</td></tr><tr><td>trusted</td><td>tinyint</td><td>1</td><td>null</td><td>Flag de truted enroll/update</td></tr><tr><td>origin</td><td>enum</td><td>n/a</td><td>null</td><td>enum<code>('API','GBDS')</code></td></tr><tr><td>additional_data</td><td>mediumblob</td><td>-</td><td>null</td><td>Dados adicionais relevantes (GGUID, comentários etc)</td></tr><tr><td>external_ids</td><td>mediumblob</td><td>-</td><td>null</td><td>IDs externos e seus valores;<br>{"name":"protocol", "key":"000000000"}</td></tr><tr><td>related_external_ids</td><td>mediumblob</td><td>-</td><td>null</td><td>IDs externos relacionados</td></tr><tr><td>kept_tguids</td><td>mediumblob</td><td>-</td><td>null</td><td>TGUIDs a serem mantidos em caso de Lights Out</td></tr></tbody></table>

###

### gbds.notify\_user

A tabela `notify_user` foi projetada para armazenar os dados do usuário autenticado pelo gbds.

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; ID exclusivo do usuário.</td></tr><tr><td>username</td><td>varchar</td><td>255</td><td>not null</td><td>nome de usuário gbds autenticado</td></tr></tbody></table>

### gbds.notify\_group

A tabela `notify_group`foi projetada para armazenar informações dos grupos de notificação.

<table><thead><tr><th width="100">Column</th><th width="100">Type</th><th width="100">Size</th><th width="100">Value</th><th>Additional Information</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária;</td></tr><tr><td>name</td><td>varchar</td><td>255</td><td>not null</td><td>Nome do grupo</td></tr><tr><td>enabled</td><td>tinyint</td><td>1</td><td>not null</td><td>Define se o grupo estará ativo ou não</td></tr></tbody></table>

### gbds.notify\_group\_email

A tabela `notify_group_email` foi projetada para armazenar os e-mails de um determinado grupo.

<table><thead><tr><th width="130">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>notify_group_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; ID do grupo.</td></tr><tr><td>email</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária; <br>E-mail que pertence ao grupo</td></tr></tbody></table>

### gbds.notify\_user\_group

A tabela `notify_user_group` foi projetada para armazenar informações de qual grupo um determinado usuário faz parte.

<table><thead><tr><th width="130">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>notify_user_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Referência ao usuário<code>notify_user.id</code></td></tr><tr><td>notify_group_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Referência ao grupo<code>notify_group_email.notify_group.id</code></td></tr></tbody></table>

### gbds.people\_transparency

A tabela `people_transparency` foi projetada para armazenar informações sobre uma determinada pessoa e quais ações são tomadas quando essa pessoa é pesquisada.

<table><thead><tr><th width="100">Coluna</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária;</td></tr><tr><td>pguid</td><td>varchar</td><td>255</td><td>not null</td><td>Referência à pessoa<code>people.pguid</code></td></tr><tr><td>enabled</td><td>tinyint</td><td>1</td><td>not null</td><td>Referência à pessoa<code>people.pguid</code></td></tr><tr><td>action</td><td>varchar</td><td>255</td><td>null</td><td>Ação a ser tomada</td></tr></tbody></table>

### gbds.people\_transparency\_group

A tabela `people_transparency_group` foi projetada para armazenar informações sobre os grupos aos quais uma pessoa pertence.

<table><thead><tr><th width="180">Column</th><th width="100">Type</th><th width="100">Size</th><th width="100">Value</th><th>Additional Information</th></tr></thead><tbody><tr><td>people_transparency_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Referência a people_transparency's<code>people_transparency.id</code></td></tr><tr><td>notify_group_id</td><td>bigint</td><td>20</td><td>not null</td><td>Chave primária; Referência ao grupo<code>notify_group_email.notify_group.id</code></td></tr></tbody></table>

## Tabelas de configurações do GBDS (gbds.settings)

O GBDS utiliza um banco de dados relacional para armazenar algumas configurações da API e do GBDS. A tabela de configurações é uma tabela especial projetada para controlar determinadas configurações do GBDS e da API do GBDS. Essas configurações são armazenadas na `gbds.settings`tabela. A tabela pode conter configurações presentes na API do GBDS, no GBDS ou em ambos, seguindo o esquema abaixo:

<table><thead><tr><th width="100">Tipo</th><th width="100">Tipo</th><th width="100">Tamanho</th><th width="100">Valor</th><th>Informações Adicionais</th></tr></thead><tbody><tr><td>skey</td><td>varchar</td><td>255</td><td>not null</td><td>Chave primária. Nome da chave de parâmetro.</td></tr><tr><td>stype</td><td>varchar</td><td>50</td><td>not null</td><td>Local de onde vem o parâmetro. API ou GBDS</td></tr><tr><td>svalue</td><td>varchar</td><td>4096</td><td>null</td><td>Valor do parâmetro</td></tr><tr><td>description</td><td>varchar</td><td>4096</td><td>null</td><td>Descrição do parâmetro</td></tr><tr><td>stimestamp</td><td>datetime</td><td>6</td><td>not null</td><td>Carimbo de data e hora</td></tr><tr><td>host</td><td>varchar</td><td>1024</td><td>null</td><td>Nome do host de um nó</td></tr></tbody></table>

Todas as configurações encontradas na tabela serão gravadas no respectivo arquivo, `gbdsapi.properties`tanto para a API do GBDS quanto `application.conf`para o GBDS, a cada 15 minutos. Além disso, todas as configurações atualizadas na memória, tanto na API quanto no GBDS, serão propagadas.

{% hint style="info" %}
O valor do parâmetro definido na `gbds.settings`tabela será propagado para TODOS os nós.
{% endhint %}

Este recurso é controlado por um parâmetro de configuração na tabela, `gbds.rdbSystemConfiguration.enabled`. Este parâmetro permitirá a substituição dos valores de configuração do GBDS e da API. Definir o valor do parâmetro como `BOTH`fará com que as configurações do GBDS e da API sejam substituídas.

| gbds.settings / Chave de configuração de arquivo                      | Tipo |
| --------------------------------------------------------------------- | ---- |
| gbscluster.min.quality                                                | API  |
| gbds.enroll.fingerprints.min-nr-template                              | API  |
| gbds.enroll.face.min-nr-template                                      | API  |
| gbds.enroll.iris.min-nr-template                                      | API  |
| gbds.enroll.palmprint.min-nr-template                                 | API  |
| gbds.enroll.newborn-palmprint.min-nr-template                         | API  |
| gbscluster.enroll.fingerprints.verify.matchthreshold                  | API  |
| gbscluster.update.min.quality                                         | API  |
| gbds.transparency.search.identify.request.notify.enabled              | API  |
| gbds.transparency.search.identify.result.actions.enabled              | API  |
| gbds.api.logLevel                                                     | API  |
| gbds.extraction.service                                               | API  |
| gbds.extraction.service.face.count                                    | API  |
| gbds.extraction.service.ginger.count                                  | API  |
| gbds.extraction.service.girl.count                                    | API  |
| gbds.extraction.service.hostname                                      | API  |
| gbds.extraction.service.initialPort                                   | API  |
| gbds.extraction.service.logLevel                                      | API  |
| gbds.extraction.service.maxTries                                      | API  |
| gbds.extraction.service.linkLibSegfault                               | API  |
| gbds.extraction.quality.service                                       | API  |
| gbds.extraction.quality.fillTransactionQualityPropertiesTable         | API  |
| gbds.faces.extraction.quality.api                                     | API  |
| gbds.faces.extraction.quality.background                              | API  |
| gbds.fingerprints.extraction.quality.api                              | API  |
| gbds.fingerprints.extraction.quality.background                       | API  |
| gbds.extraction.quality.service.finger.count                          | API  |
| gbds.extraction.quality.service.face.count                            | API  |
| gbds.extraction.quality.service.initialPort                           | API  |
| gbds.extraction.quality.service.logLevel                              | API  |
| gbds.extraction.quality.service.timeout                               | API  |
| gbds.extraction.quality.service.hostname                              | API  |
| gbds.extraction.quality.service.maxTries                              | API  |
| gbds.extraction.quality.service.linkLibSegfault                       | API  |
| gbds.extraction.quality.service.rows-on-select                        | API  |
| gbds.extraction.quality.service.submitted-queue-factor                | API  |
| gbds.enroll.face.min.quality                                          | API  |
| gbds.update.face.min.quality                                          | API  |
| gbds.monitor.url                                                      | API  |
| gbds.template.face.multiplicity                                       | API  |
| gbds.biographicBase.enabled                                           | API  |
| gbds.biographicBase.endpoints                                         | API  |
| gbds.biographicBase.get.timeout.ms                                    | API  |
| gbds.biographicBase.list.timeout.ms                                   | API  |
| gbds.biographicBase.logLevel                                          | API  |
| gbds.biographicBase.clientID                                          | API  |
| gbds.biographicBase.clientSecret                                      | API  |
| gbds.biographicBase.lookAllServers                                    | API  |
| gbscluster.fingerprints.extraction.enroll.type                        | API  |
| gbscluster.fingerprints.extraction.verify.type                        | API  |
| gbds.update.exception.reextract                                       | API  |
| gbds.update.exception.reextract.save                                  | API  |
| gbds.biographicBase.autoUpdate                                        | API  |
| gbds.biographicBase.sendPguidAsKey                                    | API  |
| gbds.biographicBase.sendTguidAsKey                                    | API  |
| gbds.log.diagnose                                                     | GBDS |
| gbds.ul.boot.scan.enabled                                             | GBDS |
| gbds.boot.scan.ignoreErrorsOnRegion                                   | GBDS |
| gbds.boot.matcher.creation.sleepTime.ms                               | GBDS |
| gbds.biometric.fingerprint.identify.threshold                         | GBDS |
| gbds.biometric.fingerprint.exception.threshold                        | GBDS |
| gbds.biometric.fingerprint.exception.enabled                          | GBDS |
| gbds.biometric.fingerprint.exception.enroll.min-matches-for-exception | GBDS |
| gbds.biometric.face.identify.threshold                                | GBDS |
| gbds.biometric.face.exception.threshold                               | GBDS |
| gbds.peopleList.countFromRDB                                          | GBDS |
| gbds.biometric.face.enabled.threshold                                 | GBDS |
| gbds.driver.logLevel                                                  | GBDS |
| gbds.log.loadUnload                                                   | GBDS |
| gbds.template.memory.format                                           | GBDS |
| gbds.match.service.enabled                                            | GBDS |
| gbds.match.service.initialPort                                        | GBDS |
| gbds.match.service.logLevel                                           | GBDS |
| gbds.match.service.timeout                                            | GBDS |
| gbds.match.service.templateSend.parallelByModality                    | GBDS |
| gbds.match.service.linkLibSegfault                                    | GBDS |
| gbds.match.service.maxTries                                           | GBDS |
| gbds.match.service.maxConnectionErrors                                | GBDS |
| gbds.memory-monitor                                                   | GBDS |
| gbds.watchdog.interval                                                | GBDS |
| gbds.watchdog.log.mode                                                | GBDS |
| gbds.watchdog.log.level                                               | GBDS |
| gbds.verifyPostMatch.enabled                                          | GBDS |
| gbds.transparency.search.identify.result.notify.enabled               | BOTH |
| gbds.transparency.email-notifier.url                                  | BOTH |
| gbds.transparency.email-notifier.log-level                            | BOTH |
| gbds.transparency.email-notifier.timeout                              | BOTH |
| gbscluster.update.consider.fingerprints                               | BOTH |
| gbscluster.update.consider.faces                                      | BOTH |
| gbscluster.update.consider.faces.beforeFingerprints                   | BOTH |
| gbscluster.update.faces.verify.matchthreshold                         | BOTH |
| gbscluster.update.minimum.fingers                                     | BOTH |
| gbds.search.verify.adjust-resolution                                  | BOTH |

Outras configurações podem ser colocadas na tabela `gbds.settings`em rdb e todas serão gravadas na API ou no arquivo GBDS, de acordo com o tipo de configuração. No entanto, as recargas de memória em tempo de execução não serão realizadas para essas novas configurações, somente após a reinicialização da API e/ou do GBDS.


# Controle de Qualidade e Sequência

Quando o GBDS recebe uma nova transação, uma checagem de controle de qualidade e sequência é realizada. Essa verificação tem o propósito de evitar que transações ruins de serem inseridas no banco de dados.

Qualquer transação rejeitada pela controle de qualidade e sequência é enviada ao MIR para revisão manual.

{% hint style="info" %}
Veja o [manual do MIR (Manual Image Review)](/aplicacoes/mirweb) para mais informações sobre como lidar com transações enviadas à ele.
{% endhint %}

## Passos de Verificação

### Checagem de Qualidade

O primeiro passo quando se recebe uma nova transação é a realização de uma verificação de qualidade pelo GBDS de cada template de biometria submetido.

Se a qualidade de qualquer template não alcançar o limiar configurado, toda a transação é enviada para o MIR para verificação manual.

{% hint style="info" %}
Veja o [Manual de Configuração do GBDS](/configuracao-do-gbds/gbds4conf) ou contate o time de suporte da Griaule para mais informações.
{% endhint %}

Qualquer problema identificado por esse passo de verificação será retornado como `"QualityIssue"` pela API.

### Checagem de Duplicidade

Nesse passo, o GBDS compara cada digital contra as outras para checar duplicidade.

Se alguma duplicata for identificada, a transação é enviada para o MIR para verificação manual.

Qualquer problema identificado nesse passo será retornado como `"DuplicationIssue"` pela API.

### Checagem de Sequência

Para realizar esse passo, o GBDS requer imagens de digitais pousadas capturadas simultaneamente (*4-slap fingerprint*) (índices 940 e 941)

O GBDS tentará segmentar essas imagens e extrair um número predeterminado de biometrias. Então, irá comparar as imagens segmentadas contra as digitais capturadas individualmente (usualmente, capturas roladas).

{% hint style="info" %}
Em casos de amputação ou deficiência temporária, a imagem pode conter menos que quatro dedos.
{% endhint %}

Se qualquer comparação identificar um não-casamento, o GBDS tentará corrigir o índice dos dedos que não casam e fará uma autocorreção.

Se houver qualquer problema identificado que o GBDS não possa autocorrigir, ou que o número de autocorreções seja maior que o máximo configurado, nenhuma correção será feita e a transação será enviada para o MIR.

{% hint style="info" %}
Veja o [manual de configuração do GBDS](/configuracao-do-gbds/gbds4conf) ou contate o time de suporte da Griaule para mais informações.
{% endhint %}

Qualquer problema identificado nesse passo de verificação será retornado como `"SequenceControlIssue"` pela API.

O fluxo de comparação para checagem de sequência será o seguinte:

#### Fluxo de Trabalho de Comparação

As imagens individuais das digitais (roladas ou planas), com índices entre 0 e 3 serão comparadas contra as imagens segmentadas do índice 940.

Então, as imagens de digitais individuais dos índices entre 6 e 9 serão comparadas contra as imagens segmentadas do índice 941.

Os índices para as imagens de digitais individuais são:

| Índice | Digital            | Índice | Digital           |
| ------ | ------------------ | ------ | ----------------- |
| 0      | Mínimo Esquerdo    | 5      | Polegar Direito   |
| 1      | Anelar Esquerdo    | 6      | Indicador Direito |
| 2      | Médio Esquerdo     | 7      | Médio Direito     |
| 3      | Indicador Esquerdo | 8      | Anelar Direito    |
| 4      | Polegar Esquerdo   | 9      | Mínimo Direito    |

## Tratando Anomalias

Para saber mais informações sobre o MIR e os processos de tratamento de anomalias, veja o manual do MIR, como mencionado acima.

Nessa seção, os processos de análise de qualidade realizados pelo servidor serão detalhados, desde o momento GBDS recebe a decisão fornecida pelo MIR.

### Transação Aprovada Sem Mudanças

Dada essa decisão, o GBDS manterá a transação original sem mudanças e continuará o processo de cadastro. O GUID (Global Unique IDentifier) da transação (TGUID), irá permanecer o mesmo para ambas operações (`QUALITY_ANALYSIS` and `ENROLL`).

O fluxo de notificação será o seguinte:

#### Análise de Qualidade - Aprovado

A primeira notificação conterá o status `"APPROVED"` para a operação de `"QUALITY_ANALYSIS"`.

```json
{
	"operation": "QUALITY_ANALYSIS",
	"tguid": "<tguid>",
	"status": "APPROVED"
}
```

#### Cadastro - Cadastrado

A segunda notificação conterá o status `"ENROLLED"` para a seguinte operação de `"ENROLL"`.

```json
{
	"operation": "ENROLL",
	"tguid": "<tguid>",
	"status": "ENROLLED"
}
```

### Transação Aprovada com Mudanças

Dada essa decisão, o GBDS irá manter as mudanças feitas pelo examinador (imagens deletadas ou editadas) e irá gerar um novo TGUID para o cadastro.

O fluxo de notificação para essa decisão é similar ao gerado pela "*Transação Aprovada sem Mudanças*", adicionando o novo TGUID:

#### Análise de Qualidade - Aprovado

A primeira notificação conterá o status `"APPROVED"` para operação de `"QUALITY_ANALYSIS"` e incluirá o novo campo `"newTransactionGUID"` denotando que a transação foi aceita com mudanças e apontando para o novo TGUID.

```json
{
	"newTransactionGUID": "<new_tguid>",
	"operation": "QUALITY_ANALYSIS",
	"tguid": "<original_tguid>",
	"status": "APPROVED"
}
```

#### Cadastro - Cadastrado

A segunda notificação conterá o status `"ENROLLED"` para a seguinte operação de `"ENROLL"`.

{% hint style="info" %}
A operação de `ENROLL` será realizada para a transação alterada, então o TGUID mencionado será o novo que foi gerado pela operação de `QUALITY_ANALYSIS`.
{% endhint %}

```json
{
	"operation": "ENROLL",
	"tguid": "<new_tguid>",
	"status": "ENROLLED"
}
```

### Transação Rejeitada

Dada a decisão, o GBDS não continuará o processo de cadastro e descartará toda a transação. O TGUID continuará o mesmo.

{% hint style="info" %}
O histórico da transação será mantido, mas o perfil não será inserido no banco de dados como um registro de pessoa ativa.
{% endhint %}

O fluxo de notificação será o seguinte:

#### Análise de Qualidade - Rejeitado

A primeira notificação conterá o status `"REJECTED"` pela operação de `"QUALITY_ANALYSIS"`.

```json
{
	"operation": "QUALITY_ANALYSIS",
	"tguid": "<tguid>",
	"status": "REJECTED"
}
```

#### Cadastro - Falha

O resultado da operação de `QUALITY_ANALYSIS` será seguido de uma notificação de cadastro apontando para o status `"FAILED"` para a operação de `"ENROLL"`.

```json
{
	"operation": "ENROLL",
	"tguid": "tguid",
	"status": "FAILED"
}
```


# Best of Biometrics

Best of Biometrics é uma operação aplicada pelo GBDS quando dois ou mais perfis são unificados ou vinculados.

Quando aplicado, o Best of Biometrics avalia cada template de impressão digital e palmar individualmente e seleciona os templates com a mais alta qualidade em cada dedo e/ou posição da palma entre todas as transações unificadas. Em seguida, ele atualiza o perfil da pessoa para unificar a "melhor" biometria em uma única transação ativa que será usada para comparação biométrica. Esta operação não se aplica aos templates de rosto e íris, nos quais as imagens mais recentes substituirão as mais antigas, independentemente da qualidade.

Para habilitar o Best of Biometrics, o parâmetro de configuração `gbds.biometric.best-of-biometrics.enabled` deve ser definida como `true` tanto na configuração GBDS quanto na configuração da API do GBDS.

Há dois casos em que o Best of Biometrics é executado: quando os perfis do banco de dados não são deduplicados e devem ser vinculados e quando ocorre uma exceção e o tratamento UNIFICAR é aplicado.

## Vinculando Perfis

Esta opção é uma operação N para 1. O operador pode vincular vários perfis em apenas um perfil resultante. Isso é feito por meio de chamadas de API diretas para o GBS ETR Server.

Para vincular dois perfis, o operador deve primeiro consolidar as transações de um Perfil B no Perfil A. Esta operação irá comparar as transações no Perfil B e a transação ativa do Perfil A para obter a "melhor biometria" de acordo com as regras mencionadas acima. Em seguida, ele gerará uma nova transação com a biometria da mais alta qualidade que deve ser enviada como uma atualização `trusted` para o Perfil A.

Assim que os Perfis A e B forem mesclados com sucesso, o Perfil B pode ser desabilitado, não estando mais disponível para comparação biométrica.

## Unificando Perfis

Esta opção é uma operação 1 para 1. Pode ser executado quando perfis entrantes geram uma exceção de cadastro ou atualização com um perfil existente no ETR. Se o tratamento escolhido para esses perfis for UNIFICAR, o Best of Biometrics será aplicado, se estiver ativo.


# Guia de Integração do Intelligence

## Introdução

Este manual descreve o fluxo de trabalho de integração padrão do GBS Intelligence, que permite a busca biográfica no banco de dados. Qualquer chamada de API mencionada neste manual deve ser realizada de acordo com a [Especificação de API do GBS Intelligence](https://gitbook.griaule.com/apis/intelligence) .

{% hint style="info" %}
Todas as chamadas para o GBS Intelligence devem ser realizadas para o servidor ETR, conforme mencionado na especificação da API.
{% endhint %}

## Login

Qualquer solicitação à GBS Intelligence requer um login autenticado `session-guid`. Para obtê-lo , é necessário enviar `session-guid`uma solicitação [de login, informando uma combinação válida de usuário/senha.](https://gitbook.griaule.com/apis/intelligence/endpoints#post-session)

{% hint style="info" %}
O usuário e a senha devem ser os mesmos usados ​​para fazer login no GBDS e outros aplicativos Griaule.
{% endhint %}

A operação de login retornará um session-guid que deve ser fornecido em todas as solicitações ao GBS Intelligence.

## Lista de Campos de Busca por Request

Qualquer request de busca submetida ao GBS Intelligence deve especificar o campo biográfico a ser usado. Para verificar os campos biográficos disponíveis, pode-se usar [listSearchFields](https://gitbook.griaule.com/apis/intelligence/fields)

{% hint style="info" %}
If the biographic field name specified in the search request does not match a field that exists within the database, an error will be returned.
{% endhint %}

## Pesquisando por Valor

Ao realizar uma solicitação de pesquisa, é recomendável dividir o fluxo de trabalho em duas etapas: contagem e lista.

Ao contar os resultados disponíveis para os critérios de pesquisa fornecidos antecipadamente, é possível paginar os resultados, evitando qualquer sobrecarga na recuperação e visualização dos resultados.

Após a contagem dos resultados, é possível solicitar e paginar os resultados da pesquisa por meio dos parâmetros de consulta da solicitação.

### Contar

A solicitação [de resultados da pesquisa de contagem](https://gitbook.griaule.com/dev/api/intelligence/profiles#post-profile-list-count) deve conter os campos `name`e `value`a serem pesquisados.

{% hint style="info" %}
Qualquer perfil que contenha o valor a ser pesquisado dentro do campo biográfico fornecido será retornado como resultado da pesquisa, independentemente da posição.

por exemplo, uma expressão regular que descreve os critérios de pesquisa seria `*value*`, sendo `*`um curinga que abrange qualquer caractere em qualquer quantidade.
{% endhint %}

### Lista

A solicitação [de Resultados da Pesquisa de Lista](https://gitbook.griaule.com/dev/api/intelligence/profiles#post-profile-list) também deve conter os campos `name`e `value`a serem pesquisados, e os critérios de pesquisa serão os mesmos usados ​​para contar os resultados.

Esta solicitação aceita parâmetros de consulta que podem ser usados ​​para filtrar a lista retornada, como `first`, que determina a posição do primeiro resultado retornado na lista, e `size`, que define o número de resultados a serem retornados, começando pelo `first`.

## Acessando detalhes do perfil

Após realizar a pesquisa e recuperar os resultados, é possível usar os PGUIDs retornados para acessar os detalhes do perfil por meio da chamada [Request Profile](https://gitbook.griaule.com/apis/intelligence/profiles#get-profile-person-pguid).

Este método retornará todos os dados do perfil do PGUID fornecido, incluindo dados biográficos e imagens codificadas em base64.

## Ferramenta de conversão de imagem

O GBS Intelligence também fornece um método para [converter imagens](https://gitbook.griaule.com/apis/intelligence/image-conversion#post-image-convert) em diferentes formatos, fornecendo a imagem original codificada em base64, seu formato e o formato desejado para conversão.


# Integração do BCC Services

## Introdução

BCC Services é um componente de software usado para captura biométrica. O BCC Services é usado para coletar imagens biométricas, mas não as envia automaticamente para o servidor. Você pode ver como enviar uma captura para o GBDS na seção [Cadastro no GBDS](#cadastro-no-gbds).

{% hint style="warning" %}
O BCC Services não salva os dados biométricos coletados e apenas os mantêm na RAM enquanto estiver ativo. Reiniciar ou desligar o computador ou fechar o BCC Services resultará na perda das coleções.
{% endhint %}

Este manual descreve o fluxo de trabalho e a solução de problemas padrão de captura biométrica do BCC Services. Consulte a [especificação da API do BCC Services](/apis/bcc-services) para obter mais informações sobre as chamadas de API.

Este manual está atualizado para a versão 2.8.8 do BCC Services.

## Fluxo de Captura

Esta seção descreverá o fluxo de captura e as opções de capturas biométricas que você pode realizar com BCC Services. Um exemplo das chamadas e respostas do endpoint pode ser visto no [Exemplo de Fluxo de Captura](#exemplo-de-fluxo-de-captura)

Para iniciar uma captura, você precisa chamar um dos endpoints de captura biométrica. Esses são:

* [Captura de Iris](https://gitbook.griaule.com/apis/bcc-services/biometric-capture#post-bcc-capture-irises)
* [Captura de Palmar](https://gitbook.griaule.com/apis/bcc-services/biometric-capture#post-bcc-capture-palm)
* [Captura de Assinatura](https://gitbook.griaule.com/apis/bcc-services/biometric-capture#post-bcc-capture-signature)
* [Captura de Impressão Digital](https://gitbook.griaule.com/apis/bcc-services/biometric-capture#post-bcc-capture-fingerprint)
* [Captura de Palmar de Recém-nascido](https://gitbook.griaule.com/apis/bcc-services/biometric-capture#post-bcc-capture-baby-palm)
* [Captura de Face](https://gitbook.griaule.com/apis/bcc-services/biometric-capture#post-bcc-capture-face)
* [Captura de Imagem Auxiliar](https://gitbook.griaule.com/apis/bcc-services/biometric-capture#post-bcc-capture-auxiliary-image)
* [Captura de Perfil Completo](https://gitbook.griaule.com/apis/bcc-services/biometric-capture#post-bcc-capture-profile)

Essas capturas podem retornar uma de duas respostas:

* **200**, para OK
* **400**, para ERRO

O status **200** terá um campo `tguid` que você deve salvar. Cada chamada de Captura Biométrica terá seu ID único, independente de quantas capturas forem realizadas na mesma chamada. ou seja, você pode realizar a chamada [Captura de Impressão Digital](https://gitbook.griaule.com/apis/bcc-services/biometric-capture#post-bcc-capture-fingerprint) para coletar todos os dez dedos, gerando um tguid para todas as capturas, ou usando o mesmo endpoint dez vezes, gerando um tguid para cada impressão digital.

A captura biométrica gera uma janela de captura. Para obter o status de captura, execute a [chamada de status](https://gitbook.griaule.com/apis/bcc-services/capture-instance-status#get-bcc-capture-status). Este endpoint retornará o status de captura, as informações do sensor e uma informação parcial de quais biometrias são capturadas.

Você deve realizar a chamada de `status` até que o valor do campo `status` seja `captured`. Isso indicará que a captura foi concluída. Outros status podem ser vistos se a captura estiver incompleta, como `capturing` se a janela de captura ainda estiver aberta ou `closed` se a janela de captura tiver sido fechada sem concluir a captura.

Ao obter o status `captured`, você precisa executar a chamada de [getProfile](https://gitbook.griaule.com/apis/bcc-services/capture-instance-status#get-bcc-capture). A resposta desta chamada contém as imagens `.wsq` e `.jpeg`. Essas estão no campo `buffer` e `convertido-buffer`, respectivamente, como bytearrays no formato base64.

Após a conclusão de uma captura, recomendamos salvar as imagens em um banco de dados local até enviá-las ao servidor.

{% hint style="danger" %}
BCC Services salva a captura na RAM. Sair do BCC Services, desligar ou reiniciar o computador sem persistir os dados da transação resultará em perda de dados.
{% endhint %}

Depois que todas as capturas necessárias forem feitas, reinicie os serviços BCC usando a chamada [restartBcc](https://gitbook.griaule.com/apis/bcc-services/capture-instance-status#delete-bcc-capture-restart).

{% hint style="warning" %}
Reiniciar o BCC Services limpará todos os dados de transações na RAM. Garanta que seus dados estejam salvos antes de reiniciar o BCC Services.
{% endhint %}

A chamada `restartBcc` encerrará o BCC Services e o reabrirá automaticamente. Para garantir que o software esteja em execução após a reinicialização, execute a chamada [serviceStatus](https://gitbook.griaule.com/apis/bcc-services/bcc-service-status#get-bcc-running) e verifique se o valor do campo `serverState` é `running`.

### Reabrir janela de captura incompleta

Se o usuário fechou a janela de captura sem finalizar a captura, a [chamada de status](https://gitbook.griaule.com/apis/bcc-services/capture-instance-status#get-bcc-capture-status) retornará o valor do `status` como `closed`. Você pode continuar uma captura interrompida com a chamada [openCapture](https://gitbook.griaule.com/apis/bcc-services/capture-instance-status#get-bcc-capture-open) passando o `tguid` fornecido pela chamada de captura biométrica. Isso manterá o progresso da captura.

### Recuperando TGUID

Se você perdeu um TGUID por qualquer motivo, poderá recuperar o TGUID usando a chamada [listCaptureInstances](https://gitbook.griaule.com/apis/bcc-services/capture-instance-status#get-bcc-capture-instances). Dentro do array de `instances`, você pode encontrar todas as capturas biométricas realizadas enquanto o BCC Services estava ativo (se o histórico de transações não foi limpo). Ele listará na ordem de execução, a primeira será a primeira Captura Biométrica chamada e a última será a última Captura Biométrica chamada. Um exemplo de resposta é mostrado abaixo.

```json
{
	"result": "OK",
	"instances": [
		{
			"tguid": "F1F14ADA-6A00-4A67-B887-F574764ECC77",
			"type": "FINGERPRINT"
		},
		{
			"tguid": "DD08CEAA-B508-421D-8484-717DF01C0C55",
			"type": "SIGNATURE"
		},
		{
			"tguid": "EB321A10-F2B2-46DB-9479-8A6E5A1A485D",
			"type": "PROFILE"
		}
	]
}
```

## Solução de Problemas

O BCC Services tem algumas chamadas para solução de problemas que você pode fazer e garantir que as coisas estejam funcionando corretamente. Tal como se seus equipamentos estão sendo identificados e se a versão do software é conhecida por você e pela equipe de suporte que pode ajudá-lo com seu problema. Essas chamadas são apresentadas a seguir.

### Versão

Verificar a versão do software é essencial para o cenário de solução de problemas. Para verificar a versão do BCC Services, execute a [chamada de versão](https://gitbook.griaule.com/apis/bcc-services/bcc-service-status).

### Execução

Para verificar se o programa está executando, use a [chamada de serviceStatus](https://gitbook.griaule.com/apis/bcc-services/bcc-service-status#get-bcc-running) e observe o valor do campo `serverState`.

### Dispositivos

O BCC Services oferece uma opção para mostrar todos os dispositivos que estão conectados a ele. Para exibir a lista de dispositivos, execute a chamada [deviceStatus](https://gitbook.griaule.com/apis/bcc-services/bcc-service-status#get-bcc-status-devices).

## Desligamento

Para desligar o BCC Services, chame [finishService](https://gitbook.griaule.com/apis/bcc-services/bcc-service-status#get-bcc-bye)

## Exemplo de Fluxo de Captura

Neste exemplo, descreveremos como realizar as chamadas para um registro de uma captura rolada de todos os dedos da mão esquerda.

Primeiro, execute a [Chamada de Captura de Impressão Digital](https://gitbook.griaule.com/apis/bcc-services/biometric-capture#post-bcc-capture-fingerprint) com a seguinte query:

{% hint style="info" %}
O campo `captureMode` não afeta o comportamento da captura do BCC Services. Este campo é utilizado para identificar a operação no BCC.
{% endhint %}

```json
{
	"captureMode": "REGISTER",
	"notifyUrl": "",
	"theme": "DARK",
	"captureType": "ROLLED",
	"type": "FINGERPRINT",
	"sequenceControlType": "NONE",
	"indexes": [
		{
			"index": "LEFT_LITTLE"
		},
		{
			"index": "LEFT_RING"
		},
		{
			"index": "LEFT_MIDDLE"
		},
		{
			"index": "LEFT_INDEX"
		},
		{
			"index": "LEFT_THUMB"
		}
	],
	"exceptionSetType": "SIMPLIFIED",
	"functions": [
		{
			"type": "RESET",
			"enabled": true
		},
		{
			"type": "CONFIG",
			"enabled": true
		},
		{
			"type": "CLEAR",
			"enabled": true
		},
		{
			"type": "CAPTURE",
			"enabled": true
		},
		{
			"type": "CANCEL",
			"enabled": true
		},
		{
			"type": "CAPTURE_NEW_IMAGE",
			"enabled": true
		},
		{
			"type": "IMAGE_PREVIEW",
			"enabled": true
		},
		{
			"type": "NEXT",
			"enabled": true
		},
		{
			"type": "OK",
			"enabled": true
		},
		{
			"type": "UPDATE_IMAGE",
			"enabled": true
		},
		{
			"type": "REMOVE_IMAGE",
			"enabled": true
		},
		{
			"type": "LIVE",
			"enabled": true
		},
		{
			"type": "ACQUIRE",
			"enabled": true
		},
		{
			"type": "SAVE",
			"enabled": true
		},
		{
			"type": "IMPORT",
			"enabled": true
		}
	]
}
```

Se a tela for aberta com sucesso, você receberá este JSON:

```json
{
	"result": "OK",
	"tguid": "F1F14ADA-6A00-4A67-B887-F574764ECC77"
}
```

Copie este TGUID e comece a chamar [status](https://gitbook.griaule.com/apis/bcc-services/capture-instance-status#get-bcc-capture-status). até receber o status `captured`.

{% hint style="warning" %}
Lembre-se que outros status, como `closed`, também podem ser retornados caso o operador não complete a captura.
{% endhint %}

Se nenhum dedo foi capturado, a resposta deve ser:

```json
{
	"result": "OK",
	"tguid": "F1F14ADA-6A00-4A67-B887-F574764ECC77",
	"type": "FINGERPRINT",
	"status": "CAPTURING",
	"operation": "INIT",
	"command": "INIT",
	"profile": {},
	"profileMetadata": {
		"profileVersion": "GBS BCC profile v2.8.7",
		"appName": "GBS BCC",
		"macAddress": [
			"08-62-66-80-D5-5C",
			"42-E2-30-11-DB-15",
			"42-E2-30-11-D3-15",
			"08-62-66-80-D4-94",
			"40-E2-30-13-F7-8A",
			"40-E2-30-11-D3-15"
		],
		"softwareStatus": {
			"vendor": "Griaule Biometrics Ltda.",
			"version": "2.8.7.10805",
			"name": "GBS BCC Service"
		},
		"fingerprintPluggedDevices": [],
		"fingerprintStartedDevices": [],
		"faceDevice": {
			"productName": "OBS Virtual Camera",
			"serialNumber": "N/A",
			"firmwareVersion": "N/A"
		},
		"bodyDevice": {
			"productName": "OBS Virtual Camera",
			"serialNumber": "N/A",
			"firmwareVersion": "N/A"
		},
		"signatureDevice": {
			"serialNumber": "N/A"
		},
		"irisDevice": "IRITECH",
		"fields": [],
		"fingerprints": [],
		"palms": [],
		"bodyImages": []
	},
	"windowInfo": {
		"x": 683.0,
		"y": 237.0,
		"width": 685.0,
		"height": 579.0,
		"state": "NORMAL"
	}
}
```

Se alguns dedos foram capturados, mas a captura não foi finalizada, o `status` responderá com as informações de captura parcial, conforme mostrado:

```json
{
	"result": "OK",
	"tguid": "F1F14ADA-6A00-4A67-B887-F574764ECC77",
	"type": "FINGERPRINT",
	"status": "CAPTURING",
	"operation": "INIT",
	"command": "INIT",
	"profileMetadata": {
		"profileVersion": "GBS BCC profile v2.8.7",
		"appName": "GBS BCC",
		"macAddress": [
			"08-62-66-80-D5-5C",
			"42-E2-30-11-DB-15",
			"42-E2-30-11-D3-15",
			"08-62-66-80-D4-94",
			"40-E2-30-13-F7-8A",
			"40-E2-30-11-D3-15"
		],
		"softwareStatus": {
			"vendor": "Griaule Biometrics Ltda.",
			"version": "2.8.7.10805",
			"name": "GBS BCC Service"
		},
		"fingerprintPluggedDevices": [],
		"fingerprintStartedDevices": [],
		"faceDevice": {
			"productName": "OBS Virtual Camera",
			"serialNumber": "N/A",
			"firmwareVersion": "N/A"
		},
		"bodyDevice": {
			"productName": "OBS Virtual Camera",
			"serialNumber": "N/A",
			"firmwareVersion": "N/A"
		},
		"signatureDevice": {
			"serialNumber": "N/A"
		},
		"irisDevice": "IRITECH",
		"fields": [],
		"fingerprints": [
			{
				"index": "LEFT_LITTLE",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left little",
				"image": {
					"resolution": 500
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 96
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 72,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_RING",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left ring",
				"image": {
					"resolution": 500
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 98
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 66,
				"captured": false,
				"extracted": true
			}
		],
		"palms": [],
		"bodyImages": []
	},
	"windowInfo": {
		"x": 683.0,
		"y": 237.0,
		"width": 685.0,
		"height": 579.0,
		"state": "NORMAL"
	}
}
```

Após o término da captura, o campo de `status` mudará para `captured` e a chamada de `status` responderá com:

{% hint style="warning" %}
Os valores `BYTEARRAY` são strings no formato base64.
{% endhint %}

```json
{
	"result": "OK",
	"tguid": "F1F14ADA-6A00-4A67-B887-F574764ECC77",
	"type": "FINGERPRINT",
	"status": "CAPTURED",
	"operation": "INIT",
	"command": "NONE",
	"profileMetadata": {
		"profileVersion": "GBS BCC profile v2.8.7",
		"appName": "GBS BCC",
		"macAddress": [
			"08-62-66-80-D5-5C",
			"42-E2-30-11-DB-15",
			"42-E2-30-11-D3-15",
			"08-62-66-80-D4-94",
			"40-E2-30-13-F7-8A",
			"40-E2-30-11-D3-15"
		],
		"softwareStatus": {
			"vendor": "Griaule Biometrics Ltda.",
			"version": "2.8.7.10805",
			"name": "GBS BCC Service"
		},
		"fingerprintPluggedDevices": [],
		"fingerprintStartedDevices": [],
		"faceDevice": {
			"productName": "OBS Virtual Camera",
			"serialNumber": "N/A",
			"firmwareVersion": "N/A"
		},
		"bodyDevice": {
			"productName": "OBS Virtual Camera",
			"serialNumber": "N/A",
			"firmwareVersion": "N/A"
		},
		"signatureDevice": {
			"serialNumber": "N/A"
		},
		"irisDevice": "IRITECH",
		"fields": [],
		"fingerprints": [
			{
				"index": "LEFT_LITTLE",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left little",
				"image": {
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 96
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 72,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_RING",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left ring",
				"image": {
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 98
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 66,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_MIDDLE",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left middle",
				"image": {
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 98
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 76,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_INDEX",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left index",
				"image": {
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 100
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 71,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_THUMB",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left thumb",
				"image": {
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 100
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 70,
				"captured": false,
				"extracted": true
			}
		],
		"palms": [],
		"bodyImages": []
	},
	"windowInfo": {
		"x": 683.0,
		"y": 237.0,
		"width": 1000.0,
		"height": 579.0,
		"state": "NORMAL"
	}
}
```

{% hint style="info" %}
Após uma transação completa, a chamada de status responde com as imagens `.jpeg`.
{% endhint %}

Agora é hora de realizar a chamada [getProfile](https://gitbook.griaule.com/apis/bcc-services/capture-instance-status#get-bcc-capture). Esta chamada responderá com as imagens em imagens `.wsq` e `.jpeg`. O campo `buffer` contém as imagens `.wsq` enquanto o campo `converted-buffer` contém as imagens `.jpeg`.

```json
{
	"result": "OK",
	"tguid": "F1F14ADA-6A00-4A67-B887-F574764ECC77",
	"type": "FINGERPRINT",
	"status": "CAPTURED",
	"operation": "INIT",
	"command": "NONE",
	"profile": {
		"fingerprints": [
			{
				"index": "LEFT_LITTLE",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left little",
				"image": {
					"buffer": "BYTEARRAY",
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"buffer": "BYTEARRAY",
					"quality": 96
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 72,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_RING",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left ring",
				"image": {
					"buffer": "BYTEARRAY",
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"buffer": "BYTEARRAY",
					"quality": 98
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 66,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_MIDDLE",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left middle",
				"image": {
					"buffer": "BYTEARRAY",
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"buffer": "BYTEARRAY",
					"quality": 98
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 76,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_INDEX",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left index",
				"image": {
					"buffer": "BYTEARRAY",
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"buffer": "BYTEARRAY",
					"quality": 100
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 71,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_THUMB",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left thumb",
				"image": {
					"buffer": "BYTEARRAY",
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"buffer": "BYTEARRAY",
					"quality": 100
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 70,
				"captured": false,
				"extracted": true
			}
		]
	},
	"profileMetadata": {
		"profileVersion": "GBS BCC profile v2.8.7",
		"appName": "GBS BCC",
		"macAddress": [
			"08-62-66-80-D5-5C",
			"42-E2-30-11-DB-15",
			"42-E2-30-11-D3-15",
			"08-62-66-80-D4-94",
			"40-E2-30-13-F7-8A",
			"40-E2-30-11-D3-15"
		],
		"softwareStatus": {
			"vendor": "Griaule Biometrics Ltda.",
			"version": "2.8.7.10805",
			"name": "GBS BCC Service"
		},
		"fingerprintPluggedDevices": [],
		"fingerprintStartedDevices": [],
		"faceDevice": {
			"productName": "OBS Virtual Camera",
			"serialNumber": "N/A",
			"firmwareVersion": "N/A"
		},
		"bodyDevice": {
			"productName": "OBS Virtual Camera",
			"serialNumber": "N/A",
			"firmwareVersion": "N/A"
		},
		"signatureDevice": {
			"serialNumber": "N/A"
		},
		"irisDevice": "IRITECH",
		"fields": [],
		"fingerprints": [
			{
				"index": "LEFT_LITTLE",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left little",
				"image": {
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 96
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 72,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_RING",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left ring",
				"image": {
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 98
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 66,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_MIDDLE",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left middle",
				"image": {
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 98
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 76,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_INDEX",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left index",
				"image": {
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 100
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 71,
				"captured": false,
				"extracted": true
			},
			{
				"index": "LEFT_THUMB",
				"type": "ROLLED",
				"typeIndexKey": "ROLLED-left thumb",
				"image": {
					"resolution": 500,
					"converted-buffer": "BYTEARRAY"
				},
				"height": 480,
				"width": 320,
				"template": {
					"quality": 100
				},
				"captureType": "FLAT",
				"nfiq": 1,
				"contrast": 70,
				"captured": false,
				"extracted": true
			}
		],
		"palms": [],
		"bodyImages": []
	},
	"windowInfo": {
		"x": 683.0,
		"y": 237.0,
		"width": 685.0,
		"height": 579.0,
		"state": "NORMAL"
	}
}
```

Após a captura, você pode enviar as imagens para o servidor. Para entender como registrar a biometria capturada no GBDS, vá para a próxima seção.

### Cadastro no GBDS

Chame o [endpoint de enroll](https://gitbook.griaule.com/apis/gbds-4/people#post-people) se desejar registrar as imagens capturadas anteriormente no GBDS.

No payload você precisa inserir as informações das chaves (keys), e biográficos (biographics). Dentro do array `biometric`, você precisará inserir os dados do endpoint `getCapture` do BCC Services.

O valor do campo `buffer` BCC Services precisa ser colocado no valor do campo `content` no payload do JSON para o GBDS.

{% hint style="info" %}
Para obter mais informações sobre operações no GBDS, consulte o Manual de Integração do GBDS.
{% endhint %}

O payload de exemplo para realizar o registro é mostrada abaixo:

```json
{
	"meta": {
		"priority": "DEFAULT_PRIORITY",
		"timeout": "-1"
	},
	"data": {
		"keys": [
			{
				"id": "CPF",
				"value": "618.323.606-44"
			}
		],
		"biographics": [
			{
				"id": "name",
				"value": "John Doe"
			}
		],
		"biometric": [
			{
				"source": "ORIGINAL",
				"type": "FINGERPRINT",
				"format": "WSQ",
				"properties": {
					"width": 0,
					"height": 0,
					"resolution": 500,
					"ratio": 0.0,
					"matcherId": 0,
					"extractorId": 0
				},
				"index": 0,
				"content": "BYTEARRAY"
			},
			{
				"source": "ORIGINAL",
				"type": "FINGERPRINT",
				"format": "WSQ",
				"properties": {
					"width": 0,
					"height": 0,
					"resolution": 500,
					"ratio": 0.0,
					"matcherId": 0,
					"extractorId": 0
				},
				"index": 1,
				"content": "BYTEARRAY"
			},
			{
				"source": "ORIGINAL",
				"type": "FINGERPRINT",
				"format": "WSQ",
				"properties": {
					"width": 0,
					"height": 0,
					"resolution": 500,
					"ratio": 0.0,
					"matcherId": 0,
					"extractorId": 0
				},
				"index": 2,
				"content": "BYTEARRAY"
			},
			{
				"source": "ORIGINAL",
				"type": "FINGERPRINT",
				"format": "WSQ",
				"properties": {
					"width": 0,
					"height": 0,
					"resolution": 500,
					"ratio": 0.0,
					"matcherId": 0,
					"extractorId": 0
				},
				"index": 3,
				"content": "BYTEARRAY"
			},
			{
				"source": "ORIGINAL",
				"type": "FINGERPRINT",
				"format": "WSQ",
				"properties": {
					"width": 0,
					"height": 0,
					"resolution": 500,
					"ratio": 0.0,
					"matcherId": 0,
					"extractorId": 0
				},
				"index": 4,
				"content": "BYTEARRAY"
			}
		]
	}
}
```

### Anotação de anomalia na captura

Para que uma anomalia na captura da impressão digital seja registrada, o metadado da transação deve incluir o objeto `fingerprints`. Este objeto deve conter os índices dos dedos e suas respectivas anomalias.

**Exemplo**:

```json
"fingerprints": [
    {
        "index": "LEFT_LITTLE",
        "anomaly": "AMPUTATED"
    }
]
```

**Os índices são ENUMs:**

* `LEFT_LITTLE`
* `LEFT_RING`
* `LEFT_MIDDLE`
* `LEFT_INDEX`
* `LEFT_THUMB`
* `RIGHT_THUMB`
* `RIGHT_INDEX`
* `RIGHT_MIDDLE`
* `RIGHT_RING`
* `RIGHT_LITTLE`

**Os tipos de anomalias são:**

* `DAMAGED`
* `BANDAGED`
* `IGNORED`
* `AMPUTATED`

O **metadado** precisa ser adicionado ao *enroll* em formato base64, da seguinte forma:

{% code fullWidth="false" %}

```json
"data": {
    "keys": [
		...
    ],
    "biographics": [
    	...
    ],
    "labels": [
        ...
    ],
    "metadata": "ewoJInByb2ZpbGVWZXJzaW9uIjogIkdCRFMgcHJvZmlsZSIsCgkiYXBwTmFtZSI6ICJHQkRTIiwKCSJmaW5nZXJwcmludHMiOiBbCgkJewoJCQkiaW5kZXgiOiAiTEVGVF9MSVRUTEUiLAoJCQkidHlwZSI6ICJST0xMRUQiLAoJCQkidHlwZUluZGV4S2V5IjogIlJPTExFRC1MRUZUX0xJVFRMRSIsCgkJCSJjYXB0dXJlVHlwZSI6ICJST0xMRUQiLAoJCQkiYW5vbWFseSI6ICJEQU1BR0VEIiwKCQkJIm5maXEiOiAwLAoJCQkiY29udHJhc3QiOiAwLAoJCQkiY2FwdHVyZWQiOiBmYWxzZSwKCQkJImV4dHJhY3RlZCI6IGZhbHNlCgkJfSwKCQl7CgkJCSJpbmRleCI6ICJMRUZUX1JJTkciLAoJCQkidHlwZSI6ICJST0xMRUQiLAoJCQkidHlwZUluZGV4S2V5IjogIlJPTExFRC1MRUZUX1JJTkciLAoJCQkiY2FwdHVyZVR5cGUiOiAiUk9MTEVEIiwKCQkJImFub21hbHkiOiAiQkFOREFHRUQiLAoJCQkibmZpcSI6IDAsCgkJCSJjb250cmFzdCI6IDAsCgkJCSJjYXB0dXJlZCI6IGZhbHNlLAoJCQkiZXh0cmFjdGVkIjogZmFsc2UKCQl9LAoJCXsKCQkJImluZGV4IjogIkxFRlRfTUlERExFIiwKCQkJInR5cGUiOiAiUk9MTEVEIiwKCQkJInR5cGVJbmRleEtleSI6ICJST0xMRUQtTEVGVF9NSURETEUiLAoJCQkiY2FwdHVyZVR5cGUiOiAiUk9MTEVEIiwKCQkJImFub21hbHkiOiAiSUdOT1JFRCIsCgkJCSJuZmlxIjogMCwKCQkJImNvbnRyYXN0IjogMCwKCQkJImNhcHR1cmVkIjogZmFsc2UsCgkJCSJleHRyYWN0ZWQiOiBmYWxzZQoJCX0sCgkJewoJCQkiaW5kZXgiOiAiTEVGVF9JTkRFWCIsCgkJCSJ0eXBlIjogIlJPTExFRCIsCgkJCSJ0eXBlSW5kZXhLZXkiOiAiUk9MTEVELUxFRlRfSU5ERVgiLAoJCQkiY2FwdHVyZVR5cGUiOiAiUk9MTEVEIiwKCQkJImFub21hbHkiOiAiQU1QVVRBVEVEIiwKCQkJIm5maXEiOiAwLAoJCQkiY29udHJhc3QiOiAwLAoJCQkiY2FwdHVyZWQiOiBmYWxzZSwKCQkJImV4dHJhY3RlZCI6IGZhbHNlCgkJfQogICAgXQp9",
    "biometric": [
		...
    ]
}
```

{% endcode %}

O campo `"metadata"`, representado em base64 no exemplo acima, corresponde ao seguinte JSON:

{% hint style="info" %}
O JSON deve conter pelo menos o campo “*fingerprints*” e dentro de cada item no mínimo os campos "index" e "anomaly".
{% endhint %}

```json
{
    "profileVersion": "GBDS profile",
    "appName": "GBDS",
    "fingerprints": [
        {
            "index": "LEFT_LITTLE",
            "type": "ROLLED",
            "typeIndexKey": "ROLLED-LEFT_LITTLE",
            "captureType": "ROLLED",
            "anomaly": "DAMAGED",
            "nfiq": 0,
            "contrast": 0,
            "captured": false,
            "extracted": false
        },
        {
            "index": "LEFT_RING",
            "type": "ROLLED",
            "typeIndexKey": "ROLLED-LEFT_RING",
            "captureType": "ROLLED",
            "anomaly": "BANDAGED",
            "nfiq": 0,
            "contrast": 0,
            "captured": false,
            "extracted": false
        },
        {
            "index": "LEFT_MIDDLE",
            "type": "ROLLED",
            "typeIndexKey": "ROLLED-LEFT_MIDDLE",
            "captureType": "ROLLED",
            "anomaly": "IGNORED",
            "nfiq": 0,
            "contrast": 0,
            "captured": false,
            "extracted": false
        },
        {
            "index": "LEFT_INDEX",
            "type": "ROLLED",
            "typeIndexKey": "ROLLED-LEFT_INDEX",
            "captureType": "ROLLED",
            "anomaly": "AMPUTATED",
            "nfiq": 0,
            "contrast": 0,
            "captured": false,
            "extracted": false
        }
    ]
}
```


# Apache Ranger™ e Ranger KMS

Este manual é um guia de instalação do Apache Ranger™ e Ranger KMS.

{% hint style="warning" %}
Este procedimento se aplica ao ambiente GHDP.
{% endhint %}

## Pré-requisitos

Instale os pré-requisitos para o procedimento de [build do Ranger](#builddoranger).

### Maven

1. Faça o download da última versão do Maven em [Downloading Apache Maven](https://maven.apache.org/download.cgi) ou:

   ```sh
   cd /usr/local
   wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
   tar -xvf apache-maven-<Version>-bin.tar.gz
   ```
2. Edite o arquivo que carrega as variáveis de ambiente do GHDP:

   ```sh
   vim /etc/profile.d/hadoop_setup.sh
   ```

   ```sh
   ...
   # MAVEN (to Ranger)
   export M2_VERSION=$(ls -A /usr/local/ | grep apache-maven- | grep -v .gz | awk -F '-' '{print $3}')
   export M2_HOME=/usr/local/apache-maven-$M2_VERSION
   export M2=$M2_HOME/bin
   ...
   ```
3. Verifique se a instalação ocorreu corretamente:

   ```sh
   mvn -version
   ```

### Outros requisitos

Instale os outros requisitos necessários:

```sh
yum -y install git
yum -y install gcc
yum -y install g++
yum install bzip2 -y
yum -y install java-1.8.0-openjdk-devel
yum -y install python3
```

## Build do Ranger

1. Baixe o *source* do Ranger mais atualizado que se adeque à versão do seu OS e Java, no [site oficial do Ranger](https://ranger.apache.org/download.html) ou:

   ```sh
   wget https://dlcdn.apache.org/ranger/2.3.0/apache-ranger-2.3.0.tar.gz
   tar -xvf apache-ranger-2.3.0.tar.gz
   cd ./apache-ranger-2.3.0
   ```
2. Faça o *build* do Ranger utilizando o Maven:

   ```sh
   mvn clean compile package install
   ```
3. Caso ocorra erro de acesso inseguro, por conta de certificado vencido em algum link de repositório, execute o *build* da seguinte forma:

   ```sh
   mvn clean compile package install -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true
   ```
4. Finalize o procedimento de *build* com o seguinte comando:

   ```sh
   mvn eclipse:eclipse
   ```
5. Ao final, será gerada uma pasta chamada `target` com todos os componentes do Ranger.

   ```sh
   cd ./target
   ls -l

   total 1328820
   drwxr-xr-x. 2 root root      4096 Dec 15 14:34 antrun
   -rw-r--r--. 1 root root        87 Dec 15 14:34 checkstyle-cachefile
   -rw-r--r--. 1 root root      9216 Dec 15 14:34 checkstyle-checker.xml
   -rw-r--r--. 1 root root     20369 Dec 15 14:34 checkstyle-header.txt
   -rw-r--r--. 1 root root        81 Dec 15 14:34 checkstyle-result.xml
   -rw-r--r--. 1 root root      1144 Dec 15 14:34 checkstyle-suppressions.xml
   drwxr-xr-x. 3 root root      4096 Dec 15 14:34 maven-shared-archive-resources
   -rw-r--r--. 1 root root 518758611 Dec 15 14:34 ranger-2.3.0-admin.tar.gz
   -rw-r--r--. 1 root root  41566842 Dec 15 14:34 ranger-2.3.0-atlas-plugin.tar.gz
   -rw-r--r--. 1 root root  36041635 Dec 15 14:34 ranger-2.3.0-elasticsearch-plugin.tar.gz
   -rw-r--r--. 1 root root  36975553 Dec 15 14:34 ranger-2.3.0-hbase-plugin.tar.gz
   -rw-r--r--. 1 root root  35537921 Dec 15 14:34 ranger-2.3.0-hdfs-plugin.tar.gz
   -rw-r--r--. 1 root root  35327622 Dec 15 14:34 ranger-2.3.0-hive-plugin.tar.gz
   -rw-r--r--. 1 root root  54580246 Dec 15 14:34 ranger-2.3.0-kafka-plugin.tar.gz
   drwxr-xr-x. 7 root root      4096 Dec 15 14:34 ranger-2.3.0-kms
   -rw-r--r--. 1 root root 195191513 Dec 15 14:34 ranger-2.3.0-kms.tar.gz
   -rw-r--r--. 1 root root  49243221 Dec 15 14:34 ranger-2.3.0-knox-plugin.tar.gz
   -rw-r--r--. 1 root root  34477047 Dec 15 14:34 ranger-2.3.0-kylin-plugin.tar.gz
   -rw-r--r--. 1 root root     34007 Dec 15 14:34 ranger-2.3.0-migration-util.tar.gz
   -rw-r--r--. 1 root root  41233187 Dec 15 14:34 ranger-2.3.0-ozone-plugin.tar.gz
   -rw-r--r--. 1 root root  55205632 Dec 15 14:34 ranger-2.3.0-presto-plugin.tar.gz
   -rw-r--r--. 1 root root  15803444 Dec 15 14:34 ranger-2.3.0-ranger-tools.tar.gz
   -rw-r--r--. 1 root root    905882 Dec 15 14:34 ranger-2.3.0-schema-registry-plugin.jar
   -rw-r--r--. 1 root root     37302 Dec 15 14:34 ranger-2.3.0-solr_audit_conf.tar.gz
   -rw-r--r--. 1 root root     40595 Dec 15 14:34 ranger-2.3.0-solr_audit_conf.zip
   -rw-r--r--. 1 root root  36130187 Dec 15 14:34 ranger-2.3.0-solr-plugin.tar.gz
   -rw-r--r--. 1 root root  34715214 Dec 15 14:34 ranger-2.3.0-sqoop-plugin.tar.gz
   -rw-r--r--. 1 root root   6315989 Dec 15 14:34 ranger-2.3.0-src.tar.gz
   -rw-r--r--. 1 root root  49575156 Dec 15 14:34 ranger-2.3.0-storm-plugin.tar.gz
   -rw-r--r--. 1 root root  30112906 Dec 15 14:34 ranger-2.3.0-tagsync.tar.gz
   -rw-r--r--. 1 root root  19205167 Dec 15 14:34 ranger-2.3.0-usersync.tar.gz
   -rw-r--r--. 1 root root  33381584 Dec 15 14:34 ranger-2.3.0-yarn-plugin.tar.gz
   -rw-r--r--. 1 root root    196038 Dec 15 14:34 rat.txt
   -rw-r--r--. 1 root root         5 Dec 15 14:34 version
   ```

## Instalação do Solr

{% hint style="info" %}
Consulte no [Site Oficial do Solr](https://solr.apache.org/downloads.html) qual a melhor versão do Solr para seu sistema.
{% endhint %}

1. Acesse a pasta de *build* do Ranger, conforme efetuado no [tópico anterior](#builddoranger).\ <br>
2. Dentro dessa pasta, acesse a pasta do instalador do Solr, em que ele será pré-configurado para uso do Ranger:

   ```sh
   cd ~/apache-ranger-2.3.0
   cd ./security-admin/contrib/solr_for_audit_setup/
   ```
3. Crie a pasta do Solr conforme a versão escolhida:

   ```sh
   mkdir -p /usr/gdp/hadoop/solr/8.11.2/
   ```
4. Edite o arquivo `install.properties`:

   ```sh
   vim install.properties
   ```

   ```properties
   ...
   SOLR_INSTALL=true
   SOLR_DOWNLOAD_URL=https://dlcdn.apache.org/lucene/solr/8.11.2/solr-8.11.2.tgz
   SOLR_LOG_FOLDER=/var/log/hadoop/solr/ranger_audits
   ...

   :wq
   ```

   ```sh
   sed -i 's/\/opt\/solr/\/usr\/gdp\/hadoop\/solr\/8.11.2/g' install.properties
   ```
5. Execute o script `setup.sh` e verifique os procedimentos de *start* conforme indicado pelo *log* de instalação:

   ```sh
   chmod +x setup.sh
   ./setup.sh

   less /usr/gdp/hadoop/solr/8.11.2/ranger_audit_server/install_notes.txt
   ```
6. Inicie o Solr:

   ```sh
   /usr/gdp/hadoop/solr/8.11.2/ranger_audit_server/scripts/start_solr.sh
   ```

## Instalação e configuração do Ranger Admin

1. Crie a pasta do Ranger Admin:

   ```sh
   mkdir -p /usr/gdp/hadoop/ranger/2.3.0/ranger-admin
   ```
2. Acesse a pasta `target`, gerada no procedimento de [build](#builddoranger), e descompacte o arquivo `ranger-2.3.0-admin.tar.gz`:

   ```sh
   cd ./apache-ranger-2.3.0/target
   tar -xvf ranger-2.3.0-admin.tar.gz
   ```
3. Copie todos os arquivos dentro da pasta descompactada para a pasta `ranger-admin`.

   ```sh
   cd ranger-2.3.0-admin
   cp -R * /usr/gdp/hadoop/ranger/2.3.0/ranger-admin/
   ```
4. No banco de dados, crie o usuário `rangerdba` da seguinte forma:

   ```sh
   mysql -uroot -p
   ```

   ```sql
   SET GLOBAL validate_password_policy=LOW;

   CREATE USER 'rangerdba'@'localhost' IDENTIFIED BY 'rangerdba';

   GRANT ALL PRIVILEGES ON *.* TO 'rangerdba'@'localhost';

   CREATE USER 'rangerdba'@'%' IDENTIFIED BY 'rangerdba';

   GRANT ALL PRIVILEGES ON *.* TO 'rangerdba'@'%';

   GRANT ALL PRIVILEGES ON *.* TO 'rangerdba'@'localhost' WITH GRANT OPTION;

   GRANT ALL PRIVILEGES ON *.* TO 'rangerdba'@'%' WITH GRANT OPTION;

   FLUSH PRIVILEGES;
   ```
5. Caso não esteja instalado, instale o `mysql-connector-java` e verifique se o arquivo `mysql-connector-java.jar` está na pasta correta:

   ```sh
   yum install mysql-connector-java
   ls /usr/share/java/mysql-connector-java.jar
   ```
6. Crie a pasta de *logs* para o Ranger Admin:

   ```sh
   mkdir -p /var/log/hadoop/ranger/ranger-admin
   ```
7. Na pasta do Ranger Admin, edit o arquivo `install.properties`:

   ```sh
   cd /usr/gdp/hadoop/ranger/2.3.0/ranger-admin/
   vim install.properties
   ```

   ```properties
   ...
   db_root_user=rangerdba
   db_root_password=rangerdba
   db_host=localhost

   db_name=ranger
   db_user=rangerdba
   db_password=rangerdba

   rangerAdmin_password=Griaule.123
   rangerTagsync_password=Griaule.123
   rangerUsersync_password=Griaule.123
   keyadmin_password=Griaule.123

   audit_solr_urls=http://localhost:6083/solr/ranger_audits

   policymgr_supportedcomponents=hbase,hdfs,kafka,kms

   authentication_method=UNIX
   remoteLoginEnabled=true
   authServiceHostName=localhost
   authServicePort=5151

   hadoop_conf=/etc/hadoop/hdfs/conf/

   RANGER_ADMIN_LOG_DIR=/var/log/hadoop/ranger/ranger-admin
   ...
   ```
8. Execute o script de *setup*:

   ```sh
   ./setup.sh
   ```
9. Adicione permissões para as pastas do Ranger e *logs* e adicione o usuário `ranger` no grupo `hadoop`.

   ```sh
   chown -R ranger: /usr/gdp/hadoop/ranger/
   chown -R ranger: /var/log/hadoop/ranger/
   usermod -a -G hadoop ranger
   ```
10. Para inicializar o Ranger Admin utilize o comando:

    ```sh
    ranger-admin start
    ```
11. Acesse o link e digite o usuário `admin` e a senha pré-configurada.

    ```html
    http://<my_ip>:6080/
    ```

{% hint style="info" %}
Nesse contexto, a senha pré-configurada sempre será `Griaule.123`.
{% endhint %}

## Instalação do Ranger UserSync

1. Na pasta de *build* do Ranger, crie uma pasta para o Ranger UserSync chamada `ranger-usersync`, descompacte o arquivo `tar.gz` referente à aplicação e copie todos os arquivos para a pasta criada:

   ```sh
   mkdir -p /usr/gdp/hadoop/ranger/2.3.0/ranger-usersync
   tar -xvf ranger-2.3.0-usersync.tar.gz
   cd ranger-2.3.0-usersync
   cp -R * /usr/gdp/hadoop/ranger/2.3.0/ranger-usersync
   ```
2. Crie a pasta de *logs* e conceda acesso ao usuário `ranger` às pastas `/usr/gdp/hadoop/ranger/` e `/var/log/hadoop/ranger/`:

   ```sh
   mkdir -p /var/log/hadoop/ranger/ranger-usersync
   chown -R ranger: /usr/gdp/hadoop/ranger/
   chown -R ranger: /var/log/hadoop/ranger/
   ```
3. Na pasta `ranger-usersync`, edite o arquivo `install.properties` da seguinte forma:

   ```sh
   cd /usr/gdp/hadoop/ranger/2.3.0/ranger-usersync
   vim install.properties
   ```

   ```properties
   ...
   POLICY_MGR_URL = http://<ip_addr>:6080

   SYNC_SOURCE = unix

   SYNC_INTERVAL = 5

   rangerUsersync_password=Griaule.123 # mesma senha que foi definida pra ele no ranger-admin

   hadoop_conf=/etc/hadoop/hdfs/conf

   logdir=/var/log/hadoop/ranger/ranger-usersync
   ...
   ```
4. Altere o *path* padrão da aplicação de `/etc/ranger` para `/usr/gdp/hadoop/ranger/2.3.0/ranger-usersync/ranger`:

   ```sh
   sed -i 's/\/etc\/ranger/\/usr\/gdp\/hadoop\/ranger\/2.3.0\/ranger-usersync\/ranger/g' install.properties
   ```
5. Execute o script `setup.sh`:

   ```sh
   ./setup.sh
   ```
6. Altere a configuração para habilitar a sincronização do UserSync:

   ```sh
   vim /usr/gdp/hadoop/ranger/2.3.0/ranger-usersync/conf/ranger-ugsync-site.xml
   ```

   ```xml
   <property>
     <name>ranger.usersync.enabled</name>
     <value>true</value>
   </property>
   ```
7. Após a instalação com resultado **successfully**, inicialize o serviço utilizando o script `ranger-usersync-services.sh`:

   ```sh
   # Inicialização:
   ./ranger-usersync-services.sh start

   # Paralisação:
   ./ranger-usersync-services.sh stop
   ```

## Instalação de Plugins

{% hint style="info" %}
Os plugins **não são** necessários para o funcionamento do Ranger KMS. São apenas recursos disponíveis para auditoria dos recursos do Hadoop.
{% endhint %}

### HDFS Plugin

{% hint style="warning" %}
O HDFS Plugin deve ser instalado em **todos** os *NameNodes*.
{% endhint %}

1. Crie a pasta `ranger-hdfs-plugin` conforme a estrutura do GHDP:

   ```sh
   mkdir -p /usr/gdp/hadoop/ranger/2.3.0/ranger-hdfs-plugin
   ```
2. Na pasta de *build* do Ranger, descompacte o arquivo `ranger-2.3.0-hdfs-plugin.tar.gz` e copie todos os arquivos para a pasta criada anteriormente:

   ```sh
   cd ./apache-ranger-2.3.0/target/
   tar -xvf ranger-2.3.0-hdfs-plugin.tar.gz
   cd ranger-2.3.0-hdfs-plugin
   cp -R * /usr/gdp/hadoop/ranger/2.3.0/ranger-hdfs-plugin
   ```
3. Na pasta do plugin, edite o arquivo `install.properties`:

   ```sh
   cd /usr/gdp/hadoop/ranger/2.3.0/ranger-hdfs-plugin
   vim install.properties
   ```

   ```properties
   ...
   POLICY_MGR_URL=http://<host_addrs>:6080

   REPOSITORY_NAME=hadoopdev

   COMPONENT_INSTALL_DIR_NAME=/usr/gdp/hadoop/hdfs/3.2.4/

   XAAUDIT.SOLR.ENABLE = true
   XAAUDIT.SOLR.URL = http://<host_addrs>:6083/solr/ranger_audits
   XAAUDIT.SOLR.USER = NONE
   XAAUDIT.SOLR.PASSWORD = NONE
   XAAUDIT.SOLR.ZOOKEEPER = NONE
   XAAUDIT.SOLR.FILE_SPOOL_DIR = /var/log/hadoop/hdfs/audit/solr/spool
   ...
   ```
4. Caso exista mais de um *NameNode*, crie a mesma estrutura de pastas e copie todo o conteúdo para os demais *NameNodes* com `scp`:

   > Esse procedimento deve ser realizado **antes** da habilitação do *plugin*.

   ```sh
   # NameNode2
   mkdir -p /usr/gdp/hadoop/ranger/2.3.0/ranger-hdfs-plugin

   # NameNode1
   scp -r * root@localhost:/usr/gdp/hadoop/ranger/2.3.0/ranger-hdfs-plugin/

   # NameNode2
   cd /usr/gdp/hadoop/ranger/2.3.0/ranger-hdfs-plugin
   ls -l
   ```
5. Habilite o *plugin* executando o script `enable-hdfs-plugin.sh`:

   ```sh
   ./enable-hdfs-plugin.sh
   ```
6. Conecte no **Ranger Admin UI**. Na tela principal, em HDFS, clique no botão + e preencha os campos com as seguintes informações:
   * *Service Name*: `hadoopdev`
   * *Display Name*: `hadoopdev`
   * *Username*: `hadoop` (Usuário UNIX)
   * *Password*: `<senha criada para o usuário hadoop no UNIX>`
   * *NameNode URL*: `hdfs://localhost:50070`
   * *Authentication Type*: `Simple`\ <br>
7. Mantenha o restante das configurações inalteradas e clique no botão Add.\ <br>
8. Reinicie o *cluster*.

### HBase Plugin

{% hint style="warning" %}
O HBase Plugin deve ser instalado em **todos** os hosts com *Master* e *Regional*.
{% endhint %}

1. Crie a pasta `ranger-hbase-plugin` conforme a estrutura do GHDP.

   ```sh
   mkdir -p /usr/gdp/hadoop/ranger/2.3.0/ranger-hbase-plugin
   ```
2. Na pasta de *build* do Ranger, descompacte o arquivo `ranger-2.3.0-hbase-plugin.tar.gz` e copie todos os arquivos para a pasta criada anteriormente:

   ```sh
   cd ./apache-ranger-2.3.0/target/
   tar -xvf ranger-2.3.0-hbase-plugin.tar.gz
   cd ranger-2.3.0-hbase-plugin
   cp -R * /usr/gdp/hadoop/ranger/2.3.0/ranger-hbase-plugin
   ```
3. Na pasta do plugin, edite o arquivo `install.properties`:

   ```sh
   vim install.properties
   ```

   ```properties
   ...
   POLICY_MGR_URL=http://localhost:6080

   REPOSITORY_NAME=hbasedev

   COMPONENT_INSTALL_DIR_NAME=/usr/gdp/hadoop/hbase/2.5.1

   XAAUDIT.SOLR.ENABLE=true
   XAAUDIT.SOLR.URL=http://localhost:6083/solr/ranger_audits
   XAAUDIT.SOLR.USER=NONE
   XAAUDIT.SOLR.PASSWORD=NONE
   XAAUDIT.SOLR.ZOOKEEPER=NONE
   XAAUDIT.SOLR.FILE_SPOOL_DIR=/var/log/hadoop/hbase/audit/solr/spool

   XAAUDIT.SOLR.IS_ENABLED=true
   XAAUDIT.SOLR.MAX_QUEUE_SIZE=1
   XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS=1000
   XAAUDIT.SOLR.SOLR_URL=http://localhost:6083/solr/ranger_audits
   ...
   ```
4. Crie a mesma estrutura de pastas e copie todo o conteúdo para o *Master* e *Regional*:

   > Esse procedimento deve ser realizado **antes** da habilitação do *plugin*.

   ```sh
   # node2 & node3
   mkdir -p /usr/gdp/hadoop/ranger/2.3.0/ranger-hbase-plugin

   # node1
   scp -r * root@localhost:/usr/gdp/hadoop/ranger/2.3.0/ranger-hbase-plugin/
   scp -r * root@localhost:/usr/gdp/hadoop/ranger/2.3.0/ranger-hbase-plugin/

   # node2 & node3
   cd /usr/gdp/hadoop/ranger/2.3.0/ranger-hbase-plugin
   ls -l
   ```
5. Crie um usuário `hbase` e habilite o *plugin* executando o script `enable-hbase-plugin.sh`:

   ```sh
   useradd hbase
   passwd hbase
   ./enable-hbase-plugin.sh
   ```
6. Conecte no **Ranger Admin UI**. Na tela principal, em HDFS, clique no botão + e preencha os campos com as seguintes informações:
   * *Service Name*: `hadoopdev`
   * *Display Name*: `hadoopdev`
   * *Username*: `hbase` (Usuário UNIX)
   * *Password*: `<senha criada para o usuário hbase no UNIX>`
   * *hadoop.security.authentication*: `Simple`
   * *hbase.security.authentication*: `Simple`
   * *hbase.zookeeper.property.clientPort*: `2181`
   * *hbase.zookeeper.quorum*: `,,`
   * *zookeeper.znode.parent*: `/hbase-unsecure`\ <br>
7. Mantenha o restante das configurações inalteradas e clique no botão Add.\ <br>
8. Reinicie o *cluster*.

### Kafka Plugin

{% hint style="warning" %}
O Kafka Plugin deve ser instalado em **todos** os hosts que possuem o componente instalado.
{% endhint %}

1. Crie a pasta `ranger-kafka-plugin` conforme a estrutura do GHDP:

   ```sh
   mkdir -p /usr/gdp/hadoop/ranger/2.3.0/ranger-kafka-plugin
   ```
2. Na pasta de *build* do Ranger, descompacte o arquivo `ranger-2.3.0-kafka-plugin.tar.gz` e copie todos os arquivos para a pasta criada anteriormente:

   ```sh
   cd ./apache-ranger-2.3.0/target/
   tar -xvf ranger-2.3.0-kafka-plugin.tar.gz
   cd ranger-2.3.0-kafka-plugin
   cp -R * /usr/gdp/hadoop/ranger/2.3.0/ranger-kafka-plugin
   ```
3. Na pasta do plugin, edite o arquivo `install.properties`:

   ```sh
   vim install.properties
   ```

   ```properties
   ...
   COMPONENT_INSTALL_DIR_NAME=/usr/gdp/hadoop/kafka/3.3.1/

   POLICY_MGR_URL=http://localhost:6080

   REPOSITORY_NAME=kafkadev

   XAAUDIT.SOLR.ENABLE=true
   XAAUDIT.SOLR.URL=http://localhost:6083/solr/ranger_audits
   XAAUDIT.SOLR.USER=NONE
   XAAUDIT.SOLR.PASSWORD=NONE
   XAAUDIT.SOLR.ZOOKEEPER=NONE
   XAAUDIT.SOLR.FILE_SPOOL_DIR=/var/log/hadoop/kafka/audit/solr/spool

   XAAUDIT.SOLR.IS_ENABLED=true
   XAAUDIT.SOLR.MAX_QUEUE_SIZE=1
   XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS=1000
   XAAUDIT.SOLR.SOLR_URL=http://localhost:6083/solr/ranger_audits
   ...
   ```
4. Crie a mesma estrutura de pastas e copie todo o conteúdo para os demais *nodes*:

   > Esse procedimento deve ser realizado **antes** da habilitação do *plugin*.

   ```sh
   # node2 & node3
   mkdir -p /usr/gdp/hadoop/ranger/2.3.0/ranger-kafka-plugin

   # node1
   scp -r * root@localhost:/usr/gdp/hadoop/ranger/2.3.0/ranger-kafka-plugin
   scp -r * root@localhost:/usr/gdp/hadoop/ranger/2.3.0/ranger-kafka-plugin

   # node2 & node3
   cd /usr/gdp/hadoop/ranger/2.3.0/ranger-kafka-plugin
   ls -l
   ```
5. Crie um usuário `kafka` e habilite o *plugin* executando o script `enable-kafka-plugin.sh`:

   ```sh
   useradd kafka
   passwd kafka
   ./enable-kafka-plugin.sh
   ```
6. Conecte no **Ranger Admin UI**. Na tela principal, em HDFS, clique no botão + e preencha os campos com as seguintes informações:
   * *Service Name*: `hadoopdev`
   * *Display Name*: `hadoopdev`
   * *Username*: `hbase` (Usuário UNIX)
   * *Password*: `<senha criado para o usuário hbase no UNIX>`
   * *hadoop.security.authentication*: `Simple`
   * *hbase.security.authentication*: `Simple`
   * *hbase.zookeeper.property.clientPort*: `2181`
   * *hbase.zookeeper.quorum*: `,,`
   * *zookeeper.znode.parent*: `/hbase-unsecure`\ <br>
7. Mantenha o restante das configurações inalteradas e clique no botão Add.\ <br>
8. Reinicie o *cluster*.

## Instalação e Configuração do Ranger KMS

### Instalação do Ranger KMS

1. Crie a pasta `ranger-kms` conforme a estrutura do GHDP:

   ```sh
   mkdir -p /usr/gdp/hadoop/ranger/2.3.0/ranger-kms
   ```
2. No servidor do MySQL, crie um usuário `rangerkms` para o gerenciamento da base feito pela a aplicação:

   ```sh
   mysql -uroot -p
   ```

   ```sql
   CREATE USER 'rangerkms'@'localhost' IDENTIFIED BY 'rangerkms';

   GRANT ALL PRIVILEGES ON *.* TO 'rangerkms'@'localhost';

   CREATE USER 'rangerkms'@'%' IDENTIFIED BY 'rangerkms';

   GRANT ALL PRIVILEGES ON *.* TO 'rangerkms'@'%';

   GRANT ALL PRIVILEGES ON *.* TO 'rangerkms'@'localhost' WITH GRANT OPTION;

   GRANT ALL PRIVILEGES ON *.* TO 'rangerkms'@'%' WITH GRANT OPTION;

   FLUSH PRIVILEGES;
   ```
3. Na pasta de *build* do Ranger, descompacte o Ranger KMS e copie todos os arquivos para a pasta criada anteriormente:

   ```sh
   cd ./apache-ranger-2.3.0/target/
   tar -xvf ranger-2.3.0-kms.tar.gz
   cd ranger-2.3.0-kms
   cp -R * /usr/gdp/hadoop/ranger/2.3.0/ranger-kms/
   ```
4. Crie a pasta de *logs* para o Ranger KMS:

   ```sh
   mkdir -p /var/log/hadoop/ranger/ranger-kms/
   ```
5. Utilizando um gerador de senhas, crie uma senha com os seguintes parâmetros e guarde-a em um local confiável (ela será utilizada no passo seguinte):
   * 16 caracteres
   * Letras maiúsculas
   * Letras minúsculas
   * Caracteres especiais.\ <br>
6. Na pasta do Ranger KMS, edite o arquivo `install.properties` adicionando configuração para Java Key Store (arquiva a master key em um arquivo no próprio servidor):

   > Utilize a senha de 16 caracteres gerada no passo anterior como `KMS_MASTER_KEY_PASSWD`. Por exemplo: `$ZH1$Q8&ExUaTku8`.

   ```sh
   cd /usr/gdp/hadoop/ranger/2.3.0/ranger-kms/
   vim install.properties
   ```

   ```properties
   ...
   db_root_user=rangerkms
   db_root_password=rangerkms
   db_host=localhost

   db_name=rangerkms
   db_user=rangerkms
   db_password=rangerkms

   COMPONENT_INSTALL_DIR_NAME=/usr/gdp/hadoop/ranger/2.3.0/ranger-kms

   KMS_MASTER_KEY_PASSWD=<senha de 16 caracteres gerada anteriormente>

   hadoop_conf=/etc/hadoop/hdfs/conf

   POLICY_MGR_URL=http://localhost:6080

   REPOSITORY_NAME=kmsdev

   XAAUDIT.SOLR.ENABLE=true
   XAAUDIT.SOLR.URL=http://localhost:6083/solr/ranger_audits
   XAAUDIT.SOLR.USER=NONE
   XAAUDIT.SOLR.PASSWORD=NONE
   XAAUDIT.SOLR.ZOOKEEPER=NONE
   XAAUDIT.SOLR.FILE_SPOOL_DIR=/var/log/hadoop/ranger/ranger-kms/audit/solr/spool

   XAAUDIT.SOLR.IS_ENABLED=true
   XAAUDIT.SOLR.MAX_QUEUE_SIZE=1
   XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS=1000
   XAAUDIT.SOLR.SOLR_URL=http://localhost:6083/solr/ranger_audits

   RANGER_KMS_LOG_DIR=/var/log/hadoop/ranger/ranger-kms
   ...
   ```

### Configuração do Ranger KMS com Luna Cloud HSM

1. Antes de efetuar o *setup* do Ranger KMS, é necessário adicionar o *LunaProvider* no arquivo `java.security`. Para isso, edite o arquivo `java.security`, que se encontra na pasta `<JDK_installation_directory>/jre/lib/security`, adicionando duas linhas no final: uma com o *LunaProvider* na sequência da lista de provedores, `security.provider.10=com.safenetinc.luna.provider.LunaProvider`, e uma com a configuração para que o Luna funcione, `com.safenetinc.luna.provider.createExtractableKeys=true`:

   ```sh
   vim /usr/lib/java/jre/lib/security/java.security
   ```

   ```properties
   #
   # List of providers and their preference orders (see above):
   #
   security.provider.1=sun.security.provider.Sun
   security.provider.2=sun.security.rsa.SunRsaSign
   security.provider.3=sun.security.ec.SunEC
   security.provider.4=com.sun.net.ssl.internal.ssl.Provider
   security.provider.5=com.sun.crypto.provider.SunJCE
   security.provider.6=sun.security.jgss.SunProvider
   security.provider.7=com.sun.security.sasl.Provider
   security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
   security.provider.9=sun.security.smartcardio.SunPCSC
   security.provider.10=com.safenetinc.luna.provider.LunaProvider

   com.safenetinc.luna.provider.createExtractableKeys=true
   ```
2. Copie os arquivos `LunaProvider.jar` e `libLunaAPI.so` para a pasta `<JDK_installation_directory/jre/lib/ext`.

   ```sh
   cp /usr/safenet/lunaclient/jsp/LunaProvider.jar /usr/lib/java/jre/lib/ext/
   cp /usr/safenet/lunaclient/jsp/64/libLunaAPI.so /usr/lib/java/jre/lib/ext/
   ```
3. Utilizando um gerador de senhas, crie uma senha com os seguintes parâmetros e guarde-a em um local confiável (ela será utilizada no passo seguinte):
   * 16 caracteres
   * Letras maiúsculas
   * Letras minúsculas
   * Caracteres especiais.\ <br>
4. Edite o arquivo `install.properties` para o *setup* do Ranger KMS com o Luna Cloud HSM:

   > Utilize a senha de 16 caracteres gerada no passo anterior como `KMS_MASTER_KEY_PASSWD`. Por exemplo: `$ZH1$Q8&ExUaTku8`.

   ```sh
   cd /usr/gdp/hadoop/ranger/2.3.0/ranger-kms/
   vim install.properties
   ```

   ```properties
   ...
   db_root_user=rangerkms
   db_root_password=rangerkms
   db_host=localhost

   db_name=rangerkms
   db_user=rangerkms
   db_password=rangerkms

   COMPONENT_INSTALL_DIR_NAME=/usr/gdp/hadoop/ranger/2.3.0/ranger-kms

   KMS_MASTER_KEY_PASSWD=<senha de 16 caracteres gerada anteriormente>

   hadoop_conf=/etc/hadoop/hdfs/conf

   #------------------------- Ranger KMS HSM CONFIG ------------------------------
   HSM_TYPE=LunaProvider
   HSM_ENABLED=true
   HSM_PARTITION_NAME=rangerkms
   HSM_PARTITION_PASSWORD=Griaule.123

   POLICY_MGR_URL=http://localhost:6080

   REPOSITORY_NAME=kmsdev

   XAAUDIT.SOLR.ENABLE=true
   XAAUDIT.SOLR.URL=http://localhost:6083/solr/ranger_audits
   XAAUDIT.SOLR.USER=NONE
   XAAUDIT.SOLR.PASSWORD=NONE
   XAAUDIT.SOLR.ZOOKEEPER=NONE
   XAAUDIT.SOLR.FILE_SPOOL_DIR=/var/log/hadoop/ranger/ranger-kms/audit/solr/spool

   XAAUDIT.SOLR.IS_ENABLED=true
   XAAUDIT.SOLR.MAX_QUEUE_SIZE=1
   XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS=1000
   XAAUDIT.SOLR.SOLR_URL=http://localhost:6083/solr/ranger_audits

   RANGER_KMS_LOG_DIR=/var/log/hadoop/ranger/ranger-kms
   ...
   ```
5. Em todos o *nodes*, para que os *datanodes* acessem o KMS, edite o arquivo `core-site.xml` alterando o *value* da propriedade `hadoop.security.key.provider.path` para `kms://http@localhost:9292/kms`:

   ```sh
   vim /etc/hadoop/hdfs/conf/core-site.xml
   ```

   ```xml
   <property>
     <name>hadoop.security.key.provider.path</name>
     <value>kms://http@localhost:9292/kms</value>
   </property>
   ```
6. Reinicie o HDFS.

   ```sh
   dfsstop
   dfsstart
   ```
7. Conceda ao usuário `kms` as permissões para as pastas:

   ```sh
   chown -R kms: /var/log/hadoop/ranger/ranger-kms/
   chown -R kms: /usr/gdp/hadoop/ranger/2.3.0/ranger-kms/
   ```
8. Execute o *script* de *setup*, aguarde a finalização da instalação com a mensagem **successfully** e inicialize o Ranger KMS:

   ```sh
   ./setup.sh

   # Iniciar:
   ranger-kms start

   # Finalizar:
   ranger-kms stop
   ```
9. Se tudo ocorreu com sucesso, será possível acessar o painel do Ranger KMS por meio do endereço do Ranger Admin utilizando o usuário `keyadmin` e a senha definida no [procedimento de instalação do Ranger Admin](#instalacaorangeradmin).
   * *Link*: `http://<my_ip>:6080/`
   * *User*: `keyadmin`
   * *Password*: `<definida no install.properties durante o setup do Ranger Admin>`\ <br>
10. Entre no Ranger Admin UI com o usuário `admin`, acesse Settings > Users/Groups/Roles. Na aba Users, clique no botão Add New User e crie os usuários:
    * `hive`
    * `hdfs`
    * `om`
    * `hbase`\ <br>
11. Em seguida, faça logout e entre como `keyadmin` para acessar o painel do Ranger KMS UI no Service KMS. Clique no botão + para criar o repositório `kmsdev`, conforme as especificações abaixo:
    * *Service Name*: `kmsdev`
    * *KMS URL*: `kms://http@:9292/kms`
    * *Username*: `keyadmin`
    * *Password*: `<senha definida no procedimento de instalação do Ranger Admin>`\ <br>
12. Na mesma tela, em Audit Filter, clique no botão + para adicionar uma ACL com as seguintes especificações:
    * *Access Result*: `ALLOWED`
    * *Permissions*: `Select All`
    * *Users*: `keyadmin`\ <br>
13. Clique em Add. Em seguida, clique para editar o repositório `kmsdev` e clique no botão Test Connection, para confirmar se todo o procedimento ocorreu corretamente.\ <br>
14. Reinicie o Ranger KMS:

    ```sh
    ranger-kms stop
    ranger-kms start
    ```
15. Caso esteja utilizando o Luna Cloud HSM, verifique se houve a criação da *master key*. Para isso, execute o `lunacm`:

    ```sh
    lunacm
    ```

    Ou:

    ```sh
    cd /usr/safenet/lunaclient/
    ./bin/64/lunacm
    ```
16. Faça login com o role *crypto officer*:

    ```sh
    role login -name crypto officer
    ```
17. Liste o conteúdo da partição para verificar se a *master key* foi criada com sucesso:

    ```sh
    partition contents
    ```

    Exemplo de saída com a *master key* criada:

    ```
    lunacm:>partition contents

            The 'Crypto Officer' is currently logged in. Looking for objects
            accessible to the 'Crypto Officer'.

            Object list:

            Label:         RangerKMSKey
            Handle:        1
            Object Type:   Symmetric Key
            Usage Limit:   none
            Object UID:    9f1d00002d000001706c0800

            Number of objects:  1

    Command Result : No Error
    ```

{% hint style="success" %}
O arquivo de configuração do Ranger KMS, `dbks-site.xml`, se encontra em:

```sh
/usr/gdp/hadoop/ranger/2.3.0/ranger-kms/ews/webapp/WEB-INF/classes/conf/dbks-site.xml
```

{% endhint %}

## Ativar Load Balancer no Ranger KMS

1. Em um segundo servidor, realize todo o procedimento de [instalação do Ranger KMS](#instalacaorangerkms).

{% hint style="warning" %}
Caso esteja utilizando Luna Cloud HSM, siga as instruções do [guia de instalação do Luna Cloud HSM](/ferramentas-auxiliares/lunacloudhsm#lunacloudhsm-installguide-pt) contidas nos tópicos [1.1. Download do client](/ferramentas-auxiliares/lunacloudhsm#lunacloudhsm-downloaddoclient) e [1.2. Instalação do client no servidor](/ferramentas-auxiliares/lunacloudhsm#lunacloudhsm-instalacaodoclientnoservidor) para realizar a instalação do client. Não é necessário realizar os procedimentos de ativar slot, iniciar partição ou iniciar as roles, contidos nos tópicos posteriores do guia. Em seguida, siga rigorosamente as instruções de [instalação](#instalacaorangerkms) e [configuração](#configuracaorangerkms) do HSM com Ranger, porém tomando os cuidados descritos abaixo.
{% endhint %}

2. No **passo 5** da [configuração](#configuracaorangerkms), em que é preciso alterar o arquivo `core-site.xml` para que os *datanodes* acessem o KMS, prossiga da seguinte forma: abra o arquivo, encontre a propriedade `hadoop.security.key.provider.path` e altere seu *value* de `kms://http@localhost:9292/kms` para `kms://http@host1;host2:9292/kms`:\ <br>

   ```sh
   vim /etc/hadoop/hdfs/conf/core-site.xml
   ```

   Antes:

   ```xml
   <property>
     <name>hadoop.security.key.provider.path</name>
     <value>kms://http@localhost:9292/kms</value>
   </property>
   ```

   Depois:

   ```xml
   <property>
     <name>hadoop.security.key.provider.path</name>
     <value>kms://http@host1;host2:9292/kms</value>
   </property>
   ```
3. Reinicie o HDFS:

   ```sh
   dfsstop
   dfsstart
   ```
4. Siga com a finalização do procedimento de [configuração do Ranger KMS](#configuracaorangerkms), a partir do passo 6.

## Desinstalação do Ranger

Para desinstalar o Ranger, execute os seguintes comandos:

```bash
rm -rf /var/log/ranger /var/log/hadoop/ranger /usr/gdp/hadoop/solr/ /usr/gdp/hadoop/ranger/ /etc/ranger/ /var/log/hadoop/solr/ /var/lib/mysql/ranger/

rm -f /usr/gdp/hadoop/*/*/.ranger*
rm -f /usr/gdp/hadoop/*/*/*/.ranger*
rm -f /usr/gdp/hadoop/*/*/*/*/.ranger*

rm -f /usr/gdp/hadoop/hdfs/3.2.4/etc/hadoop/ranger*
rm -f /usr/gdp/hadoop/hdfs/3.2.4/share/hadoop/hdfs/lib/ranger*

rm -f /usr/bin/ranger*
rm -f /etc/rc.d/init.d/ranger*
rm -f /etc/rc.d/rc2.d/*ranger*
rm -f /etc/rc.d/rc3.d/*ranger*
```

```sql
mysql -uroot -p
show schemas;
drop database ranger;
drop database rangerkms;
```


# Luna Cloud HSM

{% hint style="info" %}
Para testar ou comprar a solução acesse: [Luna Cloud HSM](https://cpl.thalesgroup.com/encryption/data-protection-on-demand/services/luna-cloud-hsm).
{% endhint %}

## Download do client

1. Acesse o painel de serviços no Luna Cloud.\ <br>
2. Ao acessar o site ou DPoD, em Services > Add Service, adicione o `Luna Cloud HSM` ou `Luna Cloud HSM for Java Code Signer`.\ <br>
3. Em Services > View Services, clique no serviço criado e adicione um *client* clicando em Create Service Client.\ <br>
4. Ao finalizar, um pop-up aparecerá com a opção de download do *client* no formato `.zip`, efetue o download.\ <br>
5. Envie o arquivo `.zip` para o servidor em que o *client* será instalado.

## Instalação do client no servidor

1. Crie uma pasta em `usr` e descompacte o arquivo `.zip`:

   ```sh
   cdir -p /usr/safenet/lunaclient
   unzip setup-rangerkms1.zip -d /usr/safenet/lunaclient
   cd /usr/safenet/lunaclient
   ```
2. Por padrão, o *client* vem com arquivos do Windows. Delete os seguintes arquivos:

   ```sh
   rm -f lch-support-win-64bit.exe
   rm -f cvclient-min.zip
   ```
3. Descompacte o arquivo `.tar` com o *client* para Linux na mesma pasta do passo anterior:

   ```sh
   tar -xvf cvclient-min.tar
   ```
4. Configure as variáveis de ambiente executando o script `setenv` da seguinte forma:

   ```sh
   source ./setenv
   ```
5. Para melhor gestão, adicione os seguintes comandos no `~/.bashrc`:

   ```sh
   cd /usr/safenet/lunaclient/
   source setenv
   cd ~/

   export PATH=$PATH:/usr/safenet/lunaclient/bin/64/
   ```

## Inicialização da partição

1. Execute o `lunacm`:

   ```sh
   ./bin/64/lunacm
   ```

   Output:

   ```
   lunacm (64-bit) v10.5.0-470. Copyright (c) 2022 SafeNet. All rights reserved.

        Available HSMs:

        Slot Id ->              3
        Label ->
        Serial Number ->        1334054181693
        Model ->                Cryptovisor7
        Firmware Version ->     7.3.0
        CV Firmware Version ->  2.0.0
        Plugin Version ->       Cloud 2.2.0-740
        Configuration ->        Luna User Partition With SO (PW) SigningWith    Cloning Mode
        Slot Description ->     Net Token Slot
        FM HW Status ->         FM Not Supported

        Current Slot Id: 3

   lunacm:>
   ```
2. Configure o *slot* ativo para a partição do Luna Cloud que será criada:

   Para listar o *slot*:

   ```sh
   slot list
   ```

   Para configurar o *slot*:

   ```sh
   slot set -slot <slotnum>
   ```

   Output:

   ```
   slot set -slot 3

        Current Slot Id:  3  (Luna User Slot 7.3.0 (PW) Signing With Cloning Mode)

   Command Result : No Error

   lunacm:>
   ```
3. Inicialize o serviço de partição:

   ```sh
   partition init -label <par_label>
   ```

   Durante o *wizard*, forneça as seguintes informações quando solicitadas:

   * *Enter password for Partition SO*: `Griaule.123`
   * *Enter the domain name*: `localhost`\ <br>

   Output:

   ```
   lunacm:>partition init -label rangerkms1

        You are about to initialize the partition.

        Are you sure you wish to continue?

        Type 'proceed' to continue, or 'quit' to quit now -> proceed

        Enter password for Partition SO: ***********

        Re-enter password for Partition SO: ***********

        Neither option -domain nor -defaultdomain nor -importpeddomain was specified. One is required.

        Enter the domain name: *********

        Re-enter the domain name: *********

   Command Result : No Error

   lunacm:>
   ```
4. Efetue o *login* com o *security officer* (po):

   ```sh
   role login -name partition so
   ```

   Output:

   ```
   lunacm:>role login -name partition so

        enter password: ***********

   Command Result : No Error

   lunacm:>
   ```
5. Inicialize o *crypto officer* (co) e configure a senha inicial:

   ```sh
   role init -name crypto officer
   ```

   Output:

   ```
   lunacm:>role init -name crypto officer

        enter new password: ***********

        re-enter new password: ***********

   Command Result : No Error
   ```
6. Faça o *logout* e *login* novamente:

   ```sh
   role logout
   role login -n crypto officer
   ```

   Output:

   ```
   lunacm:>role logout

   Command Result : No Error

   lunacm:>role login -n crypto officer

        enter password: ***********

   Command Result : No Error

   lunacm:>
   ```
7. Em seguida, é necessário alterar a senha do *crypto officer* no procedimento de *setup*. Caso contrário, poderá dar erro ou o cliente não irá funcionar corretamente:

   ```sh
   role changepw -name crypto officer
   ```

{% hint style="info" %}
TIP A senha pode ser alterada para a mesma, caso necessário.
{% endhint %}

8. Inicialize o *crypto user*, executando o seguinte comando:

   ```sh
   role init -name crypto user
   ```
9. Saia do `lunacm` apertando `Ctrl + C`.\ <br>
10. Para se certificar de que está tudo funcionando corretamente, execute o seguinte *script*:

    ```sh
    ./lch-support-linux-64bit
    ```


# Elastic Stack

## Introdução

Este manual descreve o procedimento de instalação do **Elastic Stack (ELK)**.

## Preparativos para Instalação

Esta seção abrange as etapas essenciais necessárias para a instalação.

{% hint style="warning" %}
Todas as etapas devem ser executadas com privilégios de root em todos os nós, salvo indicação em contrário.
{% endhint %}

Para instalar o ELK, você precisará de:

* Permissão de root no servidor
* GBDS instalado no servidor

{% hint style="info" %}
Caso não tenha o arquivo, entre em contato com a equipe de suporte da Griaule.
{% endhint %}

Então, siga os passos apresentados abaixo.

1. Faça login no servidor como *root*.
2. [Prepare o Repositório](#prepare-o-repositorio).
3. [Instale e Configure o Elasticsearch](#instalando-e-configurando-o-elasticsearch).
4. [Instale e Configure o Kibana](#instalando-e-configurando-o-kibana).
5. [Instale e Configure o Logstash](#instalando-e-configurando-o-logstash).
6. [Configure o ELK com o SmartSense](#configurando-o-elk-com-o-smartsense).

## Prepare o Repositório

Para instalar o ELK, primeiro o repositório deve ser adicionado ao servidor.

Para isso, importe a chave GPG:

```bash
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
```

Crie o arquivo do repositório:

```bash
vim /etc/yum.repos.d/elasticsearch.repo
```

Adicione o seguinte conteúdo ao arquivo e salve-o:

```properties
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```

Então, atualize o cache do gerenciador de pacotes. Comece limpando o cache:

```bash
yum clean all
```

Finalmente, faça um rebuild do cache dos pacotes:

```bash
yum makecache
```

## Instalando o ELK

### Instalando e Configurando o Elasticsearch

Instale o pacote Elasticsearch:

```bash
yum install elasticsearch -y
```

Então, abra o arquivo de configuração do Elasticsearch:

```bash
vim /etc/elasticsearch/elasticsearch.yml
```

Na seção *Network*, procure pela linha que começa com `#network.host:`. Descomente a linha e e altere seu valor para:

{% hint style="info" %}
Certifique-se de substituir `<host-ip>` pelo endereço IP do servidor.
{% endhint %}

```yml
network.host: <host-ip>
              ^^^^^^^^^
```

Em seguida, desligue o SSL alterando as seguintes configurações para `false`:

```yml
xpack.security.enabled: false

xpack.security.enrollment.enabled: false

# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
  enabled: false
  keystore.path: certs/http.p12

# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
  enabled: false
```

Então, inicie o serviço do Elasticsearch:

```bash
sudo systemctl start elasticsearch
```

E habilite o serviço do Elasticsearch para iniciar automaticamente na inicialização da máquina:

```bash
sudo systemctl enable elasticsearch
```

Finalmente, verifique se o serviço do Elasticsearch está em execução:

{% hint style="info" %}
Certifique-se de substituir `<host-ip>` pelo endereço IP do servidor.
{% endhint %}

```bash
curl -X GET "<host-ip>:9200"
             ^^^^^^^^^
```

O resultado deve ser semelhante a:

```json
{
	"name": "QDexH8a",
	"cluster_name": "elasticsearch",
	"cluster_uuid": "gAAIqERvS_msO7Y1_759Ja",
	"version": {
		"number": "6.8.23",
		"build_flavor": "default",
		"build_type": "rpm",
		"build_hash": "4f67856",
		"build_date": "2022-01-06T21:30:50.087716Z",
		"build_snapshot": false,
		"lucene_version": "7.7.3",
		"minimum_wire_compatibility_version": "5.6.0",
		"minimum_index_compatibility_version": "5.0.0"
	},
	"tagline": "You Know, for Search"
}
```

### Instalando e Configurando o Kibana

Instale o pacote Kibana:

```bash
yum install kibana -y
```

Então, abra o arquivo de configuração do Kibana:

```bash
vim /etc/kibana/kibana.yml
```

Procure pela linha que começa com `#server.host:`. Descomente a linha e altere seu valor para:

{% hint style="info" %}
Certifique-se de substituir `<hostname>` pelo nome de host do servidor. Mantenha as aspas duplas.
{% endhint %}

```yml
server.host: "<hostname>"
              ^^^^^^^^^^
```

Em seguida, procure pela linha que começa com `#elasticsearch.hosts:`. Descomente a linha e altere seu valor para:

{% hint style="info" %}
Certifique-se de substituir `<elasticsearch-host-ip>` pelo endereço IP configurado no Elasticsearch. Mantenha as aspas duplas.
{% endhint %}

```yml
elasticsearch.hosts: ["http://<elasticsearch-host-ip>:9200"]
                              ^^^^^^^^^^^^^^^^^^^^^^^
```

Então, inicie o serviço do Kibana:

```bash
sudo systemctl start kibana
```

E habilite o serviço do Kibana para iniciar automaticamente na inicialização da máquina:

```bash
sudo systemctl enable kibana
```

Em seguida, instale e configure o Nginx.

#### Instalando e Configurando o Nginx

Instale o pacote Nginx:

```bash
yum install nginx -y
```

Em seguida, crie um arquivo que conterá as credenciais de autenticação para o Kibana. Para isso, execute o seguinte comando e insira a senha desejada quando solicitado:

```bash
echo "kibanaadmin:`openssl passwd -apr1`" | tee -a /etc/nginx/htpasswd.users
```

Então, crie um novo arquivo de configuração para o Nginx:

{% hint style="info" %}
Certifique-se de substituir `<hostname>` pelo nome de host do servidor.
{% endhint %}

```bash
vim /etc/nginx/conf.d/<hostname>_kibana.conf
                      ^^^^^^^^^^
```

Adicione o seguinte conteúdo ao arquivo, fazendo as alterações apropriadas em `server_name` e `proxy_pass`:

{% hint style="info" %}
Certifique-se de substituir `<host-ip>` pelo endereço IP do servidor e `<kibana-host-ip>` pelo endereço IP do servidor em que o Kibana está instalado.
{% endhint %}

{% hint style="warning" %}
Abaixo, as linhas contendo **"^^^^^^^^^"** estão presentes apenas para destacar as alterações que devem ser feitas. Remova-as antes de salvar o arquivo.
{% endhint %}

```properties
server {
	listen 80;

	server_name <host-ip>;
	            ^^^^^^^^^

	auth_basic "Restricted Access";
	auth_basic_user_file /etc/nginx/htpasswd.users;

	location / {
		proxy_pass http://<kibana-host-ip>:5601;
		                  ^^^^^^^^^^^^^^^^
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection 'upgrade';
		proxy_set_header Host $host;
		proxy_cache_bypass $http_upgrad;
	}
}
```

Teste o arquivo de configuração do Nginx:

```bash
nginx -t
```

Então, reinicie o serviço do Nginx:

```bash
systemctl restart nginx
```

Se necessário, configure a conexão no SE:

```bash
setsebool httpd_can_network_connect 1 -P
```

Finalmente, verifique se o serviço do Kibana está em execução, acessando a seguinte URL em um navegador:

{% hint style="info" %}
Certifique-se de substituir `<host-ip>` pelo endereço IP do servidor.
{% endhint %}

```bash
http://<host-ip>/status
       ^^^^^^^^^
```

{% hint style="success" %}
O nome de usuário é **kibanaadmin** e a senha é a criada acima.
{% endhint %}

### Instalando e Configurando o Logstash

Instale o pacote Logstash:

```bash
yum install logstash -y
```

Em seguida, instale o pacote MySQL Connector/J:

```bash
yum install mysql-connector-java -y
```

{% hint style="info" %}
Caso ele não seja encontrado, realize o download em: <https://dev.mysql.com/downloads/connector/j/>
{% endhint %}

Então, crie o arquivo de configuração do Logstash:

```bash
vim /etc/logstash/conf.d/smartsense.conf
```

Adicione o seguinte conteúdo ao arquivo, fazendo as alterações apropriadas em `jdbc_connection_string`, `jdbc_user`, `jdbc_password` e `hosts`:

{% hint style="info" %}
Certifique-se de substituir `<database-ip>`, `<database-username>`, `<database-password>` e `<elasticsearch-host-ip>` pelos valores apropriados. Mantenha as aspas duplas.
{% endhint %}

{% hint style="warning" %}
Abaixo, as linhas contendo **"^^^^^^^^^"** estão presentes apenas para destacar as alterações que devem ser feitas. Remova-as antes de salvar o arquivo.
{% endhint %}

```properties
input {
	jdbc {
		jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar"
		jdbc_driver_class => "com.mysql.jdbc.Driver"
		jdbc_connection_string => "jdbc:mysql://<database-ip>:3306/"
		                                        ^^^^^^^^^^^^^
		jdbc_user => "<database-username>"
		              ^^^^^^^^^^^^^^^^^^^
		jdbc_password => "<database-password>"
		                  ^^^^^^^^^^^^^^^^^^^
		jdbc_validate_connection => true
		tracking_column => "id"
		use_column_value => true
		statement => "SELECT * FROM smartsense.load_balancing_count where id > :sql_last_value;"
		schedule => "*/2 * * * *"
		clean_run => false
	}
}
output {
	elasticsearch {
		hosts => ["<elasticsearch-host-ip>:9200"]
		           ^^^^^^^^^^^^^^^^^^^^^^^
		index => "smart_sense_index_pattern"
		document_id => "%{[id]}"
	}
	stdout {
		codec => rubydebug
	}
}
```

Em seguida, o arquivo systemd do Logstash precisa ser modificado para garantir que ele seja inicializado usando o arquivo de configuração criado anteriormente. Para isso, abra o arquivo:

```bash
vim /etc/systemd/system/logstash.service
```

{% hint style="info" %}
É possível que o arquivo esteja localizado em `/usr/lib/systemd/system/logstash.service`.
{% endhint %}

Procure a linha que começa com `ExecStart=`. Altere seu valor de:

```properties
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"
```

Para:

```properties
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash" "-f" "/etc/logstash/conf.d/smartsense.conf"
```

Então, aplique as alterações recarregando a configuração do systemd:

```bash
systemctl daemon-reload
```

{% hint style="warning" %}
Se estiver instalando em um novo servidor que possui uma base de dados vazia, insira um valor fictício na tabela `smartsense.load_balancing_count` para evitar erros. Para isso, execute o seguinte comando e insira a senha do banco de dados:

Certifique-se de substituir `<database-username>` e `<mysql-database-ip>` pelos valores apropriados.

```bash
#        vvvvvvvvvvvvvvvvvvv       vvvvvvvvvvvvvvvvvvv
mysql -u <database-username> -p -h <mysql-database-ip> \
      -e "USE smartsense; INSERT INTO load_balancing_count
         (id, hostname, load_time, api_id, transaction_type,
         latent, ul, load_count, extraction_time_avg, extraction_quality_avg,
         match_avg, total_avg, extraction_time_min, extraction_quality_min, match_min,
         total_min, extraction_time_max, extraction_quality_max, match_max, total_max)
         VALUES
         (1, 'hostname', '2023-08-31 21:25:40', '8829E30D-4994-4D09-99AF-B6F818473928',
         'IDENTIFY', 'false', 'false', 1, '541.0', '0.0', '48.0', '599.0',
         '541', '0', '48', '599', '541', '0', '48', '599');"
```

{% endhint %}

Em seguida, habilite o serviço do Logstash para iniciar automaticamente na inicialização da máquina:

```bash
sudo systemctl enable logstash
```

Então, inicie o serviço do Logstash:

```bash
sudo systemctl start logstash
```

E acompanhe o log:

```bash
tail -f /var/log/logstash/logstash-plain.log
```

{% hint style="danger" %}
Se um erro ocorrer indicando que o Logstash não pode escrever no diretório `/var/lib/logstash/{folder}`, execute o seguinte comando para alterar seu *owner*:

```bash
chown -R logstash:logstash /var/lib/logstash
```

{% endhint %}

Finalmente, para verificar se o Logstash criou o índice no Elasticsearch, execute o seguinte comando:

{% hint style="info" %}
Certifique-se de substituir `<elasticsearch-host-ip>` pelo endereço IP do servidor em que o Elasticsearch está instalado.
{% endhint %}

```bash
curl -X GET "<elasticsearch-host-ip>:9200/_cat/indices?v"
             ^^^^^^^^^^^^^^^^^^^^^^^
```

A saída deve ser semelhante a:

```
health status index                     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   smart_sense_index_pattern 6Ux_yM25SvG2zWGdGR0HQw   5   1          1            0      6.7kb          6.7kb
green  open   .kibana_1                 BBO89yLnTUC3F7nhqKwf9w   1   0          4            0       18kb           18kb
green  open   .kibana_task_manager      sIMoATiBRsS8bXiVBCscrA   1   0          2            0     12.5kb         12.5kb
```

## Configurando o ELK com o SmartSense

### Configurando o Kibana

#### Criando a *Data View*

{% hint style="info" %}
Certifique-se de substituir `<kibana-host-ip>` pelo endereço IP do servidor em que o Kibana está instalado.
{% endhint %}

Em um navegador, acesse: `http://<kibana-host-ip>:5601`. Em seguida, abra a barra lateral de opções clicando neste ícone, localizado no canto superior esquerdo da tela:

![](/files/8PZdbdpFpzgWjkvWMF0N)

Clique em Management (última seção). Então, nas opções do lado esquerdo, na seção *Data*, clique em Index Management.

Ou acesse a seguinte URL diretamente:

```html
http://<kibana-host-ip>:5601/app/management/data/index_management/indices
       ^^^^^^^^^^^^^^^^
```

Certifique-se de que o índice `smart_sense_index_pattern` aparece na lista.

Em seguida, na seção *Kibana* das opções do lado esquerdo, clique em Data Views.

Clique no botão azul Create data view e preencha os campos com as seguintes informações:

* Name: `SS Pattern`
* Index pattern: `smart_sense_index_pattern`
* Timestamp field: `load_time`

Confirme a criação da *Data View* clicando em Save data view to Kibana.

#### Criando os *Dashboards*

Abra novamente a barra lateral de opções clicando no ícone no canto superior esquerdo da tela. Na seção Analytics, clique em Dashboards.

Ou acesse a seguinte URL diretamente:

```html
http://<kibana-host-ip>:5601/app/dashboards
       ^^^^^^^^^^^^^^^^
```

Clique no botão azul Create dashboard. Em seguida, clique em Create visualization. No lado direito, configure a *visualization* com as seguintes informações:

* Visualization type: `Bar vertical stacked`
* Data view: `SS Pattern`
* Horizontal Axis:
  * Functions: `Date histogram`
  * Field: `load_time`
* Vertical Axis:
  * Functions: `Sum`
  * Field: `load_count`

Então, clique no símbolo +, localizado no canto superior esquerdo da tela, para criar um novo filtro. Configure o filtro com as seguintes informações: `transaction_type` `is` `ENROLL`. Confirme clicando em Add filter.

Finalmente, salve o *dashboard* clicando em Save to library, localizado no canto superior direito da tela, e inserindo as seguintes informações:

* Title: `SS Enroll Dashboard`
* Tags: `smartsense-enroll`

Clique em Save and return.

Repita as operações acima para criar os seguintes *dashboards*:

{% hint style="info" %}
Readeque os nomes e tags conforme necessário.
{% endhint %}

* Para **VERIFY** adicione o filtro: `transaction_type` `is` `VERIFY`
* Para **UPDATE** adicione o filtro: `transaction_type` `is` `UPDATE`
* Para **IDENTIFY** adicione o filtro: `transaction_type` `is` `IDENTIFY` `and` `latent` `is` `false`
* Para **LATENT** adicione o filtro: `transaction_type` `is` `IDENTIFY` `and` `latent` `is` `true`

Com os cinco dashboards criados, entre em cada um deles e configure o intervalo de tempo a ser exibido, clicando no ícone de calendário, localizado no canto superior direito da tela.

Em seguida, clique em Share e em Copy link. Salve o link, pois ele será usado posteriormente.

Repita a operação para os cinco dashboards.

Ao final de cada link, adicione a seguinte informação:

```default
&hide-filter-bar=true&show-time-filter=true&embed=true
```

Por exemplo, o link:

```default
http://172.16.0.185:5601/app/lens#/edit/a0a936d5-4e92-4015-b3e7-37810c2a114a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))
```

Ficará:

```default
http://172.16.0.185:5601/app/lens#/edit/a0a936d5-4e92-4015-b3e7-37810c2a114a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true
```

Repita a operação para os cinco links obtidos.

Salve os links, pois serão usados no passo seguinte.

### Configurando os Dashboards no SmartSense

Abra o arquivo de configuração do SmartSense, `config.properties`, localizado na pasta `/var/lib/tomcats/smart-sense/conf`:

```bash
vim /var/lib/tomcats/smart-sense/conf/config.properties
```

Encontre a seção **# SMARTSENSE - ELK CONFIGURATION**.

Para cada propriedade (`linkEnroll`, `linkIdentify`, `linkIdentifyLatent`, `linkUpdate`, `linkVerify`), insira o link do dashboard correspondente obtido anteriormente. Por exemplo:

```properties
linkEnroll=http://172.16.0.185:5601/app/lens#/edit/a0a936d5-4e92-4015-b3e7-37810c2a114a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkUpdate=http://172.16.0.185:5601/app/lens#/edit/25d53ee8-7adc-4b06-b05d-f38bfda39c66?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkVerify=http://172.16.0.185:5601/app/lens#/edit/8bfa1546-7990-4ed3-baae-86e421a60aef?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkIdentify=http://172.16.0.185:5601/app/lens#/edit/0d5edf08-ca78-40fc-ac5f-59ca91d07412?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true

linkIdentifyLatent=http://172.16.0.185:5601/app/lens#/edit/e3f84cc5-68dd-4c76-a84e-d209da2e777a?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-7d/d,to:now))&hide-filter-bar=true&show-time-filter=true&embed=true
```

Salve e feche o arquivo.

Após a conclusão de todas as etapas do procedimento de instalação do Elastic Stack, volte para o [manual de Configuração do SmartSense Server](/componentes-web/smartsenseconfig) para concluir a configuração.


# GBDS 5


# Version

## getVersion

> This method return the GBDS version.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/version":{"get":{"description":"This method return the GBDS version.","tags":["version"],"operationId":"getVersion","summary":"getVersion","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVersion"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"GetVersion":{"type":"object","properties":{"data":{"type":"object","properties":{"api":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"}}},"searchEngine":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"}}}}}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Exceptions

## getException

> This method returns an exception for a given person/transaction.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/{tguid}/{pguid}":{"get":{"description":"This method returns an exception for a given person/transaction.","tags":["exceptions"],"operationId":"getException","summary":"getException","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}},{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetExceptionsResponse"}}}},"404":{"description":"Enrollment transaction does not exist, the exception does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GetExceptionsResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Exception"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## listExceptions

> This method returns a list of exceptions that match the given search criteria.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions":{"get":{"description":"This method returns a list of exceptions that match the given search criteria.","tags":["exceptions"],"operationId":"listExceptions","summary":"listExceptions","parameters":[{"name":"status","description":"Status of the request.","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]}}},{"name":"startDate","description":"Minimum timestamp, in milliseconds.","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"endDate","description":"Maximum timestamp, in milliseconds.","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"user","description":"ID of the user.","in":"query","required":false,"schema":{"type":"string"}},{"name":"keys","description":"Array of keys that uniquely identify the person. This field can be an expression.\n\nThe following structure can be used for both `keys` and `biographics`:\n\n| Format         | Description                                                                                       |\n|----------------|---------------------------------------------------------------------------------------------------|\n| `<id>:<value>` | Searches for exceptions with incoming or reference keys/biographics with the passed id and value. |\n| `<id>:`        | Searches for exceptions with incoming or reference keys/biographics with the id and any value.    |\n| `:<value>`     | Searches for exceptions with incoming or reference keys/biographics with the value and any id.    |\n\nFrom the second keys/biographics item onwards, before each id or value, you can include an operator:\n- `[and]`: performs an AND operation with the previous item.\n- `[or]`: performs an OR operation with the previous item.\n\nThese operators may be applied to both keys and biographics.\n\nOn every operation on an id or value, the default behavior will be to test for exact matches.\nTo change this behavior, you can include a modifier at the end of the id or value:\n- `[exact]`: tests for exact matches. This is the default behavior, the same as not including any modifier.\n- `[atstart]`: searches for content that starts with the passed id/value.\n- `[atend]`: searches for content that ends with the passed id/value.\n- `[anywhere]`: searches for content that contains the passed id/value.\n\n**IMPORTANT**: Be careful when using modifiers other than `[exact]`. They can slow down the search.\n\nExamples:\n- `keys=cpf:001&biographics=name`\n- `keys=cpf:001&keys=[or]cpf:002`\n- `keys=cpf:00[atstart]`\n","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"biographics","description":"Biographic data of the person. This field can be an expression.\n\nFor expressions, use the same structure described in the `keys` parameter.\n","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"labels","description":"A list of labels of the person.","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"exceptionFields","description":"List containing the names of the fields of the Exception entity to be included in the response.\n\nThe following fields are available:\n- **NO_FIELDS**: No fields are returned.\n- **BASIC_FIELDS**: Returns only the enroll `TGUID`, `PGUID`, `timestamp`, and `type`.\n- **ANALYSIS_FIELDS**: Returns only the data->`qualityAnalysis` object with the properties `status`, `user`, `comments`, and `timestamp` (if applicable).\n- **MATCH_FIELDS**: Returns only the match `TGUID`, and `PGUID`.\n- **BIOMETRIC_MATCH_FIELDS**: Returns only the indexes, score, and match pairs for each match.\n- **ALL_FIELDS**: All fields are returned.\n","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["NO_FIELDS","BASIC_FIELDS","ANALYSIS_FIELDS","MATCH_FIELDS","BIOMETRIC_MATCH_FIELDS","ALL_FIELDS"]}}},{"name":"pageIndex","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"statuses","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]}}},{"name":"locekdUser","in":"query","required":false,"schema":{"type":"string"}},{"name":"priority","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"target","in":"query","required":false,"schema":{"type":"string","enum":["BIOGRAPHIC","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExceptionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListExceptionsResponse":{"type":"object","properties":{"data":{"description":"List of exceptions that matched the search criteria.","type":"array","items":{"allOf":[{"type":"object","properties":{"match":{"$ref":"#/components/schemas/MatchBob"}}},{"$ref":"#/components/schemas/Exception"}]}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## unassignException

> This method removes the assignment of a user to an exception.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/{tguid}/{pguid}/users":{"delete":{"description":"This method removes the assignment of a user to an exception.","tags":["exceptions"],"operationId":"unassignException","summary":"unassignException","parameters":[{"name":"tguid","required":true,"description":"Global unique ID of the transaction.","in":"path","schema":{"type":"string"}},{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Exception does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## listByTransaction

> This method returns the exception list from a given exception.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/{tguid}":{"get":{"description":"This method returns the exception list from a given exception.","tags":["exceptions"],"operationId":"listByTransaction","summary":"listByTransaction","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExceptionsResponse"}}}},"404":{"description":"Enrollment transaction does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListExceptionsResponse":{"type":"object","properties":{"data":{"description":"List of exceptions that matched the search criteria.","type":"array","items":{"allOf":[{"type":"object","properties":{"match":{"$ref":"#/components/schemas/MatchBob"}}},{"$ref":"#/components/schemas/Exception"}]}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## assignException

> This method assigns an exception to a given user.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/{tguid}/{pguid}/users/{user}":{"put":{"description":"This method assigns an exception to a given user.","tags":["exceptions"],"operationId":"assignException","summary":"assignException","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}},{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"user","description":"ID of the user.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Exception does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## getTreatResult

> This method returns the status of the treatment given to a specific transaction.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/treatment/{tguid}":{"get":{"description":"This method returns the status of the treatment given to a specific transaction.","tags":["exceptions"],"operationId":"getTreatResult","summary":"getTreatResult","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ok, enqueued, Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Exception treatment transaction does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## treatException

> This method provides the treatment for a given exception.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/treatment":{"post":{"description":"This method provides the treatment for a given exception.","tags":["exceptions"],"operationId":"treatException","summary":"treatException","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsRequest"}}}},"responses":{"201":{"description":"Enqueued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}},"202":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"403":{"description":"User not authorized to treat exception.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"404":{"description":"Exception treatment transaction does not exist, exception does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"TreatExceptionsRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ExceptionTreatment"},"meta":{"$ref":"#/components/schemas/Meta"}}},"ExceptionTreatment":{"type":"object","properties":{"enrollTguid":{"description":"TGUID of transaction that created the exception.","type":"string"},"exceptionPguid":{"description":"PGUID of the person that was matched to create the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"referenceIndexes":{"description":"List of biometric indexes. Specifies which biometric from the Update transaction should be used to update the Person.","type":"array","items":{"type":"integer","format":"int32"}}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Meta":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"discardReference":{"type":"boolean"}}},"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## GET /exceptions/byEntrant/{pguid}

> getExceptionByEntrantPguid

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/byEntrant/{pguid}":{"get":{"tags":["exceptions"],"operationId":"getExceptionByEntrantPguid","summary":"getExceptionByEntrantPguid","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExceptionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListExceptionsResponse":{"type":"object","properties":{"data":{"description":"List of exceptions that matched the search criteria.","type":"array","items":{"allOf":[{"type":"object","properties":{"match":{"$ref":"#/components/schemas/MatchBob"}}},{"$ref":"#/components/schemas/Exception"}]}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## GET /exceptions/byReference/{pguid}

> getExceptionByReferencePguid

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/byReference/{pguid}":{"get":{"tags":["exceptions"],"operationId":"getExceptionByReferencePguid","summary":"getExceptionByReferencePguid","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExceptionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListExceptionsResponse":{"type":"object","properties":{"data":{"description":"List of exceptions that matched the search criteria.","type":"array","items":{"allOf":[{"type":"object","properties":{"match":{"$ref":"#/components/schemas/MatchBob"}}},{"$ref":"#/components/schemas/Exception"}]}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## Set exception priority

> Sets or clears the priority flag for a specific exception identified by\
> transaction GUID (\`tguid\`) and person GUID (\`pguid\`). When the\
> \`priority\` path parameter is \`true\`, the exception—and its group—is\
> prioritized; when \`false\`, the priority is removed. Returns\
> \*\*202 Accepted\*\*.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/{tguid}/{pguid}/priority/{priority}":{"put":{"tags":["exceptions"],"operationId":"priorityException","parameters":[{"name":"tguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"pguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"priority","in":"path","required":true,"schema":{"type":"boolean"}}],"responses":{"202":{"description":"ACCEPTED","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Sets or clears the priority flag for a specific exception identified by\ntransaction GUID (`tguid`) and person GUID (`pguid`). When the\n`priority` path parameter is `true`, the exception—and its group—is\nprioritized; when `false`, the priority is removed. Returns\n**202 Accepted**.","summary":"Set exception priority"}}}}
```

## Unlock biometric

> Unlocks a previously locked biometric candidate for a given transaction\
> GUID (\`tguid\`), person GUID (\`pguid\`) and biometric index. When API\
> security is enabled, the user is derived from the token; otherwise\
> the user must be provided. Returns \*\*204 No Content\*\*.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/{tguid}/{pguid}/biometric/{index}/user":{"delete":{"tags":["exceptions"],"operationId":"unlockBiometric","parameters":[{"name":"tguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"pguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"index","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"NO CONTENT","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Unlocks a previously locked biometric candidate for a given transaction\nGUID (`tguid`), person GUID (`pguid`) and biometric index. When API\nsecurity is enabled, the user is derived from the token; otherwise\nthe user must be provided. Returns **204 No Content**.","summary":"Unlock biometric"}}}}
```

## Unlock biometric for user

> Unlocks a previously locked biometric candidate for a given transaction\
> GUID (\`tguid\`), person GUID (\`pguid\`) and biometric index, specifying\
> the user that holds the lock. Returns \*\*204 No Content\*\*.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/{tguid}/{pguid}/biometric/{index}/user/{user}":{"delete":{"tags":["exceptions"],"operationId":"unlockBiometric_1","parameters":[{"name":"tguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"pguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"index","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"user","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"NO CONTENT","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Unlocks a previously locked biometric candidate for a given transaction\nGUID (`tguid`), person GUID (`pguid`) and biometric index, specifying\nthe user that holds the lock. Returns **204 No Content**.","summary":"Unlock biometric for user"}}}}
```

## Treat exception group

> Applies a decision to all exceptions within a group. The request body must\
> provide the group GUID (\`gguid\`), user (overwritten by the security\
> token when API security is enabled), a list of permissions, comments,\
> timeout, a \`decision\` (KEEP or REJECT) and decision parameters: \`keys\`\
> (list of \`{id, value}\` pairs), \`biographics\` (list of \`{id, value}\` pairs),\
> \`labels\`, \`keepTransactions\` and \`removeTransactions\`. Responds with\
> \*\*202 Accepted\*\* and \`data\` containing a \`status\` of \`PENDING\` or \`OK\`.\
> \`PENDING\` indicates the treatment requires a follow‑up decision, while\
> \`OK\` indicates the group was treated successfully. When \`status\` is \`OK\`\
> and the decision is \`KEEP\`, the response may include \`newTguid\`,\
> \`newPguid\` and a list of \`keptTguids\`.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/treatment/group":{"post":{"tags":["exceptions"],"operationId":"treatGroup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionGroupRequest"}}},"required":true},"responses":{"202":{"description":"ACCEPTED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}}},"description":"Applies a decision to all exceptions within a group. The request body must\nprovide the group GUID (`gguid`), user (overwritten by the security\ntoken when API security is enabled), a list of permissions, comments,\ntimeout, a `decision` (KEEP or REJECT) and decision parameters: `keys`\n(list of `{id, value}` pairs), `biographics` (list of `{id, value}` pairs),\n`labels`, `keepTransactions` and `removeTransactions`. Responds with\n**202 Accepted** and `data` containing a `status` of `PENDING` or `OK`.\n`PENDING` indicates the treatment requires a follow‑up decision, while\n`OK` indicates the group was treated successfully. When `status` is `OK`\nand the decision is `KEEP`, the response may include `newTguid`,\n`newPguid` and a list of `keptTguids`.","parameters":[],"summary":"Treat exception group"}}},"components":{"schemas":{"TreatExceptionGroupRequest":{"type":"object","properties":{"gguid":{"type":"string"},"user":{"type":"string"},"comments":{"type":"string"},"timeout":{"type":"integer","format":"int32"},"decision":{"type":"string","enum":["APPROVE","REJECT","KEEP"]},"parameters":{"$ref":"#/components/schemas/GroupDecisionParameters"},"permissions":{"type":"array","items":{"type":"string"}}}},"GroupDecisionParameters":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"labels":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"keepTransactions":{"type":"array","items":{"type":"string"}},"removeTransactions":{"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}}}}}
```

## Get group treatment result

> Retrieves the treatment result for an exception group identified by its\
> \`gguid\`. Returns \*\*202 Accepted\*\* with the same \`data\` structure as the\
> group treatment response, enabling clients to poll for the final status.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/treatment/group/{gguid}":{"get":{"tags":["exceptions"],"operationId":"getTreatGroupResult","parameters":[{"name":"gguid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"ACCEPTED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}}},"description":"Retrieves the treatment result for an exception group identified by its\n`gguid`. Returns **202 Accepted** with the same `data` structure as the\ngroup treatment response, enabling clients to poll for the final status.","summary":"Get group treatment result"}}},"components":{"schemas":{"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}}}}}
```

## Resolve pending group

> Completes the treatment of a group left in \`PENDING\` status. The request\
> must include the group GUID (\`gguid\`), user (overwritten by the security\
> token when API security is enabled), permissions, a \`pendingTreatment\`\
> flag (\`ACCEPT\` or \`REJECT\`), comments and an optional timeout. Responds\
> with \*\*202 Accepted\*\* and a \`data\` object containing \`status\`. A status\
> of \`OK\` means the pending treatment was accepted and processed; a\
> status of \`BIOGRAPHIC\` or \`BIOMETRIC\_INCONCLUSIVE\` means the group\
> returns to analysis. When treatment is accepted, \`newTguid\`, \`newPguid\`\
> and \`keptTguids\` may be included.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/treatment/group/pending":{"post":{"tags":["exceptions"],"operationId":"treatPendingGroup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionPendingGroupRequest"}}},"required":true},"responses":{"202":{"description":"ACCEPTED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}}},"description":"Completes the treatment of a group left in `PENDING` status. The request\nmust include the group GUID (`gguid`), user (overwritten by the security\ntoken when API security is enabled), permissions, a `pendingTreatment`\nflag (`ACCEPT` or `REJECT`), comments and an optional timeout. Responds\nwith **202 Accepted** and a `data` object containing `status`. A status\nof `OK` means the pending treatment was accepted and processed; a\nstatus of `BIOGRAPHIC` or `BIOMETRIC_INCONCLUSIVE` means the group\nreturns to analysis. When treatment is accepted, `newTguid`, `newPguid`\nand `keptTguids` may be included.","parameters":[],"summary":"Resolve pending group"}}},"components":{"schemas":{"TreatExceptionPendingGroupRequest":{"type":"object","properties":{"gguid":{"type":"string"},"pendingTreatment":{"type":"string","enum":["ACCEPT","REJECT"]},"user":{"type":"string"},"comments":{"type":"string"},"timeout":{"type":"integer","format":"int32"},"permissions":{"type":"array","items":{"type":"string"}}}},"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}}}}}
```

## Treat biometric

> Treats an uncertain biometric candidate that has been locked by the user.\
> The request must include user (overwritten by the security token when API\
> security is enabled), permissions, \`enrollTguid\`, \`exceptionPguid\` (the\
> matched person), a \`decision\` (\`HIT\`, \`NO\_HIT\` or \`UNCERTAIN\_EXPERT\`),\
> \`index\` and a \`timeout\`. Returns \*\*202 Accepted\*\* with a \`data.status\`\
> reflecting the outcome: \`ON\`, \`ENQUEUED\` or \`ERROR\` when all biometric\
> treatments have been processed and the exception is treated as\
> APPROVED; \`NOT\_FINAL\` when further biometrics remain; \`BIOGRAPHIC\`,\
> \`BIOMETRIC\_MISMATCH\` or \`BIOMETRIC\_INCONCLUSIVE\` when the treatments\
> result in a biographic, mismatch or inconclusive target.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/treatment/biometric":{"post":{"tags":["exceptions"],"operationId":"treatBiometric","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionBiometricRequest"}}},"required":true},"responses":{"202":{"description":"ACCEPTED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}}},"description":"Treats an uncertain biometric candidate that has been locked by the user.\nThe request must include user (overwritten by the security token when API\nsecurity is enabled), permissions, `enrollTguid`, `exceptionPguid` (the\nmatched person), a `decision` (`HIT`, `NO_HIT` or `UNCERTAIN_EXPERT`),\n`index` and a `timeout`. Returns **202 Accepted** with a `data.status`\nreflecting the outcome: `ON`, `ENQUEUED` or `ERROR` when all biometric\ntreatments have been processed and the exception is treated as\nAPPROVED; `NOT_FINAL` when further biometrics remain; `BIOGRAPHIC`,\n`BIOMETRIC_MISMATCH` or `BIOMETRIC_INCONCLUSIVE` when the treatments\nresult in a biographic, mismatch or inconclusive target.","parameters":[],"summary":"Treat biometric"}}},"components":{"schemas":{"TreatExceptionBiometricRequest":{"type":"object","properties":{"enrollTguid":{"type":"string"},"exceptionPguid":{"type":"string"},"index":{"type":"integer","format":"int32"},"decision":{"type":"string","enum":["HIT","NO_HIT","UNCERTAIN","UNCERTAIN_EXPERT","MISMATCH","ERROR"]},"user":{"type":"string"},"timeout":{"type":"integer","format":"int32"},"permissions":{"type":"array","items":{"type":"string"}}}},"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}}}}}
```

## Get biometric treatment result

> Retrieves the treatment result for a biometric candidate identified by\
> transaction GUID (\`tguid\`), person GUID (\`pguid\`) and biometric index.\
> Returns \*\*202 Accepted\*\* with the same \`data\` structure as the\
> biometric treatment response, enabling clients to poll for the final\
> status.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/treatment/biometric/{tguid}/{pguid}/biometric/{index}":{"get":{"tags":["exceptions"],"operationId":"getTreatBiometricResult","parameters":[{"name":"tguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"pguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"index","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"202":{"description":"ACCEPTED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}}},"description":"Retrieves the treatment result for a biometric candidate identified by\ntransaction GUID (`tguid`), person GUID (`pguid`) and biometric index.\nReturns **202 Accepted** with the same `data` structure as the\nbiometric treatment response, enabling clients to poll for the final\nstatus.","summary":"Get biometric treatment result"}}},"components":{"schemas":{"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}}}}}
```

## Get aggregated biometric treatment result

> Retrieves the treatment result for a biometric candidate identified by\
> aggregated GUID (\`aguid\`) and biometric index. This endpoint is used\
> when dealing with aggregated transaction identifiers. Returns\
> \*\*202 Accepted\*\* with the same \`data\` structure as the biometric\
> treatment response.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/treatment/biometric/{aguid}/biometric/{index}":{"get":{"tags":["exceptions"],"operationId":"getTreatBiometricResult_1","parameters":[{"name":"aguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"index","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"202":{"description":"ACCEPTED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}}},"description":"Retrieves the treatment result for a biometric candidate identified by\naggregated GUID (`aguid`) and biometric index. This endpoint is used\nwhen dealing with aggregated transaction identifiers. Returns\n**202 Accepted** with the same `data` structure as the biometric\ntreatment response.","summary":"Get aggregated biometric treatment result"}}},"components":{"schemas":{"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}}}}}
```

## Reprocess a list of transaction exceptions

> Re-executes the processing of transaction exceptions listed in the request, re-applying extraction/identification steps to correct failures.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/reprocess":{"put":{"tags":["exceptions"],"operationId":"reprocess","summary":"Reprocess a list of transaction exceptions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReprocessListRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}}},"description":"Re-executes the processing of transaction exceptions listed in the request, re-applying extraction/identification steps to correct failures.","parameters":[]}}},"components":{"schemas":{"ReprocessListRequest":{"type":"object","properties":{"tguids":{"type":"array","items":{"type":"string"}},"pageSize":{"type":"integer","format":"int32"},"user":{"type":"string"},"comments":{"type":"string"},"justAnalyse":{"type":"boolean"}}},"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}}}}}
```

## Get exception reprocessing

> Provides the progress and result of reprocessing a specific exception identified by the GUID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/reprocess/{guid}":{"get":{"tags":["exceptions"],"operationId":"getReprocess","parameters":[{"name":"guid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReprocessExceptions"}}}}},"description":"Provides the progress and result of reprocessing a specific exception identified by the GUID.","summary":"Get exception reprocessing"}}},"components":{"schemas":{"ReprocessExceptions":{"type":"object","properties":{"guid":{"type":"string"},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/ReprocessException"}},"status":{"type":"string","enum":["ENQUEUED","COUNTING","LISTING","PROCESSING","PROCESSED"]},"index":{"type":"integer","format":"int32"},"processed":{"type":"integer","format":"int64"},"total":{"type":"integer","format":"int64"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"ReprocessException":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"aguid":{"type":"string"},"entrantTguid":{"type":"string"},"entrantPguid":{"type":"string"},"entrantReextracted":{"type":"boolean"},"referenceTguid":{"type":"string"},"referencePguid":{"type":"string"},"referenceReextracted":{"type":"boolean"},"type":{"type":"string","enum":["ENROLL","UPDATE","VERIFY","IDENTIFY"]},"oldStatus":{"type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"newStatus":{"type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"message":{"type":"string"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## Reprocess transaction in exception

> Manually reprocesses a transaction in exception, provided in the body, returning the result of this re-execution.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/reprocess/one":{"put":{"tags":["exceptions"],"operationId":"reprocess_1","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReprocessRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReprocessExceptions"}}}}},"description":"Manually reprocesses a transaction in exception, provided in the body, returning the result of this re-execution.","summary":"Reprocess transaction in exception","parameters":[]}}},"components":{"schemas":{"ReprocessRequest":{"type":"object","properties":{"tguid":{"type":"string"},"user":{"type":"string"},"comments":{"type":"string"},"justAnalyse":{"type":"boolean"}}},"ReprocessExceptions":{"type":"object","properties":{"guid":{"type":"string"},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/ReprocessException"}},"status":{"type":"string","enum":["ENQUEUED","COUNTING","LISTING","PROCESSING","PROCESSED"]},"index":{"type":"integer","format":"int32"},"processed":{"type":"integer","format":"int64"},"total":{"type":"integer","format":"int64"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"ReprocessException":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"aguid":{"type":"string"},"entrantTguid":{"type":"string"},"entrantPguid":{"type":"string"},"entrantReextracted":{"type":"boolean"},"referenceTguid":{"type":"string"},"referencePguid":{"type":"string"},"referenceReextracted":{"type":"boolean"},"type":{"type":"string","enum":["ENROLL","UPDATE","VERIFY","IDENTIFY"]},"oldStatus":{"type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"newStatus":{"type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"message":{"type":"string"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## Get next exception group

> Selects and locks the next available exception group for analysis and\
> treatment. The request includes a user (overwritten by the security token\
> when API security is on), a list of organization permissions, an optional\
> \`order\` (ASC or DESC) controlling the sort by priority, pending status and\
> timestamp, and an \`origin\` (ENTRANT or BOTH) to filter by organization\
> origin. Responds with \*\*200 OK\*\* when a group is found, returning \`data\`\
> with group details and \`remaining\` for the count of groups pending\
> analysis or pending treatment. Returns \*\*204 No Content\*\* when no group is\
> available.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/nextGroup":{"post":{"tags":["exceptions"],"operationId":"getNextExceptionGroup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetNextGroupRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetExceptionGroupResponse"}}}}},"description":"Selects and locks the next available exception group for analysis and\ntreatment. The request includes a user (overwritten by the security token\nwhen API security is on), a list of organization permissions, an optional\n`order` (ASC or DESC) controlling the sort by priority, pending status and\ntimestamp, and an `origin` (ENTRANT or BOTH) to filter by organization\norigin. Responds with **200 OK** when a group is found, returning `data`\nwith group details and `remaining` for the count of groups pending\nanalysis or pending treatment. Returns **204 No Content** when no group is\navailable.","parameters":[],"summary":"Get next exception group"}}},"components":{"schemas":{"GetNextGroupRequest":{"type":"object","properties":{"user":{"type":"string"},"order":{"type":"string","enum":["ASC","DESC"]},"permissions":{"type":"array","items":{"type":"string"}},"origin":{"type":"string","enum":["ENTRANT","BOTH"]},"pending":{"type":"boolean"}}},"GetExceptionGroupResponse":{"type":"object","properties":{"remaining":{"type":"integer","format":"int64"},"treatable":{"type":"boolean"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"$ref":"#/components/schemas/ExceptionGroup"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"ExceptionGroup":{"type":"object","properties":{"gguid":{"type":"string"},"tguid":{"type":"string"},"target":{"type":"string","enum":["BIOGRAPHIC","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH"]},"decision":{"type":"string","enum":["APPROVE","REJECT","KEEP"]},"status":{"type":"string","enum":["ANALYSIS","PENDING","READY","PROCESSING","DONE","REFUSED","ERROR"]},"priority":{"type":"boolean"},"organizations":{"type":"array","items":{"$ref":"#/components/schemas/Organization"}},"created":{"type":"string","format":"date-time"},"updated":{"type":"string","format":"date-time"},"user":{"type":"string"},"comments":{"type":"string"},"message":{"type":"string"},"parameters":{"$ref":"#/components/schemas/GroupDecisionParameters"},"lightsOutCriteria":{"$ref":"#/components/schemas/LightsOutCriteria"},"lockedUser":{"type":"string"},"lockedTimestamp":{"type":"string","format":"date-time"},"lockedTimeout":{"type":"string","format":"date-time"},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/Exception"}},"newTguid":{"type":"string"},"refusedStatus":{"type":"string","enum":["CREATED","REMOVED","READY_TO_RESEND","SENDING","SENT","ERROR"]},"refusedNewTguid":{"type":"string"},"refusedGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}},"holdingGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}}}},"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}},"GroupDecisionParameters":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"labels":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"keepTransactions":{"type":"array","items":{"type":"string"}},"removeTransactions":{"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"LightsOutCriteria":{"type":"object","properties":{"nonConflitantKeys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"weakKeys":{"type":"array","items":{"type":"string"}},"matchedBiographics":{"type":"array","items":{"type":"string"}}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}}}}}
```

## Get next biometric

> Selects and locks the next uncertain biometric candidate requiring a\
> manual decision. The request includes a user (overwritten by the\
> security token when API security is enabled), a list of permissions,\
> an \`order\` (ASC or DESC), an optional \`modality\` (FINGERPRINT or\
> FACE) and an \`origin\` (ENTRANT or BOTH). If no biometric is available,\
> responds with \*\*204 No Content\*\*. Otherwise returns \*\*200 OK\*\* with\
> \`remaining\` for the number of remaining biometrics and \`data\` containing\
> the selected biometric candidate: \`enrollPguid\`, \`enrollTguid\`,\
> \`transactionTimestamp\`, match details (\`matchedPersonPguid\`,\
> \`matchedPersonTguid\`, \`biometricMatches\` with \`score\`, \`queryIndex\`,\
> \`referenceIndex\`, \`minutia\` and \`decision\`), \`exceptionAnalysis\`\
> status (\`ANALYSIS\`), \`transactionType\`, \`priority\` and \`target\`.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/nextBiometric":{"post":{"tags":["exceptions"],"operationId":"getNextExceptionBiometric","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetNextBiometricRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetExceptionsResponse"}}}},"204":{"description":"NO CONTENT","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Selects and locks the next uncertain biometric candidate requiring a\nmanual decision. The request includes a user (overwritten by the\nsecurity token when API security is enabled), a list of permissions,\nan `order` (ASC or DESC), an optional `modality` (FINGERPRINT or\nFACE) and an `origin` (ENTRANT or BOTH). If no biometric is available,\nresponds with **204 No Content**. Otherwise returns **200 OK** with\n`remaining` for the number of remaining biometrics and `data` containing\nthe selected biometric candidate: `enrollPguid`, `enrollTguid`,\n`transactionTimestamp`, match details (`matchedPersonPguid`,\n`matchedPersonTguid`, `biometricMatches` with `score`, `queryIndex`,\n`referenceIndex`, `minutia` and `decision`), `exceptionAnalysis`\nstatus (`ANALYSIS`), `transactionType`, `priority` and `target`.","parameters":[],"summary":"Get next biometric"}}},"components":{"schemas":{"GetNextBiometricRequest":{"type":"object","properties":{"user":{"type":"string"},"order":{"type":"string","enum":["ASC","DESC"]},"permissions":{"type":"array","items":{"type":"string"}},"modality":{"type":"string","enum":["FINGERPRINT","FACE"]},"origin":{"type":"string","enum":["ENTRANT","BOTH"]}}},"GetExceptionsResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Exception"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}}}}}
```

## Get exception log

> Retrieves detailed logs of transaction exception handling, allowing auditing by period, pguid, tguid and other parameters.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/log":{"get":{"tags":["exceptions"],"operationId":"listOperationLog","parameters":[{"name":"startDate","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"endDate","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"user","in":"query","required":false,"schema":{"type":"string"}},{"name":"operation","in":"query","required":false,"schema":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY","CREATE_EXCEPTION","CREATE_EXCEPTION_GROUP","PRIORITY_EXCEPTION","PRIORITY_EXCEPTION_GROUP","TREAT_EXCEPTION_BIOMETRIC","TREAT_EXCEPTION_GROUP","CHANGE_REFUSED_STATUS","RESEND_REFUSED","LIGHTS_OUT"]}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["EXCEPTION","EXCEPTION_BIOMETRIC","EXCEPTION_GROUP","TRANSACTION"]}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["ANALYSIS","READY","PROCESSING","REFUSED","DONE","PENDING","ERROR","ENQUEUED","OK","NOT_FINAL","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH","BIOGRAPHIC","APPROVE","REJECT","LIGHTS_OUT"]}},{"name":"decision","in":"query","required":false,"schema":{"type":"string","enum":["UNCERTAIN","UNCERTAIN_EXPERT","MISMATCH","NO_HIT","HIT","ERROR","APPROVE","REJECT","KEEP","CREATED","REMOVED","READY_TO_RESEND"]}},{"name":"index","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageIndex","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListOperationLogResponse"}}}}},"description":"Retrieves detailed logs of transaction exception handling, allowing auditing by period, pguid, tguid and other parameters.","summary":"Get exception log"}}},"components":{"schemas":{"ListOperationLogResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"type":"array","items":{"$ref":"#/components/schemas/OperationLog"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"OperationLog":{"type":"object","properties":{"guid":{"type":"string"},"logType":{"type":"string","enum":["EXCEPTION","EXCEPTION_BIOMETRIC","EXCEPTION_GROUP","TRANSACTION"]},"operation":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY","CREATE_EXCEPTION","CREATE_EXCEPTION_GROUP","PRIORITY_EXCEPTION","PRIORITY_EXCEPTION_GROUP","TREAT_EXCEPTION_BIOMETRIC","TREAT_EXCEPTION_GROUP","CHANGE_REFUSED_STATUS","RESEND_REFUSED","LIGHTS_OUT"]},"index":{"type":"integer","format":"int32"},"status":{"type":"string","enum":["ANALYSIS","READY","PROCESSING","REFUSED","DONE","PENDING","ERROR","ENQUEUED","OK","NOT_FINAL","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH","BIOGRAPHIC","APPROVE","REJECT","LIGHTS_OUT"]},"decision":{"type":"string","enum":["UNCERTAIN","UNCERTAIN_EXPERT","MISMATCH","NO_HIT","HIT","ERROR","APPROVE","REJECT","KEEP","CREATED","REMOVED","READY_TO_RESEND"]},"user":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"tguid":{"type":"string"},"pguid":{"type":"string"},"keptTguids":{"type":"array","items":{"type":"string"}},"message":{"type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}}}}}
```

## List exception groups

> Returns a paginated list of exception groups pending analysis or treatment. Use\
> query parameters to filter by status, decision, date range, user, lockedUser,\
> priority flag, target, organization, origin (ENTRANT, REFERENCE, BOTH), and\
> pagination (pageIndex, pageSize). Groups are ordered by priority, pending\
> status, target and creation time. Each group entry includes group identifiers\
> (gguid, tguid), target, status, decision, priority flag, organizations with\
> origin, timestamps, user, comments, and decision parameters such as keys,\
> biographics, labels, kept and removed transactions.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/group":{"get":{"tags":["exceptions"],"operationId":"listGroups","parameters":[{"name":"statuses","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["ANALYSIS","PENDING","READY","PROCESSING","DONE","REFUSED","ERROR"]}}},{"name":"status","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["ANALYSIS","PENDING","READY","PROCESSING","DONE","REFUSED","ERROR"]}}},{"name":"decisions","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["APPROVE","REJECT","KEEP"]}}},{"name":"decision","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["APPROVE","REJECT","KEEP"]}}},{"name":"startDate","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"endDate","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"user","in":"query","required":false,"schema":{"type":"string"}},{"name":"lockedUser","in":"query","required":false,"schema":{"type":"string"}},{"name":"priority","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"target","in":"query","required":false,"schema":{"type":"string","enum":["BIOGRAPHIC","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH"]}},{"name":"organization","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string"}}},{"name":"permission","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"userOrganizations","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"gguid","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"key","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string"}}},{"name":"pageIndex","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExceptionGroupResponse"}}}}},"description":"Returns a paginated list of exception groups pending analysis or treatment. Use\nquery parameters to filter by status, decision, date range, user, lockedUser,\npriority flag, target, organization, origin (ENTRANT, REFERENCE, BOTH), and\npagination (pageIndex, pageSize). Groups are ordered by priority, pending\nstatus, target and creation time. Each group entry includes group identifiers\n(gguid, tguid), target, status, decision, priority flag, organizations with\norigin, timestamps, user, comments, and decision parameters such as keys,\nbiographics, labels, kept and removed transactions.","summary":"List exception groups"}}},"components":{"schemas":{"ListExceptionGroupResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"ExceptionGroup":{"type":"object","properties":{"gguid":{"type":"string"},"tguid":{"type":"string"},"target":{"type":"string","enum":["BIOGRAPHIC","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH"]},"decision":{"type":"string","enum":["APPROVE","REJECT","KEEP"]},"status":{"type":"string","enum":["ANALYSIS","PENDING","READY","PROCESSING","DONE","REFUSED","ERROR"]},"priority":{"type":"boolean"},"organizations":{"type":"array","items":{"$ref":"#/components/schemas/Organization"}},"created":{"type":"string","format":"date-time"},"updated":{"type":"string","format":"date-time"},"user":{"type":"string"},"comments":{"type":"string"},"message":{"type":"string"},"parameters":{"$ref":"#/components/schemas/GroupDecisionParameters"},"lightsOutCriteria":{"$ref":"#/components/schemas/LightsOutCriteria"},"lockedUser":{"type":"string"},"lockedTimestamp":{"type":"string","format":"date-time"},"lockedTimeout":{"type":"string","format":"date-time"},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/Exception"}},"newTguid":{"type":"string"},"refusedStatus":{"type":"string","enum":["CREATED","REMOVED","READY_TO_RESEND","SENDING","SENT","ERROR"]},"refusedNewTguid":{"type":"string"},"refusedGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}},"holdingGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}}}},"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}},"GroupDecisionParameters":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"labels":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"keepTransactions":{"type":"array","items":{"type":"string"}},"removeTransactions":{"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"LightsOutCriteria":{"type":"object","properties":{"nonConflitantKeys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"weakKeys":{"type":"array","items":{"type":"string"}},"matchedBiographics":{"type":"array","items":{"type":"string"}}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}}}}}
```

## Get exception group

> Retrieves details of an exception group by its GUID (gguid). The response\
> includes the group metadata—gguid, tguid, target, status, decision, priority\
> flag, organizations with origin, created and updated timestamps, user and\
> comments—and the associated exceptions within the group. Each exception entry\
> contains the enrollee identifiers, match details (score and index values),\
> analysis status, transaction type, priority and target.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/group/{gguid}":{"get":{"tags":["exceptions"],"operationId":"getGroup","parameters":[{"name":"gguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"permission","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetExceptionGroupResponse"}}}}},"description":"Retrieves details of an exception group by its GUID (gguid). The response\nincludes the group metadata—gguid, tguid, target, status, decision, priority\nflag, organizations with origin, created and updated timestamps, user and\ncomments—and the associated exceptions within the group. Each exception entry\ncontains the enrollee identifiers, match details (score and index values),\nanalysis status, transaction type, priority and target.","summary":"Get exception group"}}},"components":{"schemas":{"GetExceptionGroupResponse":{"type":"object","properties":{"remaining":{"type":"integer","format":"int64"},"treatable":{"type":"boolean"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"$ref":"#/components/schemas/ExceptionGroup"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"ExceptionGroup":{"type":"object","properties":{"gguid":{"type":"string"},"tguid":{"type":"string"},"target":{"type":"string","enum":["BIOGRAPHIC","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH"]},"decision":{"type":"string","enum":["APPROVE","REJECT","KEEP"]},"status":{"type":"string","enum":["ANALYSIS","PENDING","READY","PROCESSING","DONE","REFUSED","ERROR"]},"priority":{"type":"boolean"},"organizations":{"type":"array","items":{"$ref":"#/components/schemas/Organization"}},"created":{"type":"string","format":"date-time"},"updated":{"type":"string","format":"date-time"},"user":{"type":"string"},"comments":{"type":"string"},"message":{"type":"string"},"parameters":{"$ref":"#/components/schemas/GroupDecisionParameters"},"lightsOutCriteria":{"$ref":"#/components/schemas/LightsOutCriteria"},"lockedUser":{"type":"string"},"lockedTimestamp":{"type":"string","format":"date-time"},"lockedTimeout":{"type":"string","format":"date-time"},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/Exception"}},"newTguid":{"type":"string"},"refusedStatus":{"type":"string","enum":["CREATED","REMOVED","READY_TO_RESEND","SENDING","SENT","ERROR"]},"refusedNewTguid":{"type":"string"},"refusedGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}},"holdingGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}}}},"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}},"GroupDecisionParameters":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"labels":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"keepTransactions":{"type":"array","items":{"type":"string"}},"removeTransactions":{"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"LightsOutCriteria":{"type":"object","properties":{"nonConflitantKeys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"weakKeys":{"type":"array","items":{"type":"string"}},"matchedBiographics":{"type":"array","items":{"type":"string"}}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}}}}}
```

## Lock exception group

> Locks an unlocked exception group so that the current user can treat it.\
> When API security is enabled, the user is derived from the token; otherwise\
> a user must be provided. Returns \*\*204 No Content\*\* upon success.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/group/{gguid}/user":{"put":{"tags":["exceptions"],"operationId":"lockGroup","parameters":[{"name":"gguid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"NO CONTENT","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Locks an unlocked exception group so that the current user can treat it.\nWhen API security is enabled, the user is derived from the token; otherwise\na user must be provided. Returns **204 No Content** upon success.","summary":"Lock exception group"}}}}
```

## Unlock exception group

> Unlocks a locked exception group for the current user (derived from the\
> token) or for a provided user when API security is disabled. The group\
> must be locked by that user. Returns \*\*204 No Content\*\*.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/group/{gguid}/user":{"delete":{"tags":["exceptions"],"operationId":"unlockGroup","parameters":[{"name":"gguid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"NO CONTENT","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Unlocks a locked exception group for the current user (derived from the\ntoken) or for a provided user when API security is disabled. The group\nmust be locked by that user. Returns **204 No Content**.","summary":"Unlock exception group"}}}}
```

## Lock exception group for user

> Locks an unlocked exception group for the specified user. This operation is\
> used when API security is disabled and authentication through tokens is\
> unavailable. Returns \*\*204 No Content\*\*.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/group/{gguid}/user/{user}":{"put":{"tags":["exceptions"],"operationId":"lockGroup_1","parameters":[{"name":"gguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"user","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"NO CONTENT","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Locks an unlocked exception group for the specified user. This operation is\nused when API security is disabled and authentication through tokens is\nunavailable. Returns **204 No Content**.","summary":"Lock exception group for user"}}}}
```

## Unlock exception group for user

> Unlocks a previously locked exception group for a specified user. The group\
> must be locked by the same user. Returns \*\*204 No Content\*\*.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/group/{gguid}/user/{user}":{"delete":{"tags":["exceptions"],"operationId":"unlockGroup_1","parameters":[{"name":"gguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"user","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"NO CONTENT","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Unlocks a previously locked exception group for a specified user. The group\nmust be locked by the same user. Returns **204 No Content**.","summary":"Unlock exception group for user"}}}}
```

## Update refused status for group

> Updates the refused status of an exception group. The status may be one of\
> \`CREATED\`, \`REMOVED\`, \`READY\_TO\_RESEND\`, \`SENDING\`, \`SENT\` or \`ERROR\`.\
> This endpoint sets the \`refused\_status\` field for the group and returns\
> \*\*204 No Content\*\*.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/group/{gguid}/refused/{status}":{"put":{"tags":["exceptions"],"operationId":"changeGroupRefusedStatus","parameters":[{"name":"gguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"status","in":"path","required":true,"schema":{"type":"string","enum":["RESEND","REMOVE"]}},{"name":"permission","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"204":{"description":"NO CONTENT","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Updates the refused status of an exception group. The status may be one of\n`CREATED`, `REMOVED`, `READY_TO_RESEND`, `SENDING`, `SENT` or `ERROR`.\nThis endpoint sets the `refused_status` field for the group and returns\n**204 No Content**.","summary":"Update refused status for group"}}}}
```

## Set priority flag for group

> Sets or clears the priority flag on an exception group. When priority is\
> \`true\`, the group and its contained exceptions are prioritized; when\
> \`false\`, the priority is removed. Returns \*\*204 No Content\*\*.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/group/{gguid}/priority/{priority}":{"put":{"tags":["exceptions"],"operationId":"priorityExceptionGroup","parameters":[{"name":"gguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"priority","in":"path","required":true,"schema":{"type":"boolean"}}],"responses":{"204":{"description":"NO CONTENT","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Sets or clears the priority flag on an exception group. When priority is\n`true`, the group and its contained exceptions are prioritized; when\n`false`, the priority is removed. Returns **204 No Content**.","summary":"Set priority flag for group"}}}}
```

## Get exception group by transaction

> Retrieves the exception group associated with the specified transaction GUID\
> (tguid). The returned structure is the same as retrieving a group by gguid.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/group/tguid/{tguid}":{"get":{"tags":["exceptions"],"operationId":"getGroupByTguid","parameters":[{"name":"tguid","in":"path","required":true,"schema":{"type":"string"}},{"name":"permission","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetExceptionGroupResponse"}}}}},"description":"Retrieves the exception group associated with the specified transaction GUID\n(tguid). The returned structure is the same as retrieving a group by gguid.","summary":"Get exception group by transaction"}}},"components":{"schemas":{"GetExceptionGroupResponse":{"type":"object","properties":{"remaining":{"type":"integer","format":"int64"},"treatable":{"type":"boolean"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"$ref":"#/components/schemas/ExceptionGroup"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"ExceptionGroup":{"type":"object","properties":{"gguid":{"type":"string"},"tguid":{"type":"string"},"target":{"type":"string","enum":["BIOGRAPHIC","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH"]},"decision":{"type":"string","enum":["APPROVE","REJECT","KEEP"]},"status":{"type":"string","enum":["ANALYSIS","PENDING","READY","PROCESSING","DONE","REFUSED","ERROR"]},"priority":{"type":"boolean"},"organizations":{"type":"array","items":{"$ref":"#/components/schemas/Organization"}},"created":{"type":"string","format":"date-time"},"updated":{"type":"string","format":"date-time"},"user":{"type":"string"},"comments":{"type":"string"},"message":{"type":"string"},"parameters":{"$ref":"#/components/schemas/GroupDecisionParameters"},"lightsOutCriteria":{"$ref":"#/components/schemas/LightsOutCriteria"},"lockedUser":{"type":"string"},"lockedTimestamp":{"type":"string","format":"date-time"},"lockedTimeout":{"type":"string","format":"date-time"},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/Exception"}},"newTguid":{"type":"string"},"refusedStatus":{"type":"string","enum":["CREATED","REMOVED","READY_TO_RESEND","SENDING","SENT","ERROR"]},"refusedNewTguid":{"type":"string"},"refusedGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}},"holdingGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}}}},"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}},"GroupDecisionParameters":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"labels":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"keepTransactions":{"type":"array","items":{"type":"string"}},"removeTransactions":{"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"LightsOutCriteria":{"type":"object","properties":{"nonConflitantKeys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"weakKeys":{"type":"array","items":{"type":"string"}},"matchedBiographics":{"type":"array","items":{"type":"string"}}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}}}}}
```

## Count exception groups

> Counts the number of exception groups remaining for analysis or treatment\
> and the number of group treatments performed by the user on the current\
> day. The request body includes user (overwritten by the security token\
> when API security is enabled), a list of permissions and an optional\
> \`origin\` (ENTRANT or BOTH). The response returns \`remaining\` and\
> \`doneByTheDay\` maps keyed by status.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/countGroups":{"post":{"tags":["exceptions"],"operationId":"countExceptionGroup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountExceptionGroupRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountExceptionGroupResponse"}}}}},"description":"Counts the number of exception groups remaining for analysis or treatment\nand the number of group treatments performed by the user on the current\nday. The request body includes user (overwritten by the security token\nwhen API security is enabled), a list of permissions and an optional\n`origin` (ENTRANT or BOTH). The response returns `remaining` and\n`doneByTheDay` maps keyed by status.","parameters":[],"summary":"Count exception groups"}}},"components":{"schemas":{"CountExceptionGroupRequest":{"type":"object","properties":{"user":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"origin":{"type":"string","enum":["ENTRANT","BOTH"]}}},"CountExceptionGroupResponse":{"type":"object","properties":{"remaining":{"type":"object","additionalProperties":{"type":"integer","format":"int64"}},"doneByTheDay":{"type":"object","additionalProperties":{"type":"integer","format":"int64"}},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## Count biometrics and decisions

> Counts the number of remaining uncertain biometrics requiring treatment\
> and the number of decisions made by the user on the current day. The\
> request includes user (overwritten by the security token when API\
> security is enabled), a list of permissions and an optional \`origin\`\
> (ENTRANT or BOTH). The response returns \`remaining\` and \`doneByTheDay\`\
> maps keyed by modality (FINGERPRINT and FACE).

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/countBiometric":{"post":{"tags":["exceptions"],"operationId":"countExceptionBiometric","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountExceptionBiometricRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountExceptionBiometricResponse"}}}}},"description":"Counts the number of remaining uncertain biometrics requiring treatment\nand the number of decisions made by the user on the current day. The\nrequest includes user (overwritten by the security token when API\nsecurity is enabled), a list of permissions and an optional `origin`\n(ENTRANT or BOTH). The response returns `remaining` and `doneByTheDay`\nmaps keyed by modality (FINGERPRINT and FACE).","parameters":[],"summary":"Count biometrics and decisions"}}},"components":{"schemas":{"CountExceptionBiometricRequest":{"type":"object","properties":{"user":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}}}},"CountExceptionBiometricResponse":{"type":"object","properties":{"remaining":{"type":"object","additionalProperties":{"type":"integer","format":"int64"}},"doneByTheDay":{"type":"object","additionalProperties":{"type":"integer","format":"int64"}},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```


# External Keys

## getExternalID

> This method returns the data related to a given external ID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/externalID/{externalID}":{"get":{"description":"This method returns the data related to a given external ID.","tags":["external-keys"],"operationId":"getExternalID","summary":"getExternalID","parameters":[{"name":"externalID","description":"Any external key.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"tguid":{"type":"string"}}}}}}}}}}}
```


# Operations

## notify

> This method forces notification of a given transaction.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/operations/notify":{"post":{"description":"This method forces notification of a given transaction.","tags":["operations"],"operationId":"notify","summary":"notify","requestBody":{"content":{"application/json;charset=UTF-8":{"schema":{"$ref":"#/components/schemas/NotifyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"NotifyRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/JsonNotification"}}},"JsonNotification":{"type":"object","properties":{"operation":{"description":"Operation type of the transaction that notification is related to.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]},"tguid":{"description":"Transaction's global unique ID of the transaction that notification is related to.","type":"string"},"status":{"description":"Current status of the transaction that notification is related to.","type":"string"},"sender":{"description":"The notification sender.","type":"string"},"uguid":{"description":"Global unique ID of an unsolved latent. Only used when the notification is related to a transaction that treats an unsolved latent.","type":"string"},"additionalData":{"description":"Map used to add custom information inside the notification that will be delivered to notifier endpoint.","type":"object","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the main transaction that notification is related to.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}}}},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## ping

> This method is used to check the API availability.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/operations/ping":{"get":{"description":"This method is used to check the API availability.","tags":["operations"],"operationId":"ping","summary":"ping","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"body":{"type":"string","enum":["pong!"]}}}}}}},"parameters":[]}}}}
```

## getServices

> Returns the list of the system's internal services and their statuses (active, stopped, etc.) to enable operational monitoring.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/operations/services":{"get":{"tags":["operations"],"operationId":"servicesStatuses","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicesStatusResponse"}}}}},"description":"Returns the list of the system's internal services and their statuses (active, stopped, etc.) to enable operational monitoring.","summary":"getServices","parameters":[]}}},"components":{"schemas":{"ServicesStatusResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Data"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"Data":{"type":"object","properties":{"api":{"$ref":"#/components/schemas/VersionInfo"},"searchEngine":{"$ref":"#/components/schemas/VersionInfo"}}},"VersionInfo":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"},"apiType":{"type":"string","enum":["LEADER","RUNNER"]}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## Stop service

> Sends a command to stop one or more services indicated in the request body, enabling maintenance or controlled reboot.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/operations/services/stop":{"post":{"tags":["operations"],"operationId":"stopServices","requestBody":{"content":{"application/json;charset=UTF-8":{"schema":{"$ref":"#/components/schemas/StopServicesValidatedRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Sends a command to stop one or more services indicated in the request body, enabling maintenance or controlled reboot.","summary":"Stop service","parameters":[]}}},"components":{"schemas":{"StopServicesValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Data"}}},"Data":{"type":"object","properties":{"api":{"$ref":"#/components/schemas/VersionInfo"},"searchEngine":{"$ref":"#/components/schemas/VersionInfo"}}},"VersionInfo":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"},"apiType":{"type":"string","enum":["LEADER","RUNNER"]}}}}}}
```

## Publish operation

> Publishes an operational event or notification in the system, using the JSON payload to specify title, message and recipients.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/operations/notification":{"post":{"tags":["operations"],"operationId":"notification","requestBody":{"content":{"application/json;charset=UTF-8":{"schema":{"$ref":"#/components/schemas/JsonNotification"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Publishes an operational event or notification in the system, using the JSON payload to specify title, message and recipients.","summary":"Publish operation","parameters":[]}}},"components":{"schemas":{"JsonNotification":{"type":"object","properties":{"operation":{"description":"Operation type of the transaction that notification is related to.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]},"tguid":{"description":"Transaction's global unique ID of the transaction that notification is related to.","type":"string"},"status":{"description":"Current status of the transaction that notification is related to.","type":"string"},"sender":{"description":"The notification sender.","type":"string"},"uguid":{"description":"Global unique ID of an unsolved latent. Only used when the notification is related to a transaction that treats an unsolved latent.","type":"string"},"additionalData":{"description":"Map used to add custom information inside the notification that will be delivered to notifier endpoint.","type":"object","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the main transaction that notification is related to.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}}}},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```


# People

## getPerson

> This method returns the information of a person, given its PGUID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}":{"get":{"description":"This method returns the information of a person, given its PGUID.","tags":["people"],"operationId":"getPerson","summary":"getPerson","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"personFields","description":"List containing the names of the fields of the Person entity.","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["BIOMETRIC","AUXILIARIES","KEYS","BIOGRAPHICS","LABELS","METADATA","BASIC_FIELDS","NO_FIELDS","ALL_FIELDS"]}}},{"name":"biometricFields","description":"List containing the names of the fields of the Biometric entity.","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["INDEX","ALL_FIELDS"]}}},{"name":"biographicBase","description":"Determines if the API will try to get biographics from the Biobase Server or not.","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"indexes","description":"List of indexes to be returned. The list may contain only one index. If a provided index does not exist, it will be ignored.","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer","format":"int32"}}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPeopleResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GetPeopleResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Person"},{"type":"object","properties":{"biometric":{"type":"array","items":{"type":"object","properties":{"tguid":{"type":"string","format":"uuid","description":"GUID of the Transaction that contains the biometric data.\n\n*Returned only on calls with Best of Biometrics (BoB) enabled.*\n"}}}}}}]}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## update

> This method performs an update operation in GBDS.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}":{"put":{"description":"This method performs an update operation in GBDS.","tags":["people"],"operationId":"update","summary":"update","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePeopleRequest"}}},"required":true},"responses":{"201":{"description":"Enrolled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"202":{"description":"Enqueued, processing, exception.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"422":{"description":"Pending or failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"UpdatePeopleRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/UpdateBiometricValidation"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"UpdateBiometricValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the update operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"validationType":{"description":"Defines the type of biometric validation to be performed against the AFIS.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"externalIDs":{"description":"List of externalIDs related to this transaction.","type":"array","items":{"$ref":"#/components/schemas/ExternalID"}},"labels":{"type":"string","enum":["ACCUMULATE","REPLACE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"},"forceBoB":{"$ref":"#/components/schemas/ForceBobFlag"}}},"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}},"ForceBobFlag":{"type":"boolean","description":"Forces the use of Best of Biometrics (BoB).\n\nIf set to `true`, a trusted updated will be performed immediately after the update using the best biometric data available. <br>\nIf set to `false`, or absent, no action will be performed.\n\nAlso, the trusted update will only be performed if the update status is `ENROLLED`. Otherwise:\n- If the update status is `PENDING` (MIR), the trusted update will be performed only after the quality approval, if approved.\n- If the update status is `EXCEPTION` (ETR), the trusted update will be performed only after the exception is treated, if approved.\n\nIf the BoB trusted update is successfully performed (response 201 Enrolled), the response will contain some additional information:\n- `bobTguid`: transaction GUID of the BoB trusted update.\n- `bobStatus`: enroll status of the BoB trusted update. Usually `ENQUEUED`.\n\nThis behavior can be turned on/off using the RDB configuration on the table `gbds.settings`: <br>\n**gbds.bestOfBiometrics.forceUsingTrustedUpdate.enabled**, type **API**, default **true**.\n"},"EnrollResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED"]},"tguid":{"description":"Global unique id of the transaction.","type":"string"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"},"bobTguid":{"description":"[Optional] Transaction GUID of the BoB trusted update.\n\n(returned only for **201 Enrolled** responses when a BoB trusted update is successfully performed)\n","type":"string"},"bobStatus":{"description":"[Optional] Enroll status of the BoB trusted update. Usually `ENQUEUED`.\n\n(returned only for **201 Enrolled** responses when a BoB trusted update is successfully performed)\n","type":"string"}}}}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## deletePerson

> This method deletes the information of a person, given its PGUID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}":{"delete":{"description":"This method deletes the information of a person, given its PGUID.","tags":["people"],"operationId":"deletePerson","summary":"deletePerson","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"priority","description":"Priority of the operation. Default is `GOD_PRIORITY`.","in":"query","required":false,"schema":{"type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]}},{"name":"timeout","description":"Timeout of the operation. Default is `0`.\n\nIf the timeout is `-1`, the operation will be executed synchronously.<br>\nIf the timeout is `0`, the operation will be executed asynchronously.<br>\nIf the timeout is `>0` (greater than 0), the operation will be executed synchronously after the timeout.\n","in":"query","required":false,"schema":{"type":"integer"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean"}}],"responses":{"204":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person not active, pending exceptions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## enroll

> This method submits a new enrollment operation to GBDS.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people":{"post":{"description":"This method submits a new enrollment operation to GBDS.","tags":["people"],"operationId":"enroll","summary":"enroll","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePeopleRequest"}}},"required":true},"responses":{"201":{"description":"Enrolled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"202":{"description":"Enqueued, processing, exception, refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"422":{"description":"Pending or failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"CreatePeopleRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/BiometricValidation"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"validationType":{"description":"Defines the type of biometric validation to be performed against the AFIS.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"externalIDs":{"description":"List of externalIDs related to this transaction.","type":"array","items":{"$ref":"#/components/schemas/ExternalID"}},"labels":{"type":"string","enum":["ACCUMULATE","REPLACE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}},"EnrollResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED"]},"tguid":{"description":"Global unique id of the transaction.","type":"string"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"},"bobTguid":{"description":"[Optional] Transaction GUID of the BoB trusted update.\n\n(returned only for **201 Enrolled** responses when a BoB trusted update is successfully performed)\n","type":"string"},"bobStatus":{"description":"[Optional] Enroll status of the BoB trusted update. Usually `ENQUEUED`.\n\n(returned only for **201 Enrolled** responses when a BoB trusted update is successfully performed)\n","type":"string"}}}}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## listPeople

> This method returns a list of people who match the given search criteria.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/list":{"post":{"description":"This method returns a list of people who match the given search criteria.","tags":["people"],"operationId":"listPeople","summary":"listPeople","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPeopleRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPeopleResponse"}}}},"400":{"description":"Validation Error / Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"ListPeopleRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"personFields":{"description":"Defines the return information.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["BIOMETRIC","AUXILIARIES","KEYS","BIOGRAPHICS","LABELS","METADATA","BASIC_FIELDS","NO_FIELDS","ALL_FIELDS"]}},"pguids":{"description":"This field is a array of PGUIDs.","type":"array","items":{"type":"string"}},"pageIndex":{"description":"Used for paging the result. Given the list, A, of matched People; pageIndex determines which page of A, of size pageSize, to be returned in the response.","type":"integer","format":"int64","default":0},"pageSize":{"description":"Number of people, starting from first, to be returned in the response.","type":"integer","default":20},"restrictions":{"$ref":"#/components/schemas/Restrictions"},"operator":{"deprecated":true,"description":"Logical operator used in the request.\n\n**IMPORTANT:** The data->`operator` field is no longer supported from GBDS API version 5.0.0 onwards. Requests including it will return a 400 Bad Request error. Instead, use the `AND` and `OR` restriction operators in the data->`restrictions` array.\n\n**IMPORTANT:** The `OR` operator is no longer supported from GBDS API version 4.7.4 onwards. Requests including it will return a 400 Bad Request error.\n","type":"string","enum":["AND"]},"includeAnomalies":{"description":"Whether to match People with anomalies.","type":"boolean","default":false},"paginationCount":{"description":"Defines if total count on pagination will be on or off. It overwrites the value of gbds.peopleList.countFromRDB setting in the configuration file.","type":"boolean","default":true},"biographicBase":{"description":"Determines if the API will try to get biographics from the Biobase Server or not.","type":"boolean"},"indexes":{"description":"List of indexes to be returned. The list may contain only one index. If a provided index does not exist, it will be ignored.","type":"array","items":{"type":"integer"}},"startDate":{"description":"Start time. Must be in milliseconds.","type":"string","format":"date"},"endDate":{"description":"End time. Must be in milliseconds.","type":"string","format":"date"}}}}},"Restrictions":{"description":"<br> **Array of restrictions** to be applied to the search.\n\nSearch restriction types: `BIOGRAPHIC`, `KEY`, `LABEL`, `AND`, `OR`.\n\n**Note:** In the `AND` and `OR` restriction operators, the property `restrictions` recursively accepts *arrays of restrictions* following this same structure. See example in the *Request samples*.\n\n**IMPORTANT:** The **DATE** restriction is no longer supported from GBDS API version 5.0.0 onwards. Instead, use the fields data->`startDate` and data->`endDate`.\n","type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/RestrictionBiographic"},{"$ref":"#/components/schemas/RestrictionKey"},{"$ref":"#/components/schemas/RestrictionLabel"},{"$ref":"#/components/schemas/RestrictionAnd"},{"$ref":"#/components/schemas/RestrictionOr"},{"$ref":"#/components/schemas/RestrictionDate"}]}},"RestrictionBiographic":{"title":"BIOGRAPHIC","type":"object","properties":{"type":{"description":"Value MUST be `BIOGRAPHIC`.","type":"string","default":"BIOGRAPHIC"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionKey":{"title":"KEY","type":"object","properties":{"type":{"description":"Value MUST be `KEY`.","type":"string","default":"KEY"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionLabel":{"title":"LABEL","type":"object","properties":{"type":{"description":"Value MUST be `LABEL`.","type":"string","default":"LABEL"},"label":{"type":"string"},"exists":{"type":"boolean"}}},"RestrictionAnd":{"title":"AND","type":"object","properties":{"type":{"description":"Value MUST be `AND`.","type":"string","default":"AND"},"restrictions":{"$ref":"#/components/schemas/Restrictions"}}},"RestrictionOr":{"title":"OR","type":"object","properties":{"type":{"description":"Value MUST be `OR`.","type":"string","default":"OR"},"restrictions":{"$ref":"#/components/schemas/Restrictions"}}},"RestrictionDate":{"title":"DATE","deprecated":true,"type":"object","properties":{"type":{"description":"Value MUST be `DATE`.","type":"string","default":"DATE"},"startDate":{"description":"Start time. Must be in milliseconds.","type":"integer"},"endDate":{"description":"End time. Must be in milliseconds.","type":"integer"}}},"ListPeopleResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Person"}},"pagination":{"oneOf":[{"$ref":"#/components/schemas/Pagination"},{"$ref":"#/components/schemas/PaginationOff"}]},"expression":{"description":"This field describes in a more natural language the restrictions used in the search (array of restrictions, data->`restrictions`, in the payload).","type":"string"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"PaginationOff":{"type":"object","properties":{"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## deleteBiometric

> This method delete a specific biometric in a person's register, given the person's PGUID and biometric index.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/biometric/{biometricIndex}":{"delete":{"description":"This method delete a specific biometric in a person's register, given the person's PGUID and biometric index.","tags":["people"],"operationId":"deleteBiometric","summary":"deleteBiometric","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"biometricIndex","description":"Finger index to be excluded.","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}}}}
```

## getPguidUsingKeys

> This method returns the PGUID of a person, given its search keys.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/pguid":{"get":{"description":"This method returns the PGUID of a person, given its search keys.","tags":["people"],"operationId":"getPguidUsingKeys","summary":"getPguidUsingKeys","parameters":[{"name":"key_id","description":"ID of the key to be used to identify the reference person.","in":"query","required":true,"schema":{"type":"string"}},{"name":"key_value","description":"Value of the key to be used to identify the reference person.","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPeoplePguidUsingKeyResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GetPeoplePguidUsingKeyResponse":{"type":"object","properties":{"data":{"description":"Person PGUID.","type":"string"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## disablePeopleTransaction

> This method deletes a transaction from a person, given its TGUID and the person's PGUID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/transactions/{tguid}":{"delete":{"description":"This method deletes a transaction from a person, given its TGUID and the person's PGUID.","tags":["people"],"operationId":"disablePeopleTransaction","summary":"disablePeopleTransaction","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person does not have a transaction, transaction is already disabled, could not disable transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## trustedEnroll

> This method performs an enrollment operation without comparing biometrics.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/trusted":{"post":{"description":"This method performs an enrollment operation without comparing biometrics.","tags":["people"],"operationId":"trustedEnroll","summary":"trustedEnroll","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePeopleTrustedRequest"}}},"required":true},"responses":{"201":{"description":"Enrolled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"202":{"description":"Enqueued, processing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"CreatePeopleTrustedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/TrustedEnrollMeta"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"TrustedEnrollMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"active":{"description":"Determines if the biometric sent will be loaded into RAM and be available for Search and biometric validation.","type":"boolean"},"externalIDs":{"description":"a","type":"array","items":{"$ref":"#/components/schemas/ExternalIDRequest"}},"labelsOperation":{"description":"a","type":"string","enum":["REPLACE","ACCUMULATE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalIDRequest":{"type":"object","properties":{"name":{"type":"string"},"keys":{"type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}},"EnrollResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED"]},"tguid":{"description":"Global unique id of the transaction.","type":"string"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"},"bobTguid":{"description":"[Optional] Transaction GUID of the BoB trusted update.\n\n(returned only for **201 Enrolled** responses when a BoB trusted update is successfully performed)\n","type":"string"},"bobStatus":{"description":"[Optional] Enroll status of the BoB trusted update. Usually `ENQUEUED`.\n\n(returned only for **201 Enrolled** responses when a BoB trusted update is successfully performed)\n","type":"string"}}}}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## trustedUpdate

> This method performs an update operation without comparing biometrics.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/trusted":{"put":{"description":"This method performs an update operation without comparing biometrics.","tags":["people"],"operationId":"trustedUpdate","summary":"trustedUpdate","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePeopleTrustedRequest"}}},"required":true},"responses":{"201":{"description":"Enrolled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"202":{"description":"Enqueued, processing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"UpdatePeopleTrustedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/TrustedEnrollMeta"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"TrustedEnrollMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"active":{"description":"Determines if the biometric sent will be loaded into RAM and be available for Search and biometric validation.","type":"boolean"},"externalIDs":{"description":"a","type":"array","items":{"$ref":"#/components/schemas/ExternalIDRequest"}},"labelsOperation":{"description":"a","type":"string","enum":["REPLACE","ACCUMULATE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalIDRequest":{"type":"object","properties":{"name":{"type":"string"},"keys":{"type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}},"EnrollResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED"]},"tguid":{"description":"Global unique id of the transaction.","type":"string"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"},"bobTguid":{"description":"[Optional] Transaction GUID of the BoB trusted update.\n\n(returned only for **201 Enrolled** responses when a BoB trusted update is successfully performed)\n","type":"string"},"bobStatus":{"description":"[Optional] Enroll status of the BoB trusted update. Usually `ENQUEUED`.\n\n(returned only for **201 Enrolled** responses when a BoB trusted update is successfully performed)\n","type":"string"}}}}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## trustedAddKeys

> Adds new keys to a person.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/trusted/keys":{"post":{"description":"Adds new keys to a person.","tags":["people"],"operationId":"trustedAddKeys","summary":"trustedAddKeys","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrustedAddKeysRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrustedAddKeysResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}}}}}},"components":{"schemas":{"TrustedAddKeysRequest":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Key"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"TrustedAddKeysResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person to whom the keys were added.","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the current Person transaction that was changed.","type":"string"},"keys":{"description":"List of all keys of the Person, after new keys were added.","type":"array","items":{"$ref":"#/components/schemas/Key"}}}}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## trustedReplaceKeys

> Replaces the entire set of keys associated with the specified person (PGUID) with a new set, overwriting the old keys to maintain identification consistency in the ABIS.'

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/trusted/keys":{"put":{"tags":["people"],"operationId":"replaceKey","summary":"trustedReplaceKeys","parameters":[{"name":"pguid","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplaceKeyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrustedAddKeysResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ValidationError"}}}}}}},"404":{"description":"Person not found","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/ProcessingError"}}}}}}}},"description":"Replaces the entire set of keys associated with the specified person (PGUID) with a new set, overwriting the old keys to maintain identification consistency in the ABIS.'"}}},"components":{"schemas":{"ReplaceKeyRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ReplaceKey"}}},"ReplaceKey":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"},"newValue":{"description":"New value of entity identifier.","type":"string"}}},"TrustedAddKeysResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person to whom the keys were added.","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the current Person transaction that was changed.","type":"string"},"keys":{"description":"List of all keys of the Person, after new keys were added.","type":"array","items":{"$ref":"#/components/schemas/Key"}}}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## updateBiographicsOnBiobaseUsingPGUID

> This endpoint creates or updates biographics on the Biographic Base Server using BioBase configuration on API.\<br>\<br> It uses any key provided to find a person/identity on the server. If it does, it updates it with all biographics provided, keeping the existing ones.\<br> If it does not find any person/identity with the keys provided, it creates a person/identity on the server with the keys and biographics provided.\<br> It calls all servers until one responds with a 2xx http code. If none respond successfully, it returns the last server response call code. \*\*Always send PGUID as key.\*\*

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/bio-base":{"post":{"description":"This endpoint creates or updates biographics on the Biographic Base Server using BioBase configuration on API.<br><br> It uses any key provided to find a person/identity on the server. If it does, it updates it with all biographics provided, keeping the existing ones.<br> If it does not find any person/identity with the keys provided, it creates a person/identity on the server with the keys and biographics provided.<br> It calls all servers until one responds with a 2xx http code. If none respond successfully, it returns the last server response call code. **Always send PGUID as key.**","tags":["people"],"operationId":"updateBiographicsOnBiobaseUsingPGUID","summary":"updateBiographicsOnBiobaseUsingPGUID","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBiographicsOnBiobaseRequest"}}},"required":true},"responses":{"201":{"description":"Identity created on Biobase Server"},"202":{"description":"Identity updated on Biobase Server"}}}}},"components":{"schemas":{"UpdateBiographicsOnBiobaseRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/BioBaseBiographic"}}}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"BioBaseBiographic":{"type":"object","properties":{"id":{"type":"string","description":"Biographic key."},"type":{"type":"string","description":"Biographic type. It can be TEXT or FACE.","enum":["TEXT","FACE"]},"value":{"type":"string","description":"Biographic value. Faces are encoded in Base64."}}}}}}
```

## updateBiographicsOnBiobaseUsingPGUIDAndTGUID

> This endpoint creates or updates biographics on the Biographic Base Server using BioBase configuration on API.\<br>\<br> It uses any key provided to find a person/identity on the server. If it does, it updates it with all biographics provided, keeping the existing ones.\<br> If it does not find any person/identity with the keys provided, it creates a person/identity on the server with the keys and biographics provided.\<br> It calls all servers until one responds with a 2xx http code. If none respond successfully, it returns the last server response call code. \*\*Always send PGUID and TGUID as keys.\*\*

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/bio-base/{tguid}":{"post":{"description":"This endpoint creates or updates biographics on the Biographic Base Server using BioBase configuration on API.<br><br> It uses any key provided to find a person/identity on the server. If it does, it updates it with all biographics provided, keeping the existing ones.<br> If it does not find any person/identity with the keys provided, it creates a person/identity on the server with the keys and biographics provided.<br> It calls all servers until one responds with a 2xx http code. If none respond successfully, it returns the last server response call code. **Always send PGUID and TGUID as keys.**","tags":["people"],"operationId":"updateBiographicsOnBiobaseUsingPGUIDAndTGUID","summary":"updateBiographicsOnBiobaseUsingPGUIDAndTGUID","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBiographicsOnBiobaseRequest"}}},"required":true},"responses":{"201":{"description":"Identity created on Biobase Server"},"202":{"description":"Identity updated on Biobase Server"}}}}},"components":{"schemas":{"UpdateBiographicsOnBiobaseRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/BioBaseBiographic"}}}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"BioBaseBiographic":{"type":"object","properties":{"id":{"type":"string","description":"Biographic key."},"type":{"type":"string","description":"Biographic type. It can be TEXT or FACE.","enum":["TEXT","FACE"]},"value":{"type":"string","description":"Biographic value. Faces are encoded in Base64."}}}}}}
```

## removePerson

> Permanently removes the person identified by PGUID from the database along with their biographical/biometric data. Useful for definitive and irreversible removal.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/permanent":{"delete":{"tags":["people"],"operationId":"deletePersonFisically","parameters":[{"name":"pguid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Permanently removes the person identified by PGUID from the database along with their biographical/biometric data. Useful for definitive and irreversible removal.","summary":"removePerson"}}}}
```

## exportNIST

> Creates and returns a NIST package (biometric exchange standard) with the data of a specified person or transaction, allowing export according to the NIST standard.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/nist":{"post":{"tags":["people"],"operationId":"createNist","summary":"exportNIST","parameters":[{"name":"tguid","in":"query","required":false,"schema":{"type":"string"}},{"name":"pguid","in":"query","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePeopleValidatedRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/xml":{"schema":{"type":"string"}}}}},"description":"Creates and returns a NIST package (biometric exchange standard) with the data of a specified person or transaction, allowing export according to the NIST standard."}}},"components":{"schemas":{"CreatePeopleValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Person"},"meta":{"$ref":"#/components/schemas/BiometricValidation"},"biometricValidationIfNotNull":{"$ref":"#/components/schemas/BiometricValidation"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"BiometricValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"validationType":{"description":"Defines the type of biometric validation to be performed against the AFIS.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"externalIDs":{"description":"List of externalIDs related to this transaction.","type":"array","items":{"$ref":"#/components/schemas/ExternalID"}},"labels":{"type":"string","enum":["ACCUMULATE","REPLACE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}}}}}
```


# Quality

## getQualityControl

> This method returns the quality analysis result for a given transaction.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/qualityAnalysis/{tguid}":{"get":{"description":"This method returns the quality analysis result for a given transaction.","tags":["quality"],"operationId":"getQualityControl","summary":"getQualityControl","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}},{"name":"biographicBase","in":"query","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetQualityControlResponse"}}}}}}}},"components":{"schemas":{"GetQualityControlResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/QualityControl"}}},"QualityControl":{"type":"object","properties":{"tguid":{"description":"Transaction GUID.","type":"string","format":"uuid"},"pguid":{"description":"Person GUID.","type":"string","format":"uuid"},"created":{"description":"Creation timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"updated":{"description":"Update timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"qualityStatus":{"description":"Quality status.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"enrollStatus":{"description":"Enroll status.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","REFUSED","PENDING","RESENT_ENROLL"]},"person":{"description":"A summary of the person (some fields may be omitted).","allOf":[{"$ref":"#/components/schemas/Person"}]},"transactionType":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]},"issues":{"type":"object","description":"Number of issues found per type.","properties":{"lowQuality":{"type":"integer","description":"Number of quality issues."},"duplication":{"type":"integer","description":"Number of duplication issues."},"sequenceControl":{"type":"integer","description":"Number of sequence control issues."}}},"apiID":{"description":"API ID","type":"string","format":"uuid"},"gbdsVersion":{"description":"GBDS Version","type":"string"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]}}}}
```

## listQualityControl

> This method returns a list of transactions with quality analysis.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/qualityAnalysis":{"get":{"description":"This method returns a list of transactions with quality analysis.","tags":["quality"],"operationId":"listQualityControl","summary":"listQualityControl","parameters":[{"name":"enrollStatus","description":"Select only enrolls with a specific status, e.g., ENROLLED.\n\nThis parameter can be a list. To do so, pass it multiple times with the desired values.\n\n**NOTE**: At least one of the parameters `enrollStatus` or `qualityStatus` is required.\n","in":"query","required":false,"schema":{"type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","REFUSED","PENDING","RESENT_ENROLL"]}},{"name":"qualityStatus","description":"Filter with specific quality status.\n\nThis parameter can be a list. To do so, pass it multiple times with the desired values.\n\n**NOTE**: At least one of the parameters `enrollStatus` or `qualityStatus` is required.\n","in":"query","required":false,"schema":{"type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]}},{"name":"startDate","description":"Minimum timestamp, in milliseconds.","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"endDate","description":"Maximum timestamp, in milliseconds.","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"keys","description":"Array of keys that uniquely identify the person. This field can be an expression.\n\nThe following structure can be used for both `keys` and `biographics`:\n\n| Format         | Description                                                                                       |\n|----------------|---------------------------------------------------------------------------------------------------|\n| `<id>:<value>` | Searches for exceptions with incoming or reference keys/biographics with the passed id and value. |\n| `<id>:`        | Searches for exceptions with incoming or reference keys/biographics with the id and any value.    |\n| `:<value>`     | Searches for exceptions with incoming or reference keys/biographics with the value and any id.    |\n\nFrom the second keys/biographics item onwards, before each id or value, you can include an operator:\n- `[and]`: performs an AND operation with the previous item.\n- `[or]`: performs an OR operation with the previous item.\n\nThese operators may be applied to both keys and biographics.\n\nOn every operation on an id or value, the default behavior will be to test for exact matches.\nTo change this behavior, you can include a modifier at the end of the id or value:\n- `[exact]`: tests for exact matches. This is the default behavior, the same as not including any modifier.\n- `[atstart]`: searches for content that starts with the passed id/value.\n- `[atend]`: searches for content that ends with the passed id/value.\n- `[anywhere]`: searches for content that contains the passed id/value.\n\n**IMPORTANT**: Be careful when using modifiers other than `[exact]`. They can slow down the search.\n\nExamples:\n- `keys=cpf:001&biographics=name`\n- `keys=cpf:001&keys=[or]cpf:002`\n- `keys=cpf:00[atstart]`\n","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"biographics","description":"Biographic data of the person. This field can be an expression.\n\nFor expressions, use the same structure described in the `keys` parameter.\n","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"labels","description":"A list of labels that may be empty. This field can be an expression. For transactions with no labels, use \"labels=\".","in":"query","required":false,"schema":{"type":"string"}},{"name":"pageSize","description":"Defines the number of results per page.","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"pageIndex","description":"Defines which page will be returned.","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"orderBy","description":"Order the results by creation date or update date.","in":"query","required":false,"schema":{"type":"string","enum":["CREATED_ASC","CREATED_DESC","UPDATED_ASC","UPDATED_DESC"]}},{"name":"biographicBase","in":"query","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListQualityControlResponse"}}}}}}}},"components":{"schemas":{"ListQualityControlResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/QualityControl"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"QualityControl":{"type":"object","properties":{"tguid":{"description":"Transaction GUID.","type":"string","format":"uuid"},"pguid":{"description":"Person GUID.","type":"string","format":"uuid"},"created":{"description":"Creation timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"updated":{"description":"Update timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"qualityStatus":{"description":"Quality status.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"enrollStatus":{"description":"Enroll status.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","REFUSED","PENDING","RESENT_ENROLL"]},"person":{"description":"A summary of the person (some fields may be omitted).","allOf":[{"$ref":"#/components/schemas/Person"}]},"transactionType":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]},"issues":{"type":"object","description":"Number of issues found per type.","properties":{"lowQuality":{"type":"integer","description":"Number of quality issues."},"duplication":{"type":"integer","description":"Number of duplication issues."},"sequenceControl":{"type":"integer","description":"Number of sequence control issues."}}},"apiID":{"description":"API ID","type":"string","format":"uuid"},"gbdsVersion":{"description":"GBDS Version","type":"string"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}}}}}
```

## qualityAnalysis

> This method provides the quality analysis result for a given transaction.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/{tguid}/qualityAnalysis":{"put":{"description":"This method provides the quality analysis result for a given transaction.","tags":["quality"],"operationId":"qualityAnalysis","summary":"qualityAnalysis","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateQualityAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateQualityAnalysisResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"403":{"description":"Enrollment is not assigned, enroll has a different assigned user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"404":{"description":"Enrollment transaction does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Invalid transaction state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"UpdateQualityAnalysisRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"qualityAnalysis":{"$ref":"#/components/schemas/QualityAnalysis"},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}}}},"meta":{"$ref":"#/components/schemas/UpdateQualityAnalysisMeta"}}},"QualityAnalysis":{"type":"object","properties":{"status":{"description":"Status of the analysis.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"user":{"description":"Username of whom issued the approval.","type":"string"},"comments":{"description":"User comments on the approval.","type":"string"},"timestamp":{"description":"Creation time of the approval, be it manual or automatic. If the enroll did not have any anomalies, the approval was automatic, thus this field will be equal to the enroll time. Otherwise, this timestamp will be the time when the user either approved or rejected the enrollment.","type":"integer","format":"int64"},"duplicationIssues":{"type":"array","items":{"$ref":"#/components/schemas/DuplicationIssue"}},"qualityIssues":{"type":"array","items":{"$ref":"#/components/schemas/QualityIssue"}},"sequenceControlIssues":{"type":"array","items":{"$ref":"#/components/schemas/SequenceControlIssue"}}}},"DuplicationIssue":{"type":"object","properties":{"indexes":{"description":"List of pairs of duplicated indexes found.","type":"array","items":{"type":"integer","format":"int32"}}}},"QualityIssue":{"type":"object","properties":{"index":{"description":"Index of the referred finger.","type":"integer","format":"int32"},"quality":{"description":"Quality calculated for the template.","type":"integer","format":"int32"}}},"SequenceControlIssue":{"type":"object","properties":{"index":{"description":"Index of the problematic finger.","type":"integer","format":"int32"},"matches":{"description":"List of sequence control indexes that matched the given finger and its matching score.","type":"array","items":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"UpdateQualityAnalysisMeta":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"}}},"UpdateQualityAnalysisResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"newTransactionGUID":{"description":"Transaction GUID for new enroll transaction generated.","type":"string"}}}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## unassignPendingEnroll

> This method removes the assignment of a user to quality analysis.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/{tguid}/qualityAnalysis/users":{"delete":{"description":"This method removes the assignment of a user to quality analysis.","tags":["quality"],"operationId":"unassignPendingEnroll","summary":"unassignPendingEnroll","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Enrollment transaction does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Enrollment is not pending, enrollment is already unassigned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## assignPendingEnroll

> This method assigns a quality analysis operation to a given user.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/{tguid}/qualityAnalysis/users/{userName}":{"put":{"description":"This method assigns a quality analysis operation to a given user.","tags":["quality"],"operationId":"assignPendingEnroll","summary":"assignPendingEnroll","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}},{"name":"userName","description":"ID of the user.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Enrollment transaction does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Enrollment is not pending, enrollment is already assigned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Searches

## getSearchResult

> This method returns the result of a search operation, given its TGUID. \<br>\<br> Use the \`searchFields\` query parameter to control the fields included in the response.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/searches/{tguid}":{"get":{"description":"This method returns the result of a search operation, given its TGUID. <br><br> Use the `searchFields` query parameter to control the fields included in the response.","tags":["searches"],"operationId":"getSearchResult","summary":"getSearchResult","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}},{"name":"searchFields","in":"query","description":"<br> Specify the level of detail to include in the search response. The options are:\n- **NO_FIELDS**: Standard response. Only `tguid`, `status`, `score`, `bonafideScore` are possibly returned. (See specific rules for score and bonafideScore in the response model)\n- **BASIC_FIELDS**: Adds the fields: `progress`, `searchType`, `apiID`, `gbdsVersion`, `extractionElapsed`, `searchElapsed`, `postSearchElapsed`, `ulsearch`, and `latentSearch` to the standard response.\n- **CANDIDATES**: Adds the candidate list to the standard response.\n- **BIOMETRICS**: Adds the biometrics list to the standard response.\n- **ALL_FIELDS**: Includes all of the above in the response.\n","required":false,"schema":{"type":"string","enum":["NO_FIELDS","BASIC_FIELDS","CANDIDATES","BIOMETRICS","ALL_FIELDS"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSearchesResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GetSearchesResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Search"}}},"Search":{"type":"object","properties":{"status":{"description":"Status of the search.","type":"string","enum":["ENQUEUED","PREPARED","PROCESSING","MATCH","NOT_MATCH","FAILED","PENDING","PERSON_NOT_FOUND"]},"tguid":{"description":"Search transaction TGUID.","type":"string"},"candidates":{"description":"List of match candidates.","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"progress":{"type":"number","format":"float"},"request":{"$ref":"#/components/schemas/SearchSpec"},"failReason":{"description":"Fail message on why search didn't complete.","type":"string"},"searchType":{"description":"Type of finger that was searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometrics":{"description":"List of biometrics","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"apiID":{"description":"API ID","type":"string"},"gbdsVersion":{"description":"GBDS Version","type":"string"},"extractionElapsed":{"description":"Time to complete the extraction.","type":"integer","format":"int64"},"searchElapsed":{"description":"Time to complete the search.","type":"integer","format":"int64"},"postSearchElapsed":{"description":"Time to complete the post match.","type":"integer","format":"int64"},"ulsearch":{"description":"Unsolved latent search.","type":"boolean"},"latentSearch":{"description":"Latent search.","type":"boolean"},"score":{"description":"Score of the biometric comparison. Only returned if a single biometric was provided in the payload of the request that created the search.","type":"integer","format":"int32"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Only returned if the `liveness` flag was set to `true` in the payload of the request that created the search. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"},"metadata":{"$ref":"#/components/schemas/SearchMetadata"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"SearchSpec":{"type":"object","properties":{"searchType":{"description":"Type of finger to be searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometric":{"description":"If only one biometric is provided, a match score will be returned. If more than one biometric is provided, a list of candidates can be retrieved using getSearchResult.","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"pguids":{"description":"This field is a list of PGUIDs. If the list is empty or null, the search will be against the entire database. If it has only one PGUID, the search will be 1:1. It is possible to make 1:1 searches with more than one PGUID.","type":"array","items":{"type":"string"}},"labelFilters":{"description":"Used for 1:N operations. The filters will be compared with the labels field registered by the enroll method.","uniqueItems":true,"type":"array","items":{"type":"string"}},"isLatentSearch":{"description":"Flag indicating if the search is a Latent Search.","type":"boolean"},"isULSearch":{"description":"Flag indicating if the search is an UL Search.","type":"boolean"},"numberOfCandidates":{"description":"Number of candidates to be returned.","type":"integer","format":"int32"},"classificationThreshold":{"description":"Threshold for either classifying biometric data or marking it as UNKNOWN.","type":"integer","format":"int32"},"classifications":{"description":"Vector containing the classifications to be considered. Defaults to UNKNOWN.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["PLAIN_ARCH","LEFT_LOOP","RIGHT_LOOP","WHORL","SCAR","UNKNOWN","AMPUTATION","OTHER"]}},"singularities":{"description":"Singularities to be considered. Defaults to NONE.","type":"string","enum":["NONE","NO_DELTA_ALL_CORES","ONE_DELTA_NO_CORES","ONE_DELTA_ALL_CORES"]},"latentSearchOptions":{"$ref":"#/components/schemas/LatentSearchOptions"},"searchOptions":{"$ref":"#/components/schemas/SearchOptions"},"user":{"type":"string"},"uguids":{"description":"Globally unique ID of the UL. Can be a list of uguids.","type":"array","items":{"type":"string"}},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned.","type":"boolean"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"LatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"}}},"SearchOptions":{"type":"object","properties":{"biometricType":{"description":"biometricType must contain its data and be one of the following values - FINGERPRINT, PALMPRINT, FACE, IRIS, NEWBORN_PALMPRINT, i.e., you must substitute the \"biometricType\" field name by one of the ENUM names.","type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"},"matcher":{"description":"Define which ginger preset will be used.","type":"string","enum":["DEFAULT","MOBILE"]}}}}},"SearchMetadata":{"description":"Additional information.","type":"object","additionalProperties":{"description":"A flexible key-value pair where the key is a string."}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## search

> This method performs a biometric search a returns the people that match the search criteria.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/searches":{"post":{"description":"This method performs a biometric search a returns the people that match the search criteria.","tags":["searches"],"operationId":"search","summary":"search","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSearchRequest"}}},"required":true},"responses":{"201":{"description":"Created, match, not match","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSearchResponse"}}}},"202":{"description":"Enqueued, processing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSearchResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist (if a PGUID is provided)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Processing Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"CreateSearchRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SearchSpec"},"meta":{"$ref":"#/components/schemas/SearchMeta"}}},"SearchSpec":{"type":"object","properties":{"searchType":{"description":"Type of finger to be searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometric":{"description":"If only one biometric is provided, a match score will be returned. If more than one biometric is provided, a list of candidates can be retrieved using getSearchResult.","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"pguids":{"description":"This field is a list of PGUIDs. If the list is empty or null, the search will be against the entire database. If it has only one PGUID, the search will be 1:1. It is possible to make 1:1 searches with more than one PGUID.","type":"array","items":{"type":"string"}},"labelFilters":{"description":"Used for 1:N operations. The filters will be compared with the labels field registered by the enroll method.","uniqueItems":true,"type":"array","items":{"type":"string"}},"isLatentSearch":{"description":"Flag indicating if the search is a Latent Search.","type":"boolean"},"isULSearch":{"description":"Flag indicating if the search is an UL Search.","type":"boolean"},"numberOfCandidates":{"description":"Number of candidates to be returned.","type":"integer","format":"int32"},"classificationThreshold":{"description":"Threshold for either classifying biometric data or marking it as UNKNOWN.","type":"integer","format":"int32"},"classifications":{"description":"Vector containing the classifications to be considered. Defaults to UNKNOWN.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["PLAIN_ARCH","LEFT_LOOP","RIGHT_LOOP","WHORL","SCAR","UNKNOWN","AMPUTATION","OTHER"]}},"singularities":{"description":"Singularities to be considered. Defaults to NONE.","type":"string","enum":["NONE","NO_DELTA_ALL_CORES","ONE_DELTA_NO_CORES","ONE_DELTA_ALL_CORES"]},"latentSearchOptions":{"$ref":"#/components/schemas/LatentSearchOptions"},"searchOptions":{"$ref":"#/components/schemas/SearchOptions"},"user":{"type":"string"},"uguids":{"description":"Globally unique ID of the UL. Can be a list of uguids.","type":"array","items":{"type":"string"}},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned.","type":"boolean"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"LatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"}}},"SearchOptions":{"type":"object","properties":{"biometricType":{"description":"biometricType must contain its data and be one of the following values - FINGERPRINT, PALMPRINT, FACE, IRIS, NEWBORN_PALMPRINT, i.e., you must substitute the \"biometricType\" field name by one of the ENUM names.","type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"},"matcher":{"description":"Define which ginger preset will be used.","type":"string","enum":["DEFAULT","MOBILE"]}}}}},"SearchMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"metadata":{"$ref":"#/components/schemas/SearchMetadata"},"verifyResult":{"type":"boolean","description":"Flag to request the result of the Verification call (Verify - when keys and/or PGUIDs are provided). Default: `false`.\n\nIf `false`, the Verify will return:\n- `tguid`\n- `status`\n- `score` (if only one biometric was provided in the request payload and the `searchType` is `SAME_FINGERS`; if more than one biometric was provided, the score will not be returned)\n- `bonafideScore` (for faces, if the data->`liveness` flag is set to `true` in the request payload)\n\nIf `true`, the Verify will return all above plus:\n- `candidates` (if more than one biometric is provided, candidates will be returned and the score will not be returned)\n- `progress`\n- `searchType`\n- `metadata`\n- `apiID`\n- `gbdsVersion`\n- `extractionElapsed`\n- `searchElapsed`\n- `postSearchElapsed`\n- `ulsearch`\n- `latentSearch`\n\nPS: `biometrics` are never returned in the response.\n"}}},"SearchMetadata":{"description":"Additional information.","type":"object","additionalProperties":{"description":"A flexible key-value pair where the key is a string."}},"CreateSearchResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"description":"Status of the search.","type":"string","enum":["ENQUEUED","PROCESSING","MATCH","NOT_MATCH","FAILED"]},"tguid":{"description":"Search transaction TGUID.","type":"string"},"score":{"description":"Biometric comparison score. <br><br> Only returned if a **single** biometric was provided in the request payload and the `searchType` is `SAME_FINGERS`.","type":"integer","format":"int32"},"bonafideScore":{"description":"Bonafide score of the liveness verification. <br><br> Only returned for **faces** and if the `liveness` flag was set to `true` in the request payload. Ranges from 0 to 100. (0=attack, 100=genuine).","type":"integer","format":"int32"},"candidates":{"description":"List of match candidates. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"progress":{"description":"Progress. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"number","format":"float"},"searchType":{"description":"Type of finger that was searched. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"metadata":{"allOf":[{"description":"Additional Information. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*"},{"$ref":"#/components/schemas/SearchMetadata"}]},"apiID":{"description":"API ID. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"string"},"gbdsVersion":{"description":"GBDS Version. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"string"},"extractionElapsed":{"description":"Time to complete the extraction. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"integer","format":"int64"},"searchElapsed":{"description":"Time to complete the search. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"integer","format":"int64"},"postSearchElapsed":{"description":"Time to complete the post match. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"integer","format":"int64"},"ulsearch":{"description":"Unsolved latent search. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"boolean"},"latentSearch":{"description":"Latent search. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"boolean"}}}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## rematch

> Triggers a new matching process (rematch) on transactions or persons whose data were updated, recalculating candidates and results.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/searches/rematch":{"put":{"tags":["searches"],"operationId":"rematch","summary":"rematch","parameters":[{"name":"tguid","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSearchesResponse"}}}}},"description":"Triggers a new matching process (rematch) on transactions or persons whose data were updated, recalculating candidates and results."}}},"components":{"schemas":{"ListSearchesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Search"}},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"Search":{"type":"object","properties":{"status":{"description":"Status of the search.","type":"string","enum":["ENQUEUED","PREPARED","PROCESSING","MATCH","NOT_MATCH","FAILED","PENDING","PERSON_NOT_FOUND"]},"tguid":{"description":"Search transaction TGUID.","type":"string"},"candidates":{"description":"List of match candidates.","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"progress":{"type":"number","format":"float"},"request":{"$ref":"#/components/schemas/SearchSpec"},"failReason":{"description":"Fail message on why search didn't complete.","type":"string"},"searchType":{"description":"Type of finger that was searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometrics":{"description":"List of biometrics","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"apiID":{"description":"API ID","type":"string"},"gbdsVersion":{"description":"GBDS Version","type":"string"},"extractionElapsed":{"description":"Time to complete the extraction.","type":"integer","format":"int64"},"searchElapsed":{"description":"Time to complete the search.","type":"integer","format":"int64"},"postSearchElapsed":{"description":"Time to complete the post match.","type":"integer","format":"int64"},"ulsearch":{"description":"Unsolved latent search.","type":"boolean"},"latentSearch":{"description":"Latent search.","type":"boolean"},"score":{"description":"Score of the biometric comparison. Only returned if a single biometric was provided in the payload of the request that created the search.","type":"integer","format":"int32"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Only returned if the `liveness` flag was set to `true` in the payload of the request that created the search. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"},"metadata":{"$ref":"#/components/schemas/SearchMetadata"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"SearchSpec":{"type":"object","properties":{"searchType":{"description":"Type of finger to be searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometric":{"description":"If only one biometric is provided, a match score will be returned. If more than one biometric is provided, a list of candidates can be retrieved using getSearchResult.","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"pguids":{"description":"This field is a list of PGUIDs. If the list is empty or null, the search will be against the entire database. If it has only one PGUID, the search will be 1:1. It is possible to make 1:1 searches with more than one PGUID.","type":"array","items":{"type":"string"}},"labelFilters":{"description":"Used for 1:N operations. The filters will be compared with the labels field registered by the enroll method.","uniqueItems":true,"type":"array","items":{"type":"string"}},"isLatentSearch":{"description":"Flag indicating if the search is a Latent Search.","type":"boolean"},"isULSearch":{"description":"Flag indicating if the search is an UL Search.","type":"boolean"},"numberOfCandidates":{"description":"Number of candidates to be returned.","type":"integer","format":"int32"},"classificationThreshold":{"description":"Threshold for either classifying biometric data or marking it as UNKNOWN.","type":"integer","format":"int32"},"classifications":{"description":"Vector containing the classifications to be considered. Defaults to UNKNOWN.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["PLAIN_ARCH","LEFT_LOOP","RIGHT_LOOP","WHORL","SCAR","UNKNOWN","AMPUTATION","OTHER"]}},"singularities":{"description":"Singularities to be considered. Defaults to NONE.","type":"string","enum":["NONE","NO_DELTA_ALL_CORES","ONE_DELTA_NO_CORES","ONE_DELTA_ALL_CORES"]},"latentSearchOptions":{"$ref":"#/components/schemas/LatentSearchOptions"},"searchOptions":{"$ref":"#/components/schemas/SearchOptions"},"user":{"type":"string"},"uguids":{"description":"Globally unique ID of the UL. Can be a list of uguids.","type":"array","items":{"type":"string"}},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned.","type":"boolean"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"LatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"}}},"SearchOptions":{"type":"object","properties":{"biometricType":{"description":"biometricType must contain its data and be one of the following values - FINGERPRINT, PALMPRINT, FACE, IRIS, NEWBORN_PALMPRINT, i.e., you must substitute the \"biometricType\" field name by one of the ENUM names.","type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"},"matcher":{"description":"Define which ginger preset will be used.","type":"string","enum":["DEFAULT","MOBILE"]}}}}},"SearchMetadata":{"description":"Additional information.","type":"object","additionalProperties":{"description":"A flexible key-value pair where the key is a string."}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```


# Transaction

## getTransaction

> This method returns the data of a transaction, given its TGUID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/{tguid}":{"get":{"description":"This method returns the data of a transaction, given its TGUID.","tags":["transaction"],"operationId":"getTransaction","summary":"getTransaction","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/EnrollFields"},{"name":"personFields","description":"List containing the names of the fields of the Person entity.","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["BIOMETRIC","AUXILIARIES","KEYS","BIOGRAPHICS","LABELS","METADATA","BASIC_FIELDS","NO_FIELDS","ALL_FIELDS"]}}},{"name":"biometricFields","description":"List containing the names of the fields of the Biometric entity.","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["INDEX","ALL_FIELDS"]}}},{"name":"biographicBase","description":"Determines if the API will try to get biographics from the Biobase Server or not.","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"indexes","description":"List of indexes to be returned. The list may contain only one index. If a provided index does not exist, it will be ignored.","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer","format":"int32"}}},{"name":"enrollFields","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["BASIC_FIELDS","EXCEPTIONS","QUALITY","QUALITY_CONTROL","PERSON","EXCEPTION_ISSUES","EXTERNAL_IDS","ALL_FIELDS","NO_FIELDS"]}}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEnrollTransactionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Transaction does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"parameters":{"EnrollFields":{"name":"enrollFields","description":"<br><br> List containing the names of the fields of the Enroll entity.\n\n- **QUALITY**: returns only the data->`qualityAnalysis` object with the property `status` and the arrays `duplicationIssues`, `qualityIssues`, and `sequenceControlIssues` (if applicable). *This is also returned if no enrollFields are passed.* <br><br>\n\n- **QUALITY_CONTROL**: returns only the data->`qualityAnalysis` object with the properties `status`, `user`, `comments`, and `timestamp` (if applicable).<br><br>\n\n- **ALL_FIELDS**: returns all fields.\n","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["BASIC_FIELDS","EXCEPTIONS","QUALITY","QUALITY_CONTROL","PERSON","EXCEPTION_ISSUES","EXTERNAL_IDS","ALL_FIELDS","NO_FIELDS"]}}}},"schemas":{"GetEnrollTransactionsResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enroll"}}},"Enroll":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"pguid":{"description":"PGUID of the UL candidate.","type":"string"},"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED","RESENT_ENROLL"]},"timestamp":{"description":"Timestamp of Enroll creation.","type":"integer","format":"int64"},"progress":{"description":"Progress of the Enroll operation.","type":"number","format":"float"},"candidates":{"description":"Identify candidates","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"person":{"$ref":"#/components/schemas/Person"},"qualityAnalysis":{"$ref":"#/components/schemas/QualityAnalysis"},"failReason":{"description":"Message describing why the enroll failed","type":"string"},"isCurrentTransaction":{"description":"Whether this is the current transaction for the person identified by PGUID.","type":"boolean"},"refusedReason":{"$ref":"#/components/schemas/EnrollRefusedReason"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Only returned if the `liveness` flag was set to `true` in the payload of the enroll/update request. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"},"postSearchElapsed":{"description":"Time to complete the post match.","type":"integer","format":"int64"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"QualityAnalysis":{"type":"object","properties":{"status":{"description":"Status of the analysis.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"user":{"description":"Username of whom issued the approval.","type":"string"},"comments":{"description":"User comments on the approval.","type":"string"},"timestamp":{"description":"Creation time of the approval, be it manual or automatic. If the enroll did not have any anomalies, the approval was automatic, thus this field will be equal to the enroll time. Otherwise, this timestamp will be the time when the user either approved or rejected the enrollment.","type":"integer","format":"int64"},"duplicationIssues":{"type":"array","items":{"$ref":"#/components/schemas/DuplicationIssue"}},"qualityIssues":{"type":"array","items":{"$ref":"#/components/schemas/QualityIssue"}},"sequenceControlIssues":{"type":"array","items":{"$ref":"#/components/schemas/SequenceControlIssue"}}}},"DuplicationIssue":{"type":"object","properties":{"indexes":{"description":"List of pairs of duplicated indexes found.","type":"array","items":{"type":"integer","format":"int32"}}}},"QualityIssue":{"type":"object","properties":{"index":{"description":"Index of the referred finger.","type":"integer","format":"int32"},"quality":{"description":"Quality calculated for the template.","type":"integer","format":"int32"}}},"SequenceControlIssue":{"type":"object","properties":{"index":{"description":"Index of the problematic finger.","type":"integer","format":"int32"},"matches":{"description":"List of sequence control indexes that matched the given finger and its matching score.","type":"array","items":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}},"EnrollRefusedReason":{"type":"object","properties":{"matchedPeopleThatAreReferenceInSomeExceptionUnderAnalysis":{"description":"List of PGUID of the people that is the reference in some exception under analysis.","type":"array","items":{"type":"string"}},"matchedTransactionsThatHaveAnExceptionUnderAnalysis":{"description":"List of TGUID of entrant transactions with the exception under analysis.","type":"array","items":{"type":"string"}}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## listTransactions

> This method returns a list of enrollment and updates transactions that match the search criteria.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions":{"get":{"description":"This method returns a list of enrollment and updates transactions that match the search criteria.","tags":["transaction"],"operationId":"listTransactions","summary":"listTransactions","parameters":[{"name":"enrollStatus","description":"Select only enrolls with a specific status, e.g., ENROLLED.\n\nThis parameter can be a list. To do so, pass it multiple times with the desired values.\n\n**NOTE**: At least one of the parameters `enrollStatus` or `qualityStatus` is required.\n","in":"query","required":false,"schema":{"type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","REFUSED","PENDING","RESENT_ENROLL"]}},{"name":"qualityStatus","description":"Filter with specific quality status.\n\nThis parameter can be a list. To do so, pass it multiple times with the desired values.\n\n**NOTE**: At least one of the parameters `enrollStatus` or `qualityStatus` is required.\n","in":"query","required":false,"schema":{"type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]}},{"name":"startDate","description":"Minimum timestamp, in milliseconds.","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"endDate","description":"Maximum timestamp, in milliseconds.","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"keys","description":"Array of keys that uniquely identify the person. This field can be an expression.\n\nThe following structure can be used for both `keys` and `biographics`:\n\n| Format         | Description                                                                                       |\n|----------------|---------------------------------------------------------------------------------------------------|\n| `<id>:<value>` | Searches for exceptions with incoming or reference keys/biographics with the passed id and value. |\n| `<id>:`        | Searches for exceptions with incoming or reference keys/biographics with the id and any value.    |\n| `:<value>`     | Searches for exceptions with incoming or reference keys/biographics with the value and any id.    |\n\nFrom the second keys/biographics item onwards, before each id or value, you can include an operator:\n- `[and]`: performs an AND operation with the previous item.\n- `[or]`: performs an OR operation with the previous item.\n\nThese operators may be applied to both keys and biographics.\n\nOn every operation on an id or value, the default behavior will be to test for exact matches.\nTo change this behavior, you can include a modifier at the end of the id or value:\n- `[exact]`: tests for exact matches. This is the default behavior, the same as not including any modifier.\n- `[atstart]`: searches for content that starts with the passed id/value.\n- `[atend]`: searches for content that ends with the passed id/value.\n- `[anywhere]`: searches for content that contains the passed id/value.\n\n**IMPORTANT**: Be careful when using modifiers other than `[exact]`. They can slow down the search.\n\nExamples:\n- `keys=cpf:001&biographics=name`\n- `keys=cpf:001&keys=[or]cpf:002`\n- `keys=cpf:00[atstart]`\n","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"biographics","description":"Biographic data of the person. This field can be an expression.\n\nFor expressions, use the same structure described in the `keys` parameter.\n","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"labels","description":"A list of labels that may be empty. This field can be an expression. For transactions with no labels, use `labels=`.\n\nThe format is only the label name. For example, `labels=example`.\n\nThe `[and]` and `[or]` operators can be used to combine labels as described in the `keys` parameter, but they are only applied to labels.\n\nThe `[exact]` (default), `[atstart]`, `[atend]`, and `[anywhere]` modifiers can be used to change the behavior of the label search, as described in the `keys` parameter.\n","in":"query","required":false,"schema":{"type":"string"}},{"name":"pageSize","description":"Size of the request.","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageIndex","description":"Defines which page will be returned.","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"$ref":"#/components/parameters/EnrollFields"},{"name":"personFields","description":"List containing the names of the fields of the Person entity.","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["BIOMETRIC","AUXILIARIES","KEYS","BIOGRAPHICS","LABELS","METADATA","BASIC_FIELDS","NO_FIELDS","ALL_FIELDS"]}}},{"name":"biometricFields","description":"List containing the names of the fields of the Biometric entity.","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["INDEX","ALL_FIELDS"]}}},{"name":"manuallyReviewed","description":"List transactions for MIR with parameter manuallyReviewed. Transactions are now manually reviewed if they once have the status PENDING (caught by quality control) and they were approved or rejected.","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"biographicBase","description":"Determines if the API will try to get biographics from the Biobase Server or not.","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"orderBy","description":"Order the results by creation date or update date.","in":"query","required":false,"schema":{"type":"string","enum":["CREATED_ASC","CREATED_DESC","UPDATED_ASC","UPDATED_DESC"]}},{"name":"indexes","description":"List of indexes to be returned. The list may contain only one index. If a provided index does not exist, it will be ignored.","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer","format":"int32"}}},{"name":"active","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"enrollFields","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["BASIC_FIELDS","EXCEPTIONS","QUALITY","QUALITY_CONTROL","PERSON","EXCEPTION_ISSUES","EXTERNAL_IDS","ALL_FIELDS","NO_FIELDS"]}}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListEnrollTransactionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"parameters":{"EnrollFields":{"name":"enrollFields","description":"<br><br> List containing the names of the fields of the Enroll entity.\n\n- **QUALITY**: returns only the data->`qualityAnalysis` object with the property `status` and the arrays `duplicationIssues`, `qualityIssues`, and `sequenceControlIssues` (if applicable). *This is also returned if no enrollFields are passed.* <br><br>\n\n- **QUALITY_CONTROL**: returns only the data->`qualityAnalysis` object with the properties `status`, `user`, `comments`, and `timestamp` (if applicable).<br><br>\n\n- **ALL_FIELDS**: returns all fields.\n","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["BASIC_FIELDS","EXCEPTIONS","QUALITY","QUALITY_CONTROL","PERSON","EXCEPTION_ISSUES","EXTERNAL_IDS","ALL_FIELDS","NO_FIELDS"]}}}},"schemas":{"ListEnrollTransactionsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Enroll"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}}},"Enroll":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"pguid":{"description":"PGUID of the UL candidate.","type":"string"},"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED","RESENT_ENROLL"]},"timestamp":{"description":"Timestamp of Enroll creation.","type":"integer","format":"int64"},"progress":{"description":"Progress of the Enroll operation.","type":"number","format":"float"},"candidates":{"description":"Identify candidates","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"person":{"$ref":"#/components/schemas/Person"},"qualityAnalysis":{"$ref":"#/components/schemas/QualityAnalysis"},"failReason":{"description":"Message describing why the enroll failed","type":"string"},"isCurrentTransaction":{"description":"Whether this is the current transaction for the person identified by PGUID.","type":"boolean"},"refusedReason":{"$ref":"#/components/schemas/EnrollRefusedReason"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Only returned if the `liveness` flag was set to `true` in the payload of the enroll/update request. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"},"postSearchElapsed":{"description":"Time to complete the post match.","type":"integer","format":"int64"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"QualityAnalysis":{"type":"object","properties":{"status":{"description":"Status of the analysis.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"user":{"description":"Username of whom issued the approval.","type":"string"},"comments":{"description":"User comments on the approval.","type":"string"},"timestamp":{"description":"Creation time of the approval, be it manual or automatic. If the enroll did not have any anomalies, the approval was automatic, thus this field will be equal to the enroll time. Otherwise, this timestamp will be the time when the user either approved or rejected the enrollment.","type":"integer","format":"int64"},"duplicationIssues":{"type":"array","items":{"$ref":"#/components/schemas/DuplicationIssue"}},"qualityIssues":{"type":"array","items":{"$ref":"#/components/schemas/QualityIssue"}},"sequenceControlIssues":{"type":"array","items":{"$ref":"#/components/schemas/SequenceControlIssue"}}}},"DuplicationIssue":{"type":"object","properties":{"indexes":{"description":"List of pairs of duplicated indexes found.","type":"array","items":{"type":"integer","format":"int32"}}}},"QualityIssue":{"type":"object","properties":{"index":{"description":"Index of the referred finger.","type":"integer","format":"int32"},"quality":{"description":"Quality calculated for the template.","type":"integer","format":"int32"}}},"SequenceControlIssue":{"type":"object","properties":{"index":{"description":"Index of the problematic finger.","type":"integer","format":"int32"},"matches":{"description":"List of sequence control indexes that matched the given finger and its matching score.","type":"array","items":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}},"EnrollRefusedReason":{"type":"object","properties":{"matchedPeopleThatAreReferenceInSomeExceptionUnderAnalysis":{"description":"List of PGUID of the people that is the reference in some exception under analysis.","type":"array","items":{"type":"string"}},"matchedTransactionsThatHaveAnExceptionUnderAnalysis":{"description":"List of TGUID of entrant transactions with the exception under analysis.","type":"array","items":{"type":"string"}}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ResponseMeta":{"type":"object","properties":{"tguidsWithError":{"description":"Array containing TGUID for transactions, of the requested page, which had errors during retrieval and thus are NOT present in the returned page.","type":"array","items":{"type":"string"}}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## linkEnroll

> This method links an approved transaction to its refused transaction tguid.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/linkResentEnroll/{tguid}/newTguid/{newTguid}":{"put":{"description":"This method links an approved transaction to its refused transaction tguid.","tags":["transaction"],"operationId":"linkEnroll","summary":"linkEnroll","parameters":[{"name":"tguid","description":"Refused Transaction Tguid.","in":"path","required":true,"schema":{"type":"string"}},{"name":"newTguid","description":"Approved transaction Tguid.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad Request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"422":{"description":"Missing TGUID or Invalid Transaction Status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## transactionReport

> Returns information about transactions that match the search criteria. The transactions will be grouped by operation and API instance (optional).

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/report":{"get":{"description":"Returns information about transactions that match the search criteria. The transactions will be grouped by operation and API instance (optional).","tags":["transaction"],"operationId":"transactionReport","summary":"transactionReport","parameters":[{"name":"start","description":"Start date to filter the transactions. Format \"yyyy-MM-dd HH:mm:ss\". If absent, API considers one month from the request timestamp.","in":"query","required":false,"schema":{"type":"string"}},{"name":"end","description":"End date to filter the transactions. Format \"yyyy-MM-dd HH:mm:ss\". If absent, API considers the request timestamp.","in":"query","required":false,"schema":{"type":"string"}},{"name":"byApiId","description":"Flag to group results by API ID or not.","in":"query","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionReportResponse"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"TransactionReportResponse":{"type":"object","properties":{"data":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/ReportGroupedByAPIEnroll"},{"$ref":"#/components/schemas/ReportGroupedByAPISearch"},{"$ref":"#/components/schemas/ReportNotGroupedByAPIEnroll"},{"$ref":"#/components/schemas/ReportNotGroupedByAPISearch"}]}}}},"ReportGroupedByAPIEnroll":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]},"apiId":{"description":"API ID to group transactions.","type":"string"}}},"ReportGroupedByAPISearch":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["VERIFY","IDENTIFY"]},"latent":{"description":"Whether the transactions are latent searches or not.","type":"boolean"},"ul":{"description":"Whether the transactions are UL searches or not.","type":"boolean"},"apiId":{"description":"API ID to group transactions.","type":"string"}}},"ReportNotGroupedByAPIEnroll":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]}}},"ReportNotGroupedByAPISearch":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["VERIFY","IDENTIFY"]},"latent":{"description":"Whether the transactions are latent searches or not.","type":"boolean"},"ul":{"description":"Whether the transactions are UL searches or not.","type":"boolean"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Ul

## listULs

> This method returns a list of Unsolved Latent that match the search criteria.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/uls":{"get":{"description":"This method returns a list of Unsolved Latent that match the search criteria.","tags":["ul"],"operationId":"listULs","summary":"listULs","parameters":[{"name":"pageSize","description":"Size of the request.","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageIndex","description":"Defines which page will be returned.","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"status","description":"Status of the request.","in":"query","required":false,"schema":{"type":"string","enum":["UNSOLVED","SOLVED"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListULsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListULsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UL"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"UL":{"type":"object","properties":{"uguid":{"description":"Globally unique ID of the UL.","type":"string"},"status":{"description":"UL Status.","type":"string","enum":["UNSOLVED","SOLVED","ENQUEUED","FAILED"]},"creationTime":{"description":"Timestamp, in milliseconds, of UL creation.","type":"integer","format":"int64"},"personPguid":{"description":"PGUID of the person the UL was matched against. Only present when the UL has status RESOLVED.","type":"string"},"personTguid":{"description":"TGUID of the person the UL was matched against. Only present when the UL has status RESOLVED.","type":"string"},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"linkedULs":{"description":"List of UGUIDs if ULs that were linked against this UL.","type":"array","items":{"type":"string"}},"fragment":{"$ref":"#/components/schemas/Fragment"},"ulAnalysis":{"$ref":"#/components/schemas/ULAnalysis"},"isSearchable":{"description":"Flag that indicates whether the UL's fragment is already registered and searchable.","type":"boolean"},"failReason":{"description":"If failed, this field indicates the reason.","type":"string"}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Fragment":{"type":"object","properties":{"id":{"description":"ID of the fragment.","type":"string"},"caseId":{"description":"ID of case the fragment is associated to.","type":"string"},"image":{"$ref":"#/components/schemas/Biometric"},"template":{"$ref":"#/components/schemas/Biometric"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ULAnalysis":{"type":"object","properties":{"user":{"description":"Username of user that solved UL.","type":"string"},"timestamp":{"description":"Timestamp, in milliseconds, of when UL was solved.","type":"integer","format":"int64"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## createUL

> This method submit a new Unsolved Latent to GBDS.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/uls":{"post":{"description":"This method submit a new Unsolved Latent to GBDS.","tags":["ul"],"operationId":"createUL","summary":"createUL","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateULsRequest"}}},"required":true},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateULsResponse"}}}}},"parameters":[]}}},"components":{"schemas":{"CreateULsRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Fragment"},"meta":{"$ref":"#/components/schemas/ULValidation"}}},"Fragment":{"type":"object","properties":{"id":{"description":"ID of the fragment.","type":"string"},"caseId":{"description":"ID of case the fragment is associated to.","type":"string"},"image":{"$ref":"#/components/schemas/Biometric"},"template":{"$ref":"#/components/schemas/Biometric"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ULValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"}}},"CreateULsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"uguid":{"description":"UGUID of target UL.","type":"string"}}}}}}}}
```

## listULCandidates

> This method returns a list of UL candidates that match the search criteria.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/uls/candidates":{"get":{"description":"This method returns a list of UL candidates that match the search criteria.","tags":["ul"],"operationId":"listULCandidates","summary":"listULCandidates","parameters":[{"name":"pageIndex","description":"Defines which page will be returned.","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageSize","description":"Size of the request.","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"iniDate","description":"Return candidates that were found after this date.","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"endDate","description":"Maximum timestamp, in milliseconds.","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"iniScore","description":"Return candidates that had a score greater than this.","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"endScore","description":"Return candidates that had a score lower than this.","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"caseId","description":"ID of the case associated with the request.","in":"query","required":false,"schema":{"type":"string"}},{"name":"fragmentId","description":"Fragment ID of the UL.","in":"query","required":false,"schema":{"type":"string"}},{"name":"user","description":"ID of the user.","in":"query","required":false,"schema":{"type":"string"}},{"name":"sortField","description":"Field chosen to sort the list order.","in":"query","required":false,"schema":{"type":"string","enum":["SCORE","STATUS","CREATION_TIME","CASE_ID","FRAGMENT_ID","USER"]}},{"name":"sortOrder","description":"Order that the list will be sorted.","in":"query","required":false,"schema":{"type":"string","enum":["ASCENDING","DESCENDING"]}},{"name":"status","description":"Status of the request.","in":"query","required":false,"schema":{"type":"string","enum":["UNSOLVED","SOLVED"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListULCandidatesResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person not active, pending exceptions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListULCandidatesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ULCandidate"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"ULCandidate":{"type":"object","properties":{"uguid":{"description":"Globally unique ID of the UL it has matched.","type":"string"},"status":{"description":"Matched UL status.","type":"string","enum":["UNSOLVED","SOLVED"]},"creationTime":{"description":"Timestamp, in milliseconds, of UL creation.","type":"string","format":"date-time"},"matchedPersonPguid":{"description":"PGUID of the person the UL candidate was matched against. Only present when the UL has status RESOLVED.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the UL candidate was matched against. Only present when the UL has status RESOLVED.","type":"string"},"caseId":{"description":"Case ID of the UL it has matched.","type":"string"},"fragmentId":{"description":"Fragment ID of the UL it has matched.","type":"string"},"fragmentIndex":{"description":"UL index that matched.","type":"integer","format":"int32"},"user":{"description":"User assigned to the matched UL.","type":"string"},"timestamp":{"description":"Timestamp in milliseconds of the match.","type":"string","format":"date-time"},"candidatePguid":{"description":"PGUID of the UL candidate.","type":"string"},"candidateTguid":{"description":"TGUID of the UL candidate.","type":"string"},"candidateIndex":{"description":"UL candidate index that matched.","type":"integer","format":"int32"},"score":{"description":"Score of the match.","type":"integer","format":"int32"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## linkULs

> This method links 2 different ULs, given both UGUIDs.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/uls/{referenceUguid}/links/{targetUguid}":{"put":{"description":"This method links 2 different ULs, given both UGUIDs.","tags":["ul"],"operationId":"linkULs","summary":"linkULs","parameters":[{"name":"referenceUguid","description":"Globally unique ID of the reference UL.","in":"path","required":true,"schema":{"type":"string"}},{"name":"targetUguid","description":"Globally unique ID of the target UL.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person not active, pending exceptions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## getUL

> This method returns a UL, given its UGUID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/uls/{uguid}":{"get":{"description":"This method returns a UL, given its UGUID.","tags":["ul"],"operationId":"getUL","summary":"getUL","parameters":[{"name":"uguid","description":"Globally unique ID of the UL.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetULsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person not active, pending exceptions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GetULsResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UL"}}},"UL":{"type":"object","properties":{"uguid":{"description":"Globally unique ID of the UL.","type":"string"},"status":{"description":"UL Status.","type":"string","enum":["UNSOLVED","SOLVED","ENQUEUED","FAILED"]},"creationTime":{"description":"Timestamp, in milliseconds, of UL creation.","type":"integer","format":"int64"},"personPguid":{"description":"PGUID of the person the UL was matched against. Only present when the UL has status RESOLVED.","type":"string"},"personTguid":{"description":"TGUID of the person the UL was matched against. Only present when the UL has status RESOLVED.","type":"string"},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"linkedULs":{"description":"List of UGUIDs if ULs that were linked against this UL.","type":"array","items":{"type":"string"}},"fragment":{"$ref":"#/components/schemas/Fragment"},"ulAnalysis":{"$ref":"#/components/schemas/ULAnalysis"},"isSearchable":{"description":"Flag that indicates whether the UL's fragment is already registered and searchable.","type":"boolean"},"failReason":{"description":"If failed, this field indicates the reason.","type":"string"}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Fragment":{"type":"object","properties":{"id":{"description":"ID of the fragment.","type":"string"},"caseId":{"description":"ID of case the fragment is associated to.","type":"string"},"image":{"$ref":"#/components/schemas/Biometric"},"template":{"$ref":"#/components/schemas/Biometric"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ULAnalysis":{"type":"object","properties":{"user":{"description":"Username of user that solved UL.","type":"string"},"timestamp":{"description":"Timestamp, in milliseconds, of when UL was solved.","type":"integer","format":"int64"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## updateUL

> This method updates an UL.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/uls/{uguid}":{"post":{"tags":["ul"],"operationId":"updateUL","summary":"updateUL","description":"This method updates an UL.","parameters":[{"name":"uguid","description":"a","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateULsRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateULsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"422":{"description":"Processing Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}}}}}},"components":{"schemas":{"CreateULsRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Fragment"},"meta":{"$ref":"#/components/schemas/ULValidation"}}},"Fragment":{"type":"object","properties":{"id":{"description":"ID of the fragment.","type":"string"},"caseId":{"description":"ID of case the fragment is associated to.","type":"string"},"image":{"$ref":"#/components/schemas/Biometric"},"template":{"$ref":"#/components/schemas/Biometric"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ULValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"}}},"CreateULsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"uguid":{"description":"UGUID of target UL.","type":"string"}}}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## deleteCandidate

> This method deletes a given candidate from the UL's candidates list.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/uls/{uguid}/candidate/{tguid}/{index}":{"delete":{"description":"This method deletes a given candidate from the UL's candidates list.","tags":["ul"],"operationId":"deleteCandidate","summary":"deleteCandidate","parameters":[{"name":"uguid","description":"Globally unique ID of the UL.","in":"path","required":true,"schema":{"type":"string"}},{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}},{"name":"index","description":"Index of the target candidate.","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"204":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person not active, pending exceptions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## solveUL

> This method associates the UL to a given reference person and then marks the UL as SOLVED.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/uls/{uguid}/solve":{"put":{"description":"This method associates the UL to a given reference person and then marks the UL as SOLVED.","tags":["ul"],"operationId":"solveUL","summary":"solveUL","parameters":[{"name":"uguid","description":"Globally unique ID of the UL.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolveULsRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person not active, pending exceptions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"SolveULsRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"tguid":{"description":"TGUID of reference person to which the UL should be matched.","type":"string"},"user":{"description":"User that is solving UL.","type":"string"}}}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## unlinkULs

> This method removes any existing links from a UL.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/uls/{uguid}/links":{"delete":{"description":"This method removes any existing links from a UL.","tags":["ul"],"operationId":"unlinkULs","summary":"unlinkULs","parameters":[{"name":"uguid","description":"Globally unique ID of the UL.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person not active, pending exceptions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## deleteListOfCandidates

> This method deletes a list of specific candidates for a given UL.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/uls/{uguid}/candidates":{"post":{"description":"This method deletes a list of specific candidates for a given UL.","tags":["ul"],"operationId":"deleteListOfCandidates","summary":"deleteListOfCandidates","parameters":[{"name":"uguid","description":"Globally unique ID of the UL.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteULCandidatesRequest"}}},"required":true},"responses":{"204":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person not active, pending exceptions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"DeleteULCandidatesRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DeleteULCandidatesSpec"}}},"DeleteULCandidatesSpec":{"type":"object","properties":{"uguid":{"description":"UGUID of target UL.","type":"string"},"candidates":{"description":"Array of people whose biometric data matched with the biometric data.","type":"array","items":{"$ref":"#/components/schemas/ULCandidateIdentifier"}}}},"ULCandidateIdentifier":{"type":"object","properties":{"pguid":{"description":"PGUID of the target candidate.","type":"string"},"tguid":{"description":"TGUID of the target candidate.","type":"string"},"index":{"description":"Index of the target candidate.","type":"integer","format":"int32"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## deleteAllCandidates

> This method deletes all candidates for a given UL.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/uls/{uguid}/candidates":{"delete":{"description":"This method deletes all candidates for a given UL.","tags":["ul"],"operationId":"deleteAllCandidates","summary":"deleteAllCandidates","parameters":[{"name":"uguid","description":"Globally unique ID of the UL.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person not active, pending exceptions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Tokens

## createToken

> This method provides the required authentication token to perform GBDS operations.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/tokens":{"post":{"description":"This method provides the required authentication token to perform GBDS operations.","tags":["tokens"],"operationId":"createToken","summary":"createToken","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTokenRequest"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTokenResponse"}}}},"400":{"description":"Validation error, expired token, invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"401":{"description":"Expired token, invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecurityError"}}}},"422":{"description":"Invalid token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecurityError"}}}},"500":{"description":"Internal error, unknown token Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"CreateTokenRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"grantType":{"description":"How the token will be generated. To generate a new token from user credentials, use grantType =  CREDENTIALS. To generate a new token using a currently valid token, use grantType = TOKEN.","type":"string","enum":["CREDENTIALS","TOKEN"]},"userName":{"description":"User ID.","type":"string"},"userPassword":{"description":"User password.","type":"string"},"token":{"description":"Currently valid token to be used for the token renewal process.","type":"string"}}}}},"CreateTokenResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"token":{"description":"Currently valid token to be used for the token renewal process.","type":"string"},"expirationTime":{"description":"Expiration time of the token in milliseconds.","type":"integer","format":"int64"},"ttl":{"description":"Token's time to live in milliseconds.","type":"integer","format":"int64"}}}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"SecurityError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["SECURITY_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["INVALID_CREDENTIALS","INVALID_TOKEN","INVALID_AUTHORIZATION_SCHEMA","MISSING_TOKEN","UNKNOWN_LOGIN_ERROR","UNKNOWN_TOKEN_ERROR","EXPIRED_TOKEN","UNAUTHORIZED_ACCESS"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Email

## groupEmailNotify

> This method creates a new email group or updates details of an existing one.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notify-group":{"post":{"description":"This method creates a new email group or updates details of an existing one.","tags":["email"],"operationId":"groupEmailNotify","summary":"groupEmailNotify","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupEmail"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGroupEmailResponse"}}}},"202":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGroupEmailResponse"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"GroupEmail":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"description":"Name of the group","type":"string"},"enabled":{"description":"Enable or disable the send email service for this group.","type":"boolean"},"emails":{"description":"array of e-mails","type":"array","items":{"type":"string"}}}}}},"CreateGroupEmailResponse":{"type":"object","properties":{"status":{"type":"string"},"data":{"type":"object","properties":{"name":{"description":"Name of the group","type":"string"},"enabled":{"description":"Enable or disable the send email service for this group.","type":"boolean"},"emails":{"description":"array of e-mails","type":"array","items":{"type":"string"}}}}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## getGroupEmail

> This method retrieves the group and its e-mail list.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notify-group/{group}":{"get":{"description":"This method retrieves the group and its e-mail list.","tags":["email"],"operationId":"getGroupEmail","summary":"getGroupEmail","parameters":[{"name":"group","description":"Group name to be retrieved.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupEmail"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GroupEmail":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"description":"Name of the group","type":"string"},"enabled":{"description":"Enable or disable the send email service for this group.","type":"boolean"},"emails":{"description":"array of e-mails","type":"array","items":{"type":"string"}}}}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## userEmailNotify

> This method inserts a user and update their groups.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notify-user":{"post":{"description":"This method inserts a user and update their groups.","tags":["email"],"operationId":"userEmailNotify","summary":"userEmailNotify","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserGroup"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserEmailResponse"}}}},"202":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserEmailResponse"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"UserGroup":{"type":"object","properties":{"data":{"type":"object","properties":{"username":{"description":"Name of the user.","type":"string"},"groups":{"description":"Array of group name objects.","type":"array","items":{"type":"object","properties":{"name":{"type":"string"}}}}}}}},"CreateUserEmailResponse":{"type":"object","properties":{"status":{"type":"string"},"data":{"type":"object","properties":{"username":{"description":"Name of the user.","type":"string"},"groups":{"description":"Array of objects of groups","type":"array","items":{"type":"object","properties":{"name":{"type":"string"}}}}}}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## getUserEmail

> This method retrieves a user and its email groups.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notify-user/{user}":{"get":{"description":"This method retrieves a user and its email groups.","tags":["email"],"operationId":"getUserEmail","summary":"getUserEmail","parameters":[{"name":"user","description":"User to be retrieved.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserGroup"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"UserGroup":{"type":"object","properties":{"data":{"type":"object","properties":{"username":{"description":"Name of the user.","type":"string"},"groups":{"description":"Array of group name objects.","type":"array","items":{"type":"object","properties":{"name":{"type":"string"}}}}}}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Transparency

## peopleTransparency

> Request to create or update transparency actions related to a pguid

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people-transparency":{"post":{"description":"Request to create or update transparency actions related to a pguid","tags":["transparency"],"operationId":"peopleTransparency","summary":"peopleTransparency","requestBody":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/TransparencyPeopleRequest"}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransparencyPeopleResponse"}}}},"202":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransparencyPeopleResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"TransparencyPeopleRequest":{"type":"object","properties":{"pguid":{"description":"person global ID.","type":"string"},"action":{"description":"transparency action","type":"string","enum":["NOTIFY","CLASSIFIED","REMOVE"]},"enabled":{"type":"string"},"groups":{"description":"groups the pguid belongs to","type":"array","items":{"type":"object"}}}},"TransparencyPeopleResponse":{"type":"object","properties":{"status":{"type":"string","description":"transaction status."},"data":{"$ref":"#/components/schemas/TransparencyPeopleRequest"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## getPeopleTransparency

> Request to get people transparency information by pguid.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people-transparency/{pguid}":{"get":{"description":"Request to get people transparency information by pguid.","tags":["transparency"],"operationId":"getPeopleTransparency","summary":"getPeopleTransparency","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTransparencyPeople"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GetTransparencyPeople":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TransparencyPeopleRequest"}}}},"TransparencyPeopleRequest":{"type":"object","properties":{"pguid":{"description":"person global ID.","type":"string"},"action":{"description":"transparency action","type":"string","enum":["NOTIFY","CLASSIFIED","REMOVE"]},"enabled":{"type":"string"},"groups":{"description":"groups the pguid belongs to","type":"array","items":{"type":"object"}}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## deletePeopleTransparency

> this method deletes a given pguid from people transparency.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people-transparency/{pguid}":{"delete":{"description":"this method deletes a given pguid from people transparency.","tags":["transparency"],"operationId":"deletePeopleTransparency","summary":"deletePeopleTransparency","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"action","description":"transparency action","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## getTransparencyList

> Get people transparency list.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people-transparency/list":{"get":{"description":"Get people transparency list.","tags":["transparency"],"operationId":"getTransparencyList","summary":"getTransparencyList","parameters":[{"name":"pageIndex","description":"Defines which page will be returned.","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageSize","description":"Size of the request.","in":"query","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTransparencyPeople"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GetTransparencyPeople":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TransparencyPeopleRequest"}}}},"TransparencyPeopleRequest":{"type":"object","properties":{"pguid":{"description":"person global ID.","type":"string"},"action":{"description":"transparency action","type":"string","enum":["NOTIFY","CLASSIFIED","REMOVE"]},"enabled":{"type":"string"},"groups":{"description":"groups the pguid belongs to","type":"array","items":{"type":"object"}}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Configuration

## controlPanelConfig

> This method is used to change the configuration GBDS RDB.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/configuration":{"post":{"tags":["configuration"],"description":"This method is used to change the configuration GBDS RDB.","operationId":"controlPanelConfig","summary":"controlPanelConfig","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigurationRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"ConfigurationRequest":{"type":"object","properties":{"application":{"description":"Configuration mode for the application.","type":"string","enum":["GBDS_API","GBDS_DRIVER","GBDS_API_AND_DRIVER"]},"configurations":{"description":"Dictionary of configuration parameters and default values. It can contain multiple unique parameters as Strings.","type":"object"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## getConfiguration

> Retrieves configuration values of the indicated type (API, DRIVER or both), allowing one to know configurable system parameters.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/configuration/{settingType}":{"get":{"tags":["configuration"],"operationId":"getConfig","summary":"getConfiguration","parameters":[{"name":"settingType","in":"path","required":true,"schema":{"type":"string","enum":["GBDS_API","GBDS_DRIVER","GBDS_API_AND_DRIVER"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfigurationResponse"}}}}},"description":"Retrieves configuration values of the indicated type (API, DRIVER or both), allowing one to know configurable system parameters."}}},"components":{"schemas":{"ConfigurationResponse":{"type":"object","properties":{"configurations":{"type":"object","additionalProperties":{"type":"string"}},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```


# Status

## matcherStatus

> This method return the complete information of the cluster and its nodes.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/status":{"get":{"description":"This method return the complete information of the cluster and its nodes.","tags":["status"],"operationId":"matcherStatus","summary":"matcherStatus","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMatcherStatusResponse"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"GetMatcherStatusResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"configuredMatchers":{"description":"Number of matchers running on the cluster.","type":"integer","format":"int32"},"peopleCount":{"description":"Sum of all people in the nodes.","type":"integer","format":"int32"},"ulCount":{"description":"Sum of all ULs in the nodes.","type":"integer","format":"int32"},"nodes":{"description":"Array of nodes.","type":"array","items":{"type":"object","properties":{"hostname":{"description":"Name of the node.","type":"string"},"monitorPort":{"description":"Port of the GBDS Monitor service.","type":"integer","format":"int32"},"status":{"description":"Status of the node.","type":"string","enum":["NONE","SPRING_START","CLUSTER_ASSEMBLY","MATCHERS_ASSEMBLY","PEOPLE_BOOT","UL_BOOT","KAFKA_START","RUNNING","SHUTTING_DOWN"]},"configuredMatchers":{"description":"Number of matchers running on the node.","type":"integer","format":"int32"},"peopleCount":{"description":"Sum of all people in this node.","type":"integer","format":"int32"},"ulCount":{"description":"Sum of all ULs in this node.","type":"integer","format":"int32"},"memory":{"description":"Memory used by the node. Unused biometric modalities will not be shown.","$ref":"#/components/schemas/Memory"},"activeMatchers":{"description":"Matchers running on the node.","type":"array","items":{"type":"object","properties":{"name":{"description":"Name of the matcher.","type":"string"},"peopleCount":{"description":"Quantity of people in the matcher.","type":"integer","format":"int32"},"ulCount":{"description":"Quantity of ULs in the matcher.","type":"integer","format":"int32"},"memory":{"description":"Memory used by the matcher. Unused biometric modalities will not be shown.","$ref":"#/components/schemas/Memory"}}}}}}}}}}},"Memory":{"type":"object","properties":{"FINGERPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"PALMPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"NEWBORN":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"UL_FINGERPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"UL_PALMPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"FACE":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"IRIS":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## gbdsStatus

> This method return the GBDS status, number of matchers, and nodes from GBDS and all nodes.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/status/driver":{"get":{"description":"This method return the GBDS status, number of matchers, and nodes from GBDS and all nodes.","tags":["status"],"operationId":"gbdsStatus","summary":"gbdsStatus","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetGBDSStatusResponse"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"GetGBDSStatusResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"configuredMatchers":{"description":"Number of matchers running on the cluster.","type":"integer","format":"int32"},"nodes":{"type":"array","items":{"type":"object","properties":{"hostname":{"description":"Name of the node.","type":"string"},"monitorPort":{"description":"Port of the GBDS Monitor service.","type":"integer","format":"int32"},"configuredMatchers":{"description":"Number of matchers running on the node.","type":"integer","format":"int32"}}}}}}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Logging

## log

> This method is used to get the loglevel of the API, GBDS.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/log":{"get":{"description":"This method is used to get the loglevel of the API, GBDS.","tags":["logging"],"operationId":"log","summary":"log","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"string"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## changeLogLevel

> This method is used to change the loglevel of the API, GBDS.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/log":{"post":{"description":"This method is used to change the loglevel of the API, GBDS.","tags":["logging"],"operationId":"changeLogLevel","summary":"changeLogLevel","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeLogLevelRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"ChangeLogLevelRequest":{"type":"object","properties":{"data":{"type":"array","writeOnly":true,"items":{"$ref":"#/components/schemas/ChangeLogLevel"}}}},"ChangeLogLevel":{"type":"object","properties":{"component":{"type":"string","enum":["API","DRIVER"]},"logLevel":{"type":"string","enum":["TRACE","DEBUG","INFO","WARN","ERROR","OFF","ALL"]}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Extraction Microservice

## changeExtractorStatus

> This method is used to change the status of an extraction microservice.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/extraction-control/{id}/{enabled}":{"put":{"description":"This method is used to change the status of an extraction microservice.","tags":["extraction-microservice"],"operationId":"changeExtractorStatus","summary":"changeExtractorStatus","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"enabled","in":"path","required":true,"schema":{"type":"string","enum":["ENABLE","DISABLE","RESTART"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExtractionServicesResponse"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListExtractionServicesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ExtractionServiceBean"}}}},"ExtractionServiceBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["GINGER","FACE","GIRL"]},"message":{"type":"string"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## removeExtractor

> This method is used to remove an extraction microservice.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/extraction-control/remove":{"delete":{"description":"This method is used to remove an extraction microservice.","tags":["extraction-microservice"],"operationId":"removeExtractor","summary":"removeExtractor","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExtractionServicesResponse"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"ListExtractionServicesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ExtractionServiceBean"}}}},"ExtractionServiceBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["GINGER","FACE","GIRL"]},"message":{"type":"string"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## listExtractors

> This method is used to list all extraction microservice.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/extraction-control/list":{"get":{"description":"This method is used to list all extraction microservice.","tags":["extraction-microservice"],"operationId":"listExtractors","summary":"listExtractors","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExtractionServicesResponse"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"ListExtractionServicesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ExtractionServiceBean"}}}},"ExtractionServiceBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["GINGER","FACE","GIRL"]},"message":{"type":"string"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## addExtractors

> This method is used to add a new extraction microservice.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/extraction-control/add":{"post":{"description":"This method is used to add a new extraction microservice.","tags":["extraction-microservice"],"operationId":"addExtractors","summary":"addExtractors","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionServiceRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExtractionServicesResponse"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"ExtractionServiceRequest":{"type":"object","properties":{"library":{"type":"string","enum":["GINGER","FACE","GIRL"]},"count":{"type":"integer","format":"int32"}}},"ListExtractionServicesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ExtractionServiceBean"}}}},"ExtractionServiceBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["GINGER","FACE","GIRL"]},"message":{"type":"string"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Quality Extraction

## listQualityExtractors

> This method lists all quality extraction services configured on API.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/extraction-quality-control/list":{"get":{"description":"This method lists all quality extraction services configured on API.","tags":["quality-extraction"],"operationId":"listQualityExtractors","summary":"listQualityExtractors","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityExtractionResponse"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"QualityExtractionResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/QualityExtractionBean"}}}},"QualityExtractionBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["FACE","FINGER"]},"message":{"type":"string"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## addQualityExtractors

> This method is used to add a new instance of the quality extraction service.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/extraction-quality-control/add":{"post":{"description":"This method is used to add a new instance of the quality extraction service.","tags":["quality-extraction"],"operationId":"addQualityExtractors","summary":"addQualityExtractors","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityExtractionRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityExtractionResponse"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"QualityExtractionRequest":{"type":"object","properties":{"library":{"type":"string","enum":["FINGER","FACE"]},"count":{"type":"integer","format":"int32"}}},"QualityExtractionResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/QualityExtractionBean"}}}},"QualityExtractionBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["FACE","FINGER"]},"message":{"type":"string"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## changeQualityExtractorStatus

> This method is used to change the status of an instance of the quality extraction service.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/extraction-quality-control/{quality-extraction-service-id}/{operation}":{"put":{"description":"This method is used to change the status of an instance of the quality extraction service.","tags":["quality-extraction"],"operationId":"changeQualityExtractorStatus","summary":"changeQualityExtractorStatus","parameters":[{"name":"quality-extraction-service-id","in":"path","description":"Id for a quality extraction service, as returned by the list endpoint.","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"operation","in":"path","required":true,"schema":{"type":"string","enum":["ENABLE","DISABLE","RESTART"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"422":{"description":"Unprocessable Entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## removeQualityExtractor

> This method is used to remove an instance of the quality extraction service.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/extraction-quality-control/remove":{"delete":{"description":"This method is used to remove an instance of the quality extraction service.","tags":["quality-extraction"],"operationId":"removeQualityExtractor","summary":"removeQualityExtractor","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityExtractionResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"QualityExtractionResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/QualityExtractionBean"}}}},"QualityExtractionBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["FACE","FINGER"]},"message":{"type":"string"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Apis

## listAPIs

> This method is used to list all the APIs configured in the cluster.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/apis":{"get":{"description":"This method is used to list all the APIs configured in the cluster.","tags":["apis"],"operationId":"listAPIs","summary":"listAPIs","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAPIsResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"ListAPIsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/API"}}}},"API":{"type":"object","properties":{"apiId":{"type":"string","description":"Unique ID of the API instance."},"hostname":{"type":"string","description":"Hostname or IP Address of the node that is hosting the API instance."},"port":{"type":"integer","format":"int32","description":"Port mapped to the API instance."},"type":{"type":"string","enum":["LEADER","RUNNER"]}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## createAPI

> This method is used to create or update an API instance within the cluster. If the API type is LEADER, but another LEADER is already set, the older one becomes a RUNNER type.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/apis":{"post":{"description":"This method is used to create or update an API instance within the cluster. If the API type is LEADER, but another LEADER is already set, the older one becomes a RUNNER type.","tags":["apis"],"operationId":"createAPI","summary":"createAPI","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAPIRequest"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAPIResponse"}}}},"202":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAPIResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"CreateAPIRequest":{"type":"object","properties":{"data":{"type":"object","$ref":"#/components/schemas/API"}}},"API":{"type":"object","properties":{"apiId":{"type":"string","description":"Unique ID of the API instance."},"hostname":{"type":"string","description":"Hostname or IP Address of the node that is hosting the API instance."},"port":{"type":"integer","format":"int32","description":"Port mapped to the API instance."},"type":{"type":"string","enum":["LEADER","RUNNER"]}}},"CreateAPIResponse":{"type":"object","properties":{"status":{"type":"string","enum":["CREATED","UPDATED"]},"data":{"type":"object","$ref":"#/components/schemas/API"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## deleteAPI

> This method is used to remove an API instance from the cluster.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/apis/{apiId}":{"delete":{"description":"This method is used to remove an API instance from the cluster.","tags":["apis"],"operationId":"deleteAPI","summary":"deleteAPI","parameters":[{"name":"apiId","description":"Unique ID of the desired API.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"API ID does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Shutdown

## gbdsShutdown

> This method safe shutdown for API and GBDS

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/shutdown":{"post":{"description":"This method safe shutdown for API and GBDS","tags":["shutdown"],"operationId":"gbdsShutdown","summary":"gbdsShutdown","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShutdownRequest"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}},"parameters":[]}}},"components":{"schemas":{"ShutdownRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"shouldShutdownAPI":{"type":"boolean"},"shouldShutdownDriver":{"type":"boolean"}}}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Liveness

## livenessCheck

> This method submits a biometric sample for liveness check.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness":{"post":{"description":"This method submits a biometric sample for liveness check.","tags":["liveness"],"operationId":"livenessCheck","summary":"livenessCheck","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessCheckRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessCheckResponse"}}}}},"parameters":[]}}},"components":{"schemas":{"LivenessCheckRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/LivenessCheckBiometric"}}},"LivenessCheckBiometric":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained. The value must be `ORIGINAL`.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data. The value must be `FACE`.","type":"string","enum":["FACE"]},"format":{"description":"Format of the biometric data. `REQUIRED`.","type":"string","enum":["JPEG","JPEG2000","PNG","TIFF","GIF","BMP"]},"content":{"description":"Base64 encoded biometric data. `REQUIRED`.","type":"string"}}},"LivenessCheckResponse":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"}}}}}}
```

## getLivenessResult

> This method returns the liveness check result using the TGUID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/{tguid}":{"get":{"description":"This method returns the liveness check result using the TGUID.","tags":["liveness"],"operationId":"getLivenessResult","summary":"getLivenessResult","parameters":[{"name":"tguid","required":true,"in":"path","description":"Global unique ID of the transaction.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetLivenessResultResponse"}}}}}}}},"components":{"schemas":{"GetLivenessResultResponse":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"biometric":{"description":"Biometric data used for the liveness verification.","$ref":"#/components/schemas/LivenessCheckBiometric"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"}}},"LivenessCheckBiometric":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained. The value must be `ORIGINAL`.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data. The value must be `FACE`.","type":"string","enum":["FACE"]},"format":{"description":"Format of the biometric data. `REQUIRED`.","type":"string","enum":["JPEG","JPEG2000","PNG","TIFF","GIF","BMP"]},"content":{"description":"Base64 encoded biometric data. `REQUIRED`.","type":"string"}}}}}}
```

## Get liveness configuration

> Retrieves the heuristic liveness configuration, including score thresholds and other parameters used in fraud detection.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/settings":{"get":{"tags":["liveness"],"operationId":"getHeuridsticSettings","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessSettings"}}}}},"description":"Retrieves the heuristic liveness configuration, including score thresholds and other parameters used in fraud detection.","summary":"Get liveness configuration","parameters":[]}}},"components":{"schemas":{"LivenessSettings":{"type":"object","properties":{"settings":{"type":"object","additionalProperties":{"type":"string"}},"tings":{"$ref":"#/components/schemas/LivenessSettings"}}}}}}
```

## Set liveness configuration

> Fully updates the heuristic liveness settings, changing thresholds and parameters used in proof-of-life evaluation.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/settings":{"post":{"tags":["liveness"],"operationId":"setHeuristicSettings","summary":"Set liveness configuration","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessSettings"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessSettings"}}}}},"description":"Fully updates the heuristic liveness settings, changing thresholds and parameters used in proof-of-life evaluation.","parameters":[]}}},"components":{"schemas":{"LivenessSettings":{"type":"object","properties":{"settings":{"type":"object","additionalProperties":{"type":"string"}},"tings":{"$ref":"#/components/schemas/LivenessSettings"}}}}}}
```

## Get liveness transactions

> Lists evaluated liveness transactions, allowing filtering by period, person, device, status and quality/score thresholds, returning paginated records.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/transaction":{"get":{"tags":["liveness"],"operationId":"listHeuristicTransactions","summary":"Get liveness transactions","parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"personKey","in":"query","required":false,"schema":{"type":"string"}},{"name":"deviceId","in":"query","required":false,"schema":{"type":"string"}},{"name":"success","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"minScore","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"minImageQuality","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"minBonafideScore","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"minAdjustedBonafideScore","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageIndex","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LivenessHeuristicTransaction"}}}}}},"description":"Lists evaluated liveness transactions, allowing filtering by period, person, device, status and quality/score thresholds, returning paginated records."}}},"components":{"schemas":{"LivenessHeuristicTransaction":{"type":"object","properties":{"tguid":{"type":"string"},"personKey":{"type":"string"},"deviceId":{"type":"string"},"model":{"type":"string"},"soVersion":{"type":"string"},"timestamp":{"type":"integer","format":"int64"},"bccMobileVersion":{"type":"string"},"liveness":{"type":"boolean"},"ipAddress":{"type":"string"},"success":{"type":"boolean"},"description":{"type":"string"},"score":{"type":"integer","format":"int32"},"imageQuality":{"type":"integer","format":"int32"},"originalBonafideScore":{"type":"integer","format":"int32"},"adjustedBonafideScore":{"type":"integer","format":"int32"}}}}}}
```

## Get specific liveness transaction

> Retrieves the full record of a liveness transaction identified by TGUID, including scores and metadata.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/transaction/{tguid}":{"get":{"tags":["liveness"],"operationId":"getHeuristicTransaction","summary":"Get specific liveness transaction","parameters":[{"name":"tguid","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessHeuristicTransaction"}}}}},"description":"Retrieves the full record of a liveness transaction identified by TGUID, including scores and metadata."}}},"components":{"schemas":{"LivenessHeuristicTransaction":{"type":"object","properties":{"tguid":{"type":"string"},"personKey":{"type":"string"},"deviceId":{"type":"string"},"model":{"type":"string"},"soVersion":{"type":"string"},"timestamp":{"type":"integer","format":"int64"},"bccMobileVersion":{"type":"string"},"liveness":{"type":"boolean"},"ipAddress":{"type":"string"},"success":{"type":"boolean"},"description":{"type":"string"},"score":{"type":"integer","format":"int32"},"imageQuality":{"type":"integer","format":"int32"},"originalBonafideScore":{"type":"integer","format":"int32"},"adjustedBonafideScore":{"type":"integer","format":"int32"}}}}}}
```

## List PPE heuristics

> Lists the PPE heuristic parameters/inputs (mask, glasses, etc.) used by the liveness check to consider or disregard facial coverings.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/ppe":{"get":{"tags":["liveness"],"operationId":"getHeuristicPPE","summary":"List PPE heuristics","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LivenessHeuristicPPE"}}}}}},"description":"Lists the PPE heuristic parameters/inputs (mask, glasses, etc.) used by the liveness check to consider or disregard facial coverings.","parameters":[]}}},"components":{"schemas":{"LivenessHeuristicPPE":{"type":"object","properties":{"personKey":{"type":"string"},"description":{"type":"string"}}}}}}
```

## Register PPE information for an individual

> Registers or updates the PPE information (mask, helmet, etc.) for an individual so that the liveness heuristic takes into account their permanent or temporary use.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/ppe":{"post":{"tags":["liveness"],"operationId":"putHeuristicPPE","summary":"Register PPE information for an individual","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessHeuristicPPE"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessHeuristicPPE"}}}}},"description":"Registers or updates the PPE information (mask, helmet, etc.) for an individual so that the liveness heuristic takes into account their permanent or temporary use.","parameters":[]}}},"components":{"schemas":{"LivenessHeuristicPPE":{"type":"object","properties":{"personKey":{"type":"string"},"description":{"type":"string"}}}}}}
```

## Get PPE information of a person

> Retrieves the PPE parameters configured for the identified person, indicating which protective equipment is expected or allowed during capture.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/ppe/{personKey}":{"get":{"tags":["liveness"],"operationId":"getHeuristicPPE_1","summary":"Get PPE information of a person","parameters":[{"name":"personKey","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessHeuristicPPE"}}}}},"description":"Retrieves the PPE parameters configured for the identified person, indicating which protective equipment is expected or allowed during capture."}}},"components":{"schemas":{"LivenessHeuristicPPE":{"type":"object","properties":{"personKey":{"type":"string"},"description":{"type":"string"}}}}}}
```

## Delete PPE information of a person

> Removes the PPE registration for the specified person, reverting to using general proof-of-life rules for that individual.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/ppe/{personKey}":{"delete":{"tags":["liveness"],"operationId":"deleteHeuristicPPE","summary":"Delete PPE information of a person","parameters":[{"name":"personKey","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Removes the PPE registration for the specified person, reverting to using general proof-of-life rules for that individual."}}}}
```

## List people with liveness heuristic information

> Lists people with liveness heuristic information, allowing filtering by PPE flag, presence in watchlist or block, and controlling pagination.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/person":{"get":{"tags":["liveness"],"operationId":"listHeuristicPerson","summary":"List people with liveness heuristic information","parameters":[{"name":"ppe","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"watchlist","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"blocked","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"pageIndex","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LivenessHeuristicPerson"}}}}}},"description":"Lists people with liveness heuristic information, allowing filtering by PPE flag, presence in watchlist or block, and controlling pagination."}}},"components":{"schemas":{"LivenessHeuristicPerson":{"type":"object","properties":{"personKey":{"type":"string"},"ppe":{"type":"boolean"},"watchlist":{"type":"boolean"},"timeout":{"type":"integer","format":"int64"},"tries":{"type":"integer","format":"int32"},"devices":{"type":"integer","format":"int32"},"success":{"type":"integer","format":"int32"},"matchFails":{"type":"integer","format":"int32"},"livenessFails":{"type":"integer","format":"int32"}}}}}}
```

## Get liveness heuristic details of a person

> Retrieves the liveness heuristic details of a specific person, including allowed PPE, watchlist status and block.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/person/{personKey}":{"get":{"tags":["liveness"],"operationId":"getHeuristicPerson","summary":"Get liveness heuristic details of a person","parameters":[{"name":"personKey","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessHeuristicPerson"}}}}},"description":"Retrieves the liveness heuristic details of a specific person, including allowed PPE, watchlist status and block."}}},"components":{"schemas":{"LivenessHeuristicPerson":{"type":"object","properties":{"personKey":{"type":"string"},"ppe":{"type":"boolean"},"watchlist":{"type":"boolean"},"timeout":{"type":"integer","format":"int64"},"tries":{"type":"integer","format":"int32"},"devices":{"type":"integer","format":"int32"},"success":{"type":"integer","format":"int32"},"matchFails":{"type":"integer","format":"int32"},"livenessFails":{"type":"integer","format":"int32"}}}}}}
```

## Remove person from the watchlist

> Removes the specified person from the watchlist and ends any associated timeout, restoring their regular evaluation.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/person/{personKey}/watchlist":{"delete":{"tags":["liveness"],"operationId":"removeHeuristicPersonWatchlistAndTimeout","summary":"Remove person from the watchlist","parameters":[{"name":"personKey","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Removes the specified person from the watchlist and ends any associated timeout, restoring their regular evaluation."}}}}
```

## Get heuristic settings for person-device pair

> Queries the heuristic settings for a person-device pair, indicating whether the device is approved or blocked for that person.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/person/{personKey}/device/{deviceId}":{"get":{"tags":["liveness"],"operationId":"getHeuridsticPersonDevice","summary":"Get heuristic settings for person-device pair","parameters":[{"name":"personKey","in":"path","required":true,"schema":{"type":"string"}},{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessHeuristicPersonDevice"}}}}},"description":"Queries the heuristic settings for a person-device pair, indicating whether the device is approved or blocked for that person."}}},"components":{"schemas":{"LivenessHeuristicPersonDevice":{"type":"object","properties":{"personKey":{"type":"string"},"deviceId":{"type":"string"},"approved":{"type":"boolean"},"success":{"type":"integer","format":"int32"},"matchFails":{"type":"integer","format":"int32"},"livenessFails":{"type":"integer","format":"int32"}}}}}}
```

## Set device status of a person

> Updates the approval status of a device for a person, marking whether the device is authorized or restricted for liveness captures.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/person/{personKey}/device/{deviceId}/approval/{approval}":{"put":{"tags":["liveness"],"operationId":"setHeuridsticPersonDeviceApproval","summary":"Set device status of a person","parameters":[{"name":"personKey","in":"path","required":true,"schema":{"type":"string"}},{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}},{"name":"approval","in":"path","required":true,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessHeuristicPersonDevice"}}}}},"description":"Updates the approval status of a device for a person, marking whether the device is authorized or restricted for liveness captures."}}},"components":{"schemas":{"LivenessHeuristicPersonDevice":{"type":"object","properties":{"personKey":{"type":"string"},"deviceId":{"type":"string"},"approved":{"type":"boolean"},"success":{"type":"integer","format":"int32"},"matchFails":{"type":"integer","format":"int32"},"livenessFails":{"type":"integer","format":"int32"}}}}}}
```

## List relationships between people and devices

> Lists the relationships between people and devices with their approval statuses, accepting filters by person key, device id and whether it is approved.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/person/device":{"get":{"tags":["liveness"],"operationId":"listHeuridsticPersonDevice","summary":"List relationships between people and devices","parameters":[{"name":"personKey","in":"query","required":false,"schema":{"type":"string"}},{"name":"deviceId","in":"query","required":false,"schema":{"type":"string"}},{"name":"approved","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"pageIndex","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LivenessHeuristicPersonDevice"}}}}}},"description":"Lists the relationships between people and devices with their approval statuses, accepting filters by person key, device id and whether it is approved."}}},"components":{"schemas":{"LivenessHeuristicPersonDevice":{"type":"object","properties":{"personKey":{"type":"string"},"deviceId":{"type":"string"},"approved":{"type":"boolean"},"success":{"type":"integer","format":"int32"},"matchFails":{"type":"integer","format":"int32"},"livenessFails":{"type":"integer","format":"int32"}}}}}}
```

## List devices registered in liveness heuristic

> Lists devices registered in the liveness heuristic, allowing filtering by being on watchlist or blocked, and controlling pagination.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/device":{"get":{"tags":["liveness"],"operationId":"listHeuristicDevice","summary":"List devices registered in liveness heuristic","parameters":[{"name":"watchlist","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"blocked","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"pageIndex","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LivenessHeuristicDevice"}}}}}},"description":"Lists devices registered in the liveness heuristic, allowing filtering by being on watchlist or blocked, and controlling pagination."}}},"components":{"schemas":{"LivenessHeuristicDevice":{"type":"object","properties":{"deviceId":{"type":"string"},"watchlist":{"type":"boolean"},"timeout":{"type":"integer","format":"int64"},"tries":{"type":"integer","format":"int32"},"personCount":{"type":"integer","format":"int32"},"success":{"type":"integer","format":"int32"},"matchFails":{"type":"integer","format":"int32"},"livenessFails":{"type":"integer","format":"int32"}}}}}}
```

## Get device details

> Retrieves the liveness heuristic details of a specific device, such as watchlist or block flags.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/device/{deviceId}":{"get":{"tags":["liveness"],"operationId":"getHeuristicDevice","summary":"Get device details","parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessHeuristicDevice"}}}}},"description":"Retrieves the liveness heuristic details of a specific device, such as watchlist or block flags."}}},"components":{"schemas":{"LivenessHeuristicDevice":{"type":"object","properties":{"deviceId":{"type":"string"},"watchlist":{"type":"boolean"},"timeout":{"type":"integer","format":"int64"},"tries":{"type":"integer","format":"int32"},"personCount":{"type":"integer","format":"int32"},"success":{"type":"integer","format":"int32"},"matchFails":{"type":"integer","format":"int32"},"livenessFails":{"type":"integer","format":"int32"}}}}}}
```

## Remove device

> Removes the device from the watchlist and clears related timeouts, restoring its normal use.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/liveness/heuristic/device/{deviceId}/watchlist":{"delete":{"tags":["liveness"],"operationId":"removeHeuristicDeviceWatchlistAndTimeout","summary":"Remove device","parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Removes the device from the watchlist and clears related timeouts, restoring its normal use."}}}}
```


# Notification

## getNotification

> Get a notification by its NGUID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notification/{nguid}":{"get":{"description":"Get a notification by its NGUID.","tags":["notification"],"operationId":"getNotification","summary":"getNotification","parameters":[{"name":"nguid","in":"path","required":true,"description":"Notification GUID.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleNotificationResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetNotificationErrorResponse"}}}}}}}},"components":{"schemas":{"SingleNotificationResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationObject"}}},"NotificationObject":{"type":"object","properties":{"operation":{"$ref":"#/components/schemas/NotificationOperationEnum","description":"Operation for TGUID."},"tguid":{"type":"string","format":"uuid","description":"Transaction GUID."},"newTguid":{"type":"string","format":"uuid","description":"New Transaction GUID, when it was edited during quality analysis."},"pguid":{"type":"string","format":"uuid","description":"Person GUID."},"enrollPguid":{"type":"string","format":"uuid","description":"Enroll Person GUID, when an exception treatment is performed."},"status":{"type":"string","description":"Status for TGUID."},"sender":{"type":"string","description":"Sender of the notification. `null` if the sender was GBDS."},"uguid":{"type":"string","format":"uuid","description":"UL GUID."},"treatment":{"type":"string","description":"Exception treatment."},"update":{"type":"boolean","description":"`true` if it is an update."},"trusted":{"type":"boolean","description":"On enrollment notifications, `true` if it is a trusted enroll."},"origin":{"type":"string","enum":["API","GBDS"],"description":"Indicates notification origin."},"additionalData":{"type":"object","description":"Map of strings with additional data.","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the notification transaction.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}},"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"timestamp":{"type":"integer","format":"int64"},"acks":{"description":"List of clients that have acknowledged the notification.","type":"array","items":{"type":"object","properties":{"client":{"type":"string","description":"Client name. Example: ETR, BEST."},"timestamp":{"type":"integer","format":"int64"},"comments":{"type":"string"}}}}}},"NotificationOperationEnum":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION"]},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}},"GetNotificationErrorResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object","properties":{"nguid":{"type":"string","format":"uuid"}}}}}}}}}}}
```

## listNotifications

> List notifications according to parameter filters.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notification":{"get":{"description":"List notifications according to parameter filters.","tags":["notification"],"operationId":"listNotifications","summary":"listNotifications","parameters":[{"name":"start","in":"query","required":false,"description":"Start date to filter notifications by timestamp. <br> Format: **yyyy-MM-dd-HH-mm-ss**. *(optional)*","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","required":false,"description":"End date to filter notifications by timestamp. <br> Format: **yyyy-MM-dd-HH-mm-ss**. *(optional)*","schema":{"type":"string","format":"date"}},{"name":"ackClient","in":"query","required":false,"description":"Return notifications that were acknowledged by this client. <br> If it starts with `!`, returns all notifications that WERE NOT not acknowledged by this client. *(optional)*","schema":{"type":"string"}},{"name":"tguid","in":"query","required":false,"description":"Filter notifications by TGUID. *(optional)*","schema":{"type":"string"}},{"name":"newTguid","in":"query","required":false,"description":"Filter notifications by new TGUID, when it was edited during quality analysis. *(optional)*","schema":{"type":"string"}},{"name":"pguid","in":"query","required":false,"description":"Filter notifications by PGUID. *(optional)*","schema":{"type":"string"}},{"name":"enrollPguid","in":"query","required":false,"description":"Filter notifications by enroll PGUID, when an exception treatment is performed. *(optional)*","schema":{"type":"string"}},{"name":"treatment","in":"query","required":false,"description":"Filter notifications by exception treatment. *(optional)*","schema":{"type":"string"}},{"name":"operation","in":"query","required":false,"description":"Filter notifications by operation. *(optional)* <br>\nThis parameter can be provided more than once to form a list.\n","schema":{"$ref":"#/components/schemas/NotificationOperationEnum"}},{"name":"status","in":"query","required":false,"description":"Filter notifications by status. *(optional)* <br>\nThis parameter can be provided more than once to form a list.\n","schema":{"type":"string"}},{"name":"sender","in":"query","required":false,"description":"Filter notifications by sender. *(optional)*","schema":{"type":"string"}},{"name":"uguid","in":"query","required":false,"description":"Filter notifications by UGUID (UL GUID). *(optional)*","schema":{"type":"string"}},{"name":"additionalData","in":"query","required":false,"description":"Filter notifications by additional data (any string inside of it). *(optional)*","schema":{"type":"string"}},{"name":"pageIndex","in":"query","required":false,"description":"Page index for pagination. Default: `0`. *(optional)*","schema":{"type":"integer"}},{"name":"pageSize","in":"query","required":false,"description":"Page size for pagination. Default: `20`. *(optional)*","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipleNotificationsResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListNotificationsErrorResponse"}}}}}}}},"components":{"schemas":{"NotificationOperationEnum":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION"]},"MultipleNotificationsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationObject"}},"pagination":{"type":"object","properties":{"total":{"type":"integer","description":"Total number of notifications with the given filters."},"count":{"type":"integer","description":"Number of notifications in the current page."},"pageSize":{"type":"integer","description":"Number of notifications per page."},"currentPage":{"type":"integer","description":"Current page number. Zero-based."},"totalPages":{"type":"integer","description":"Total number of pages. Starts at 1."}}}}},"NotificationObject":{"type":"object","properties":{"operation":{"$ref":"#/components/schemas/NotificationOperationEnum","description":"Operation for TGUID."},"tguid":{"type":"string","format":"uuid","description":"Transaction GUID."},"newTguid":{"type":"string","format":"uuid","description":"New Transaction GUID, when it was edited during quality analysis."},"pguid":{"type":"string","format":"uuid","description":"Person GUID."},"enrollPguid":{"type":"string","format":"uuid","description":"Enroll Person GUID, when an exception treatment is performed."},"status":{"type":"string","description":"Status for TGUID."},"sender":{"type":"string","description":"Sender of the notification. `null` if the sender was GBDS."},"uguid":{"type":"string","format":"uuid","description":"UL GUID."},"treatment":{"type":"string","description":"Exception treatment."},"update":{"type":"boolean","description":"`true` if it is an update."},"trusted":{"type":"boolean","description":"On enrollment notifications, `true` if it is a trusted enroll."},"origin":{"type":"string","enum":["API","GBDS"],"description":"Indicates notification origin."},"additionalData":{"type":"object","description":"Map of strings with additional data.","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the notification transaction.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}},"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"timestamp":{"type":"integer","format":"int64"},"acks":{"description":"List of clients that have acknowledged the notification.","type":"array","items":{"type":"object","properties":{"client":{"type":"string","description":"Client name. Example: ETR, BEST."},"timestamp":{"type":"integer","format":"int64"},"comments":{"type":"string"}}}}}},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}},"ListNotificationsErrorResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}
```

## getFinalNotificationByPguid

> Get the last notification with a final enroll status for a PGUID. Using the provided PGUID, this method will search for all notifications with operation \`ENROLL\` or \`DELETE\` and will return the last enroll notification. It may be: - Delete notification for PGUID - Last enrolled notification - Last enroll exception notification (not update) - Last pending enroll notification (not update)

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notification/final/{pguid}":{"get":{"description":"Get the last notification with a final enroll status for a PGUID. Using the provided PGUID, this method will search for all notifications with operation `ENROLL` or `DELETE` and will return the last enroll notification. It may be: - Delete notification for PGUID - Last enrolled notification - Last enroll exception notification (not update) - Last pending enroll notification (not update)","tags":["notification"],"operationId":"getFinalNotificationByPguid","summary":"getFinalNotificationByPguid","parameters":[{"name":"pguid","in":"path","required":true,"description":"Person GUID.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleNotificationResponse"}}}}}}}},"components":{"schemas":{"SingleNotificationResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationObject"}}},"NotificationObject":{"type":"object","properties":{"operation":{"$ref":"#/components/schemas/NotificationOperationEnum","description":"Operation for TGUID."},"tguid":{"type":"string","format":"uuid","description":"Transaction GUID."},"newTguid":{"type":"string","format":"uuid","description":"New Transaction GUID, when it was edited during quality analysis."},"pguid":{"type":"string","format":"uuid","description":"Person GUID."},"enrollPguid":{"type":"string","format":"uuid","description":"Enroll Person GUID, when an exception treatment is performed."},"status":{"type":"string","description":"Status for TGUID."},"sender":{"type":"string","description":"Sender of the notification. `null` if the sender was GBDS."},"uguid":{"type":"string","format":"uuid","description":"UL GUID."},"treatment":{"type":"string","description":"Exception treatment."},"update":{"type":"boolean","description":"`true` if it is an update."},"trusted":{"type":"boolean","description":"On enrollment notifications, `true` if it is a trusted enroll."},"origin":{"type":"string","enum":["API","GBDS"],"description":"Indicates notification origin."},"additionalData":{"type":"object","description":"Map of strings with additional data.","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the notification transaction.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}},"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"timestamp":{"type":"integer","format":"int64"},"acks":{"description":"List of clients that have acknowledged the notification.","type":"array","items":{"type":"object","properties":{"client":{"type":"string","description":"Client name. Example: ETR, BEST."},"timestamp":{"type":"integer","format":"int64"},"comments":{"type":"string"}}}}}},"NotificationOperationEnum":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION"]},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```

## getFinalNotificationByTguid

> Get the last notification with a final enroll status for a PGUID related to a TGUID. Using the provided TGUID, this method will get a PGUID related to it and then search for all notifications with operation \`ENROLL\` or \`DELETE\`. Then, it will return the last enroll notification. It may be: - Delete notification for PGUID - Last enrolled notification - Last enroll exception notification (not update) - Last pending enroll notification (not update)

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notification/final/tguid/{tguid}":{"get":{"description":"Get the last notification with a final enroll status for a PGUID related to a TGUID. Using the provided TGUID, this method will get a PGUID related to it and then search for all notifications with operation `ENROLL` or `DELETE`. Then, it will return the last enroll notification. It may be: - Delete notification for PGUID - Last enrolled notification - Last enroll exception notification (not update) - Last pending enroll notification (not update)","tags":["notification"],"operationId":"getFinalNotificationByTguid","summary":"getFinalNotificationByTguid","parameters":[{"name":"tguid","in":"path","required":true,"description":"Transaction GUID.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleNotificationResponse"}}}}}}}},"components":{"schemas":{"SingleNotificationResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationObject"}}},"NotificationObject":{"type":"object","properties":{"operation":{"$ref":"#/components/schemas/NotificationOperationEnum","description":"Operation for TGUID."},"tguid":{"type":"string","format":"uuid","description":"Transaction GUID."},"newTguid":{"type":"string","format":"uuid","description":"New Transaction GUID, when it was edited during quality analysis."},"pguid":{"type":"string","format":"uuid","description":"Person GUID."},"enrollPguid":{"type":"string","format":"uuid","description":"Enroll Person GUID, when an exception treatment is performed."},"status":{"type":"string","description":"Status for TGUID."},"sender":{"type":"string","description":"Sender of the notification. `null` if the sender was GBDS."},"uguid":{"type":"string","format":"uuid","description":"UL GUID."},"treatment":{"type":"string","description":"Exception treatment."},"update":{"type":"boolean","description":"`true` if it is an update."},"trusted":{"type":"boolean","description":"On enrollment notifications, `true` if it is a trusted enroll."},"origin":{"type":"string","enum":["API","GBDS"],"description":"Indicates notification origin."},"additionalData":{"type":"object","description":"Map of strings with additional data.","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the notification transaction.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}},"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"timestamp":{"type":"integer","format":"int64"},"acks":{"description":"List of clients that have acknowledged the notification.","type":"array","items":{"type":"object","properties":{"client":{"type":"string","description":"Client name. Example: ETR, BEST."},"timestamp":{"type":"integer","format":"int64"},"comments":{"type":"string"}}}}}},"NotificationOperationEnum":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION"]},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```

## trackNotificationsByPguid

> Get all notifications related to a PGUID. Using the provided PGUID, this method will return all notifications for the PGUID and associated to it by TGUID, PGUID, newTguid, and enrollPguid.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notification/trackPguid/{pguid}":{"get":{"description":"Get all notifications related to a PGUID. Using the provided PGUID, this method will return all notifications for the PGUID and associated to it by TGUID, PGUID, newTguid, and enrollPguid.","tags":["notification"],"operationId":"trackNotificationsByPguid","summary":"trackNotificationsByPguid","parameters":[{"name":"pguid","in":"path","required":true,"description":"Person GUID.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipleNotificationsResponse"}}}}}}}},"components":{"schemas":{"MultipleNotificationsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationObject"}},"pagination":{"type":"object","properties":{"total":{"type":"integer","description":"Total number of notifications with the given filters."},"count":{"type":"integer","description":"Number of notifications in the current page."},"pageSize":{"type":"integer","description":"Number of notifications per page."},"currentPage":{"type":"integer","description":"Current page number. Zero-based."},"totalPages":{"type":"integer","description":"Total number of pages. Starts at 1."}}}}},"NotificationObject":{"type":"object","properties":{"operation":{"$ref":"#/components/schemas/NotificationOperationEnum","description":"Operation for TGUID."},"tguid":{"type":"string","format":"uuid","description":"Transaction GUID."},"newTguid":{"type":"string","format":"uuid","description":"New Transaction GUID, when it was edited during quality analysis."},"pguid":{"type":"string","format":"uuid","description":"Person GUID."},"enrollPguid":{"type":"string","format":"uuid","description":"Enroll Person GUID, when an exception treatment is performed."},"status":{"type":"string","description":"Status for TGUID."},"sender":{"type":"string","description":"Sender of the notification. `null` if the sender was GBDS."},"uguid":{"type":"string","format":"uuid","description":"UL GUID."},"treatment":{"type":"string","description":"Exception treatment."},"update":{"type":"boolean","description":"`true` if it is an update."},"trusted":{"type":"boolean","description":"On enrollment notifications, `true` if it is a trusted enroll."},"origin":{"type":"string","enum":["API","GBDS"],"description":"Indicates notification origin."},"additionalData":{"type":"object","description":"Map of strings with additional data.","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the notification transaction.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}},"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"timestamp":{"type":"integer","format":"int64"},"acks":{"description":"List of clients that have acknowledged the notification.","type":"array","items":{"type":"object","properties":{"client":{"type":"string","description":"Client name. Example: ETR, BEST."},"timestamp":{"type":"integer","format":"int64"},"comments":{"type":"string"}}}}}},"NotificationOperationEnum":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION"]},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```

## trackNotificationsByTguid

> Get all notifications related to a TGUID. Using the provided TGUID, this method will return all notifications for the TGUID and associated to it by PGUID, newTguid, and enrollPguid.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notification/trackTguid/{tguid}":{"get":{"description":"Get all notifications related to a TGUID. Using the provided TGUID, this method will return all notifications for the TGUID and associated to it by PGUID, newTguid, and enrollPguid.","tags":["notification"],"operationId":"trackNotificationsByTguid","summary":"trackNotificationsByTguid","parameters":[{"name":"tguid","in":"path","required":true,"description":"Transaction GUID.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipleNotificationsResponse"}}}}}}}},"components":{"schemas":{"MultipleNotificationsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationObject"}},"pagination":{"type":"object","properties":{"total":{"type":"integer","description":"Total number of notifications with the given filters."},"count":{"type":"integer","description":"Number of notifications in the current page."},"pageSize":{"type":"integer","description":"Number of notifications per page."},"currentPage":{"type":"integer","description":"Current page number. Zero-based."},"totalPages":{"type":"integer","description":"Total number of pages. Starts at 1."}}}}},"NotificationObject":{"type":"object","properties":{"operation":{"$ref":"#/components/schemas/NotificationOperationEnum","description":"Operation for TGUID."},"tguid":{"type":"string","format":"uuid","description":"Transaction GUID."},"newTguid":{"type":"string","format":"uuid","description":"New Transaction GUID, when it was edited during quality analysis."},"pguid":{"type":"string","format":"uuid","description":"Person GUID."},"enrollPguid":{"type":"string","format":"uuid","description":"Enroll Person GUID, when an exception treatment is performed."},"status":{"type":"string","description":"Status for TGUID."},"sender":{"type":"string","description":"Sender of the notification. `null` if the sender was GBDS."},"uguid":{"type":"string","format":"uuid","description":"UL GUID."},"treatment":{"type":"string","description":"Exception treatment."},"update":{"type":"boolean","description":"`true` if it is an update."},"trusted":{"type":"boolean","description":"On enrollment notifications, `true` if it is a trusted enroll."},"origin":{"type":"string","enum":["API","GBDS"],"description":"Indicates notification origin."},"additionalData":{"type":"object","description":"Map of strings with additional data.","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the notification transaction.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}},"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"timestamp":{"type":"integer","format":"int64"},"acks":{"description":"List of clients that have acknowledged the notification.","type":"array","items":{"type":"object","properties":{"client":{"type":"string","description":"Client name. Example: ETR, BEST."},"timestamp":{"type":"integer","format":"int64"},"comments":{"type":"string"}}}}}},"NotificationOperationEnum":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION"]},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```

## acknowledgeNotification

> Acknowledge a notification, indicating that the client has processed it. This endpoint can be called even if the notification is already acknowledged. The notification will store the timestamp of acknowledgment and its comments.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notification/ack":{"put":{"description":"Acknowledge a notification, indicating that the client has processed it. This endpoint can be called even if the notification is already acknowledged. The notification will store the timestamp of acknowledgment and its comments.","tags":["notification"],"operationId":"acknowledgeNotification","summary":"acknowledgeNotification","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcknowledgeNotificationRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcknowledgeNotificationErrorResponse"}}}}},"parameters":[]}}},"components":{"schemas":{"AcknowledgeNotificationRequest":{"type":"object","properties":{"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"client":{"type":"string","description":"Name of the client that is acknowledging the notification. Example: ETR, BEST."},"comments":{"type":"string","description":"Comments from the client about the notification. *(optional)*"}}},"AcknowledgeNotificationErrorResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object","properties":{"nguid":{"type":"string","format":"uuid"}}}}}}}}}}}
```

## acknowledgeNotificationByTguid

> Acknowledge all notifications related to a TGUID, indicating that the client has processed them. This endpoint can be called even if the notifications are already acknowledged. The notifications will store the timestamp of acknowledgment and the same comments.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/notification/ack/tguid":{"put":{"description":"Acknowledge all notifications related to a TGUID, indicating that the client has processed them. This endpoint can be called even if the notifications are already acknowledged. The notifications will store the timestamp of acknowledgment and the same comments.","tags":["notification"],"operationId":"acknowledgeNotificationByTguid","summary":"acknowledgeNotificationByTguid","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcknowledgeNotificationByTguidRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipleNotificationsResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcknowledgeNotificationErrorResponse"}}}}},"parameters":[]}}},"components":{"schemas":{"AcknowledgeNotificationByTguidRequest":{"type":"object","properties":{"tguid":{"type":"string","format":"uuid","description":"Notification GUID."},"client":{"type":"string","description":"Name of the client that is acknowledging the notification. Example: ETR, BEST."},"comments":{"type":"string","description":"Comments from the client about the notification. *(optional)*"}}},"MultipleNotificationsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationObject"}},"pagination":{"type":"object","properties":{"total":{"type":"integer","description":"Total number of notifications with the given filters."},"count":{"type":"integer","description":"Number of notifications in the current page."},"pageSize":{"type":"integer","description":"Number of notifications per page."},"currentPage":{"type":"integer","description":"Current page number. Zero-based."},"totalPages":{"type":"integer","description":"Total number of pages. Starts at 1."}}}}},"NotificationObject":{"type":"object","properties":{"operation":{"$ref":"#/components/schemas/NotificationOperationEnum","description":"Operation for TGUID."},"tguid":{"type":"string","format":"uuid","description":"Transaction GUID."},"newTguid":{"type":"string","format":"uuid","description":"New Transaction GUID, when it was edited during quality analysis."},"pguid":{"type":"string","format":"uuid","description":"Person GUID."},"enrollPguid":{"type":"string","format":"uuid","description":"Enroll Person GUID, when an exception treatment is performed."},"status":{"type":"string","description":"Status for TGUID."},"sender":{"type":"string","description":"Sender of the notification. `null` if the sender was GBDS."},"uguid":{"type":"string","format":"uuid","description":"UL GUID."},"treatment":{"type":"string","description":"Exception treatment."},"update":{"type":"boolean","description":"`true` if it is an update."},"trusted":{"type":"boolean","description":"On enrollment notifications, `true` if it is a trusted enroll."},"origin":{"type":"string","enum":["API","GBDS"],"description":"Indicates notification origin."},"additionalData":{"type":"object","description":"Map of strings with additional data.","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the notification transaction.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}},"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"timestamp":{"type":"integer","format":"int64"},"acks":{"description":"List of clients that have acknowledged the notification.","type":"array","items":{"type":"object","properties":{"client":{"type":"string","description":"Client name. Example: ETR, BEST."},"timestamp":{"type":"integer","format":"int64"},"comments":{"type":"string"}}}}}},"NotificationOperationEnum":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION"]},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}},"AcknowledgeNotificationErrorResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object","properties":{"nguid":{"type":"string","format":"uuid"}}}}}}}}}}}
```


# Organization

## List organizations

> Retrieves a list of all organizations. Each organization includes a \`name\`, an optional \`parent\` identifying its parent organization (forming a hierarchy), and a \`description\`. Returns \*\*200 OK\*\* with a list of organizations in the response body.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/organizations":{"get":{"tags":["organization"],"operationId":"list_3","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListOrganizationsResponse"}}}}},"description":"Retrieves a list of all organizations. Each organization includes a `name`, an optional `parent` identifying its parent organization (forming a hierarchy), and a `description`. Returns **200 OK** with a list of organizations in the response body.","parameters":[],"summary":"List organizations"}}},"components":{"schemas":{"ListOrganizationsResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Organization"}}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}}}}}
```

## Create or update organizations

> Creates a new organization or updates an existing one. The request body includes the organization's \`name\`, optional \`description\`, and optional \`parent\` indicating the parent organization. A successful creation returns \*\*201 Created\*\*, while updating an existing organization returns \*\*202 Accepted\*\*.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/organizations":{"post":{"tags":["organization"],"operationId":"save","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}},"required":true},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"202":{"description":"Accepted","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Creates a new organization or updates an existing one. The request body includes the organization's `name`, optional `description`, and optional `parent` indicating the parent organization. A successful creation returns **201 Created**, while updating an existing organization returns **202 Accepted**.","parameters":[],"summary":"Create or update organizations"}}},"components":{"schemas":{"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}}}}}
```

## Get organization

> Retrieves a single organization by its \`name\`. The \`name\` path parameter uniquely identifies the organization. The response includes the organization's \`name\`, optional \`parent\`, and \`description\` fields and returns \*\*200 OK\*\* when found.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/organizations/{name}":{"get":{"tags":["organization"],"operationId":"get_6","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}}},"description":"Retrieves a single organization by its `name`. The `name` path parameter uniquely identifies the organization. The response includes the organization's `name`, optional `parent`, and `description` fields and returns **200 OK** when found.","summary":"Get organization"}}},"components":{"schemas":{"OrganizationResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"$ref":"#/components/schemas/Organization"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}}}}}
```

## Delete organization

> Deletes an organization identified by the \`name\` path parameter. On successful deletion, returns \*\*204 No Content\*\*.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/organizations/{name}":{"delete":{"tags":["organization"],"operationId":"delete_2","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"NO CONTENT (deleted)","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Deletes an organization identified by the `name` path parameter. On successful deletion, returns **204 No Content**.","summary":"Delete organization"}}}}
```


# Key Format

## List key formats

> Returns all configured key formats used by API-side key validation. Each item describes a \`keyId\` and its constraints: \`formatType\` (\`CPF\`, \`TITULO\`, \`REGEX\`, \`ALPHANUMERIC\`, \`ALPHABETIC\`, \`NUMERIC\`), optional \`regex\` (when \`formatType=REGEX\`), and optional \`minLength\`/\`maxLength\`. Use this endpoint to inspect which formats are currently enforced by the API during enroll/update when key-format validation is enabled.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/keyFormat":{"get":{"tags":["key-format"],"operationId":"list_7","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListKeyFormatResponse"}}}}},"description":"Returns all configured key formats used by API-side key validation. Each item describes a `keyId` and its constraints: `formatType` (`CPF`, `TITULO`, `REGEX`, `ALPHANUMERIC`, `ALPHABETIC`, `NUMERIC`), optional `regex` (when `formatType=REGEX`), and optional `minLength`/`maxLength`. Use this endpoint to inspect which formats are currently enforced by the API during enroll/update when key-format validation is enabled.","parameters":[],"summary":"List key formats"}}},"components":{"schemas":{"ListKeyFormatResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"type":"array","items":{"$ref":"#/components/schemas/KeyFormat"}}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"KeyFormat":{"type":"object","properties":{"keyId":{"type":"string"},"formatType":{"type":"string","enum":["TITULO","CPF","ALPHANUMERIC","NUMERIC","ALPHABETIC","REGEX"]},"regex":{"type":"string"},"minLength":{"type":"integer","format":"int32"},"maxLength":{"type":"integer","format":"int32"}}}}}}
```

## Create or update key formats

> Creates or updates one or more key-format definitions. Required fields are \`keyId\` and \`formatType\`. When \`formatType=REGEX\`, the \`regex\` field is required. \`minLength\` and \`maxLength\` are optional. Newly created definitions return \*\*201 Created\*\*, while existing definitions return \*\*202 Accepted\*\*. These formats are used when key-format validation is enabled for enroll/update.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/keyFormat":{"post":{"tags":["key-format"],"operationId":"save_1","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyFormat"}}},"required":true},"responses":{"201":{"description":"CREATED","content":{"application/json":{"schema":{"type":"object"}}}},"202":{"description":"ACCEPTED","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Creates or updates one or more key-format definitions. Required fields are `keyId` and `formatType`. When `formatType=REGEX`, the `regex` field is required. `minLength` and `maxLength` are optional. Newly created definitions return **201 Created**, while existing definitions return **202 Accepted**. These formats are used when key-format validation is enabled for enroll/update.","parameters":[],"summary":"Create or update key formats"}}},"components":{"schemas":{"KeyFormat":{"type":"object","properties":{"keyId":{"type":"string"},"formatType":{"type":"string","enum":["TITULO","CPF","ALPHANUMERIC","NUMERIC","ALPHABETIC","REGEX"]},"regex":{"type":"string"},"minLength":{"type":"integer","format":"int32"},"maxLength":{"type":"integer","format":"int32"}}}}}}
```

## Get key format

> Retrieves the configured key-format definition for a specific \`keyId\`. The response includes the \`formatType\` and any additional constraints (\`regex\`, \`minLength\`, \`maxLength\`). Use this to validate client payloads against server-side requirements and to understand how a specific key will be checked during enroll/update.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/keyFormat/{keyId}":{"get":{"tags":["key-format"],"operationId":"get_10","parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyFormatResponse"}}}}},"description":"Retrieves the configured key-format definition for a specific `keyId`. The response includes the `formatType` and any additional constraints (`regex`, `minLength`, `maxLength`). Use this to validate client payloads against server-side requirements and to understand how a specific key will be checked during enroll/update.","summary":"Get key format"}}},"components":{"schemas":{"KeyFormatResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"$ref":"#/components/schemas/KeyFormat"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"KeyFormat":{"type":"object","properties":{"keyId":{"type":"string"},"formatType":{"type":"string","enum":["TITULO","CPF","ALPHANUMERIC","NUMERIC","ALPHABETIC","REGEX"]},"regex":{"type":"string"},"minLength":{"type":"integer","format":"int32"},"maxLength":{"type":"integer","format":"int32"}}}}}}
```

## Delete key format

> Deletes the key-format definition for the given \`keyId\`. If the format exists and is removed, server-side validation for that key will no longer be applied (unless the format is re-added). Returns \*\*204 No Content\*\* on success.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/keyFormat/{keyId}":{"delete":{"tags":["key-format"],"operationId":"delete_3","parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"NO CONTENT (deleted)","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Deletes the key-format definition for the given `keyId`. If the format exists and is removed, server-side validation for that key will no longer be applied (unless the format is re-added). Returns **204 No Content** on success.","summary":"Delete key format"}}}}
```

## Validate keys (oneKeyOnly + format)

> Validates a list of keys according to the active key-validation settings. When the \`oneKeyOnly\` setting is enabled, payloads containing more than one key are rejected. When the \`keyFormat\` setting is enabled, each key must satisfy its configured \`key\_format\` rules (\`formatType\`, \`regex\`, \`minLength\`, \`maxLength\`). The endpoint returns \*\*200 OK\*\* if all validations pass, or \*\*400 Bad Request\*\* if any rule is violated. Use this to pre-check client requests before enroll/update.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/keyFormat/validate":{"post":{"tags":["key-format"],"operationId":"validate","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Key"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"BAD REQUEST","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Validates a list of keys according to the active key-validation settings. When the `oneKeyOnly` setting is enabled, payloads containing more than one key are rejected. When the `keyFormat` setting is enabled, each key must satisfy its configured `key_format` rules (`formatType`, `regex`, `minLength`, `maxLength`). The endpoint returns **200 OK** if all validations pass, or **400 Bad Request** if any rule is violated. Use this to pre-check client requests before enroll/update.","parameters":[],"summary":"Validate keys (oneKeyOnly + format)"}}},"components":{"schemas":{"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}}}}}
```

## Validate a single key value

> Validates a single key value against its configured format outside of the enroll/update flow. It returns \*\*200 OK\*\* if the value passes all checks (format type, regex pattern, and optional length constraints) or \*\*400 Bad Request\*\* with \`type=VALIDATION\_ERROR\` and \`code=INVALID\_KEY\` if validation fails. This endpoint only evaluates a single \`(keyId, keyValue)\` pair and does not modify state.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/keyFormat/validate/{keyId}/{keyValue}":{"get":{"tags":["key-format"],"operationId":"validate_1","parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"string"}},{"name":"keyValue","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"BAD REQUEST","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["VALIDATION_ERROR"]},"code":{"type":"string","enum":["INVALID_KEY"]},"message":{"type":"string"}}}}}}}}}},"description":"Validates a single key value against its configured format outside of the enroll/update flow. It returns **200 OK** if the value passes all checks (format type, regex pattern, and optional length constraints) or **400 Bad Request** with `type=VALIDATION_ERROR` and `code=INVALID_KEY` if validation fails. This endpoint only evaluates a single `(keyId, keyValue)` pair and does not modify state.","summary":"Validate a single key value"}}}}
```

## Validate keys for potential inconsistencies

> Checks a list of keys for inconsistencies that would invalidate an update/enroll under the \`inconsistentKeys\` setting. Inconsistent cases include multiple keys matching different existing people or a payload key that matches an existing person while another key of the same \`id\` has a different value. The endpoint returns \*\*200 OK\*\* if the keys are consistent, or \*\*400 Bad Request\*\* when inconsistencies are detected.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/keyFormat/validate/inconsistentKeys":{"post":{"tags":["key-format"],"operationId":"validateInconsistentKeys","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Key"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"BAD REQUEST","content":{"application/json":{"schema":{"type":"object"}}}}},"description":"Checks a list of keys for inconsistencies that would invalidate an update/enroll under the `inconsistentKeys` setting. Inconsistent cases include multiple keys matching different existing people or a payload key that matches an existing person while another key of the same `id` has a different value. The endpoint returns **200 OK** if the keys are consistent, or **400 Bad Request** when inconsistencies are detected.","parameters":[],"summary":"Validate keys for potential inconsistencies"}}},"components":{"schemas":{"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}}}}}
```


# Extraction

## Extract biometric template

> Performs extraction of biometric characteristics from a raw sample (image, fingerprint, etc.) sent in the request body, returning the biometric template and metadata.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/extract":{"post":{"tags":["extraction"],"operationId":"extract","summary":"Extract biometric template","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionResponse"}}}}},"description":"Performs extraction of biometric characteristics from a raw sample (image, fingerprint, etc.) sent in the request body, returning the biometric template and metadata.","parameters":[]}}},"components":{"schemas":{"ExtractionRequest":{"type":"object","properties":{"verify":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Person"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ExtractionResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Person"}}}}}}
```

## Extract biometric template (with quality indices)

> Extracts the biometric template and calculates quality indices for the provided sample, returning both for evaluation before use in comparisons.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/extract/quality":{"post":{"tags":["extraction"],"operationId":"extractQuality","summary":"Extract biometric template (with quality indices)","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionResponse"}}}}},"description":"Extracts the biometric template and calculates quality indices for the provided sample, returning both for evaluation before use in comparisons.","parameters":[]}}},"components":{"schemas":{"ExtractionRequest":{"type":"object","properties":{"verify":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Person"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ExtractionResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Person"}}}}}}
```


# Models

## The ValidationError object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## The ProcessingError object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## The InternalError object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## The SecurityError object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SecurityError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["SECURITY_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["INVALID_CREDENTIALS","INVALID_TOKEN","INVALID_AUTHORIZATION_SCHEMA","MISSING_TOKEN","UNKNOWN_LOGIN_ERROR","UNKNOWN_TOKEN_ERROR","EXPIRED_TOKEN","UNAUTHORIZED_ACCESS"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## The CreateTokenRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreateTokenRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"grantType":{"description":"How the token will be generated. To generate a new token from user credentials, use grantType =  CREDENTIALS. To generate a new token using a currently valid token, use grantType = TOKEN.","type":"string","enum":["CREDENTIALS","TOKEN"]},"userName":{"description":"User ID.","type":"string"},"userPassword":{"description":"User password.","type":"string"},"token":{"description":"Currently valid token to be used for the token renewal process.","type":"string"}}}}}}}}
```

## The CreateTokenResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreateTokenResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"token":{"description":"Currently valid token to be used for the token renewal process.","type":"string"},"expirationTime":{"description":"Expiration time of the token in milliseconds.","type":"integer","format":"int64"},"ttl":{"description":"Token's time to live in milliseconds.","type":"integer","format":"int64"}}}}}}}}
```

## The BiometricMatch object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}}}}}
```

## The BiometricMatchBob object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}}}}}
```

## The Exception object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}}}}}
```

## The ExceptionAnalysis object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}}}}}
```

## The GetExceptionsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetExceptionsResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Exception"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}}}}}
```

## The Match object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}}}}}
```

## The MatchBob object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}}}}}
```

## The Minutiae object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}}}}}
```

## The ListExceptionsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListExceptionsResponse":{"type":"object","properties":{"data":{"description":"List of exceptions that matched the search criteria.","type":"array","items":{"allOf":[{"type":"object","properties":{"match":{"$ref":"#/components/schemas/MatchBob"}}},{"$ref":"#/components/schemas/Exception"}]}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}}}}}
```

## The Pagination object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}}}}}
```

## The PaginationOff object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"PaginationOff":{"type":"object","properties":{"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"}}}}}}
```

## The TreatExceptionsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}}}}}
```

## The ExceptionTreatment object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ExceptionTreatment":{"type":"object","properties":{"enrollTguid":{"description":"TGUID of transaction that created the exception.","type":"string"},"exceptionPguid":{"description":"PGUID of the person that was matched to create the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"referenceIndexes":{"description":"List of biometric indexes. Specifies which biometric from the Update transaction should be used to update the Person.","type":"array","items":{"type":"integer","format":"int32"}}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}}}}}
```

## The Meta object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Meta":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"discardReference":{"type":"boolean"}}}}}}
```

## The TreatExceptionsRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TreatExceptionsRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ExceptionTreatment"},"meta":{"$ref":"#/components/schemas/Meta"}}},"ExceptionTreatment":{"type":"object","properties":{"enrollTguid":{"description":"TGUID of transaction that created the exception.","type":"string"},"exceptionPguid":{"description":"PGUID of the person that was matched to create the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"referenceIndexes":{"description":"List of biometric indexes. Specifies which biometric from the Update transaction should be used to update the Person.","type":"array","items":{"type":"integer","format":"int32"}}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Meta":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"discardReference":{"type":"boolean"}}}}}}
```

## The JsonNotification object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"JsonNotification":{"type":"object","properties":{"operation":{"description":"Operation type of the transaction that notification is related to.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]},"tguid":{"description":"Transaction's global unique ID of the transaction that notification is related to.","type":"string"},"status":{"description":"Current status of the transaction that notification is related to.","type":"string"},"sender":{"description":"The notification sender.","type":"string"},"uguid":{"description":"Global unique ID of an unsolved latent. Only used when the notification is related to a transaction that treats an unsolved latent.","type":"string"},"additionalData":{"description":"Map used to add custom information inside the notification that will be delivered to notifier endpoint.","type":"object","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the main transaction that notification is related to.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}}}},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```

## The NotifyRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotifyRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/JsonNotification"}}},"JsonNotification":{"type":"object","properties":{"operation":{"description":"Operation type of the transaction that notification is related to.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]},"tguid":{"description":"Transaction's global unique ID of the transaction that notification is related to.","type":"string"},"status":{"description":"Current status of the transaction that notification is related to.","type":"string"},"sender":{"description":"The notification sender.","type":"string"},"uguid":{"description":"Global unique ID of an unsolved latent. Only used when the notification is related to a transaction that treats an unsolved latent.","type":"string"},"additionalData":{"description":"Map used to add custom information inside the notification that will be delivered to notifier endpoint.","type":"object","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the main transaction that notification is related to.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}}}},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```

## The PersonRelatedTransaction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```

## The Biographic object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}}}}}
```

## The BioBaseBiographic object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"BioBaseBiographic":{"type":"object","properties":{"id":{"type":"string","description":"Biographic key."},"type":{"type":"string","description":"Biographic type. It can be TEXT or FACE.","enum":["TEXT","FACE"]},"value":{"type":"string","description":"Biographic value. Faces are encoded in Base64."}}}}}}
```

## The Biometric object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}}}}}
```

## The ORIGINAL object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}}}}}
```

## The TEMPLATE object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}}}}}
```

## The CONSOLIDATED\_TEMPLATE object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}}}}}
```

## The BiometricProperties object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}}}}}
```

## The BiometricValidation object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"BiometricValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"validationType":{"description":"Defines the type of biometric validation to be performed against the AFIS.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"externalIDs":{"description":"List of externalIDs related to this transaction.","type":"array","items":{"$ref":"#/components/schemas/ExternalID"}},"labels":{"type":"string","enum":["ACCUMULATE","REPLACE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}}}}}
```

## The UpdateBiometricValidation object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdateBiometricValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the update operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"validationType":{"description":"Defines the type of biometric validation to be performed against the AFIS.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"externalIDs":{"description":"List of externalIDs related to this transaction.","type":"array","items":{"$ref":"#/components/schemas/ExternalID"}},"labels":{"type":"string","enum":["ACCUMULATE","REPLACE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"},"forceBoB":{"$ref":"#/components/schemas/ForceBobFlag"}}},"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}},"ForceBobFlag":{"type":"boolean","description":"Forces the use of Best of Biometrics (BoB).\n\nIf set to `true`, a trusted updated will be performed immediately after the update using the best biometric data available. <br>\nIf set to `false`, or absent, no action will be performed.\n\nAlso, the trusted update will only be performed if the update status is `ENROLLED`. Otherwise:\n- If the update status is `PENDING` (MIR), the trusted update will be performed only after the quality approval, if approved.\n- If the update status is `EXCEPTION` (ETR), the trusted update will be performed only after the exception is treated, if approved.\n\nIf the BoB trusted update is successfully performed (response 201 Enrolled), the response will contain some additional information:\n- `bobTguid`: transaction GUID of the BoB trusted update.\n- `bobStatus`: enroll status of the BoB trusted update. Usually `ENQUEUED`.\n\nThis behavior can be turned on/off using the RDB configuration on the table `gbds.settings`: <br>\n**gbds.bestOfBiometrics.forceUsingTrustedUpdate.enabled**, type **API**, default **true**.\n"}}}}
```

## The ExternalID object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}}}}}
```

## The History object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The HistoryEvent object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The Key object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}}}}}
```

## The ReplaceKey object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ReplaceKey":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"},"newValue":{"description":"New value of entity identifier.","type":"string"}}}}}}
```

## The Person object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]}}}}
```

## The PersonRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}}}}}
```

## The UpdatePeopleRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdatePeopleRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/UpdateBiometricValidation"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"UpdateBiometricValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the update operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"validationType":{"description":"Defines the type of biometric validation to be performed against the AFIS.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"externalIDs":{"description":"List of externalIDs related to this transaction.","type":"array","items":{"$ref":"#/components/schemas/ExternalID"}},"labels":{"type":"string","enum":["ACCUMULATE","REPLACE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"},"forceBoB":{"$ref":"#/components/schemas/ForceBobFlag"}}},"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}},"ForceBobFlag":{"type":"boolean","description":"Forces the use of Best of Biometrics (BoB).\n\nIf set to `true`, a trusted updated will be performed immediately after the update using the best biometric data available. <br>\nIf set to `false`, or absent, no action will be performed.\n\nAlso, the trusted update will only be performed if the update status is `ENROLLED`. Otherwise:\n- If the update status is `PENDING` (MIR), the trusted update will be performed only after the quality approval, if approved.\n- If the update status is `EXCEPTION` (ETR), the trusted update will be performed only after the exception is treated, if approved.\n\nIf the BoB trusted update is successfully performed (response 201 Enrolled), the response will contain some additional information:\n- `bobTguid`: transaction GUID of the BoB trusted update.\n- `bobStatus`: enroll status of the BoB trusted update. Usually `ENQUEUED`.\n\nThis behavior can be turned on/off using the RDB configuration on the table `gbds.settings`: <br>\n**gbds.bestOfBiometrics.forceUsingTrustedUpdate.enabled**, type **API**, default **true**.\n"}}}}
```

## The EnrollResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"EnrollResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED"]},"tguid":{"description":"Global unique id of the transaction.","type":"string"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"},"bobTguid":{"description":"[Optional] Transaction GUID of the BoB trusted update.\n\n(returned only for **201 Enrolled** responses when a BoB trusted update is successfully performed)\n","type":"string"},"bobStatus":{"description":"[Optional] Enroll status of the BoB trusted update. Usually `ENQUEUED`.\n\n(returned only for **201 Enrolled** responses when a BoB trusted update is successfully performed)\n","type":"string"}}}}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]}}}}
```

## The GetPeopleResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetPeopleResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Person"},{"type":"object","properties":{"biometric":{"type":"array","items":{"type":"object","properties":{"tguid":{"type":"string","format":"uuid","description":"GUID of the Transaction that contains the biometric data.\n\n*Returned only on calls with Best of Biometrics (BoB) enabled.*\n"}}}}}}]}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]}}}}
```

## The CreatePeopleRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreatePeopleRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/BiometricValidation"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"validationType":{"description":"Defines the type of biometric validation to be performed against the AFIS.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"externalIDs":{"description":"List of externalIDs related to this transaction.","type":"array","items":{"$ref":"#/components/schemas/ExternalID"}},"labels":{"type":"string","enum":["ACCUMULATE","REPLACE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}}}}}
```

## The ListPeopleRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListPeopleRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"personFields":{"description":"Defines the return information.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["BIOMETRIC","AUXILIARIES","KEYS","BIOGRAPHICS","LABELS","METADATA","BASIC_FIELDS","NO_FIELDS","ALL_FIELDS"]}},"pguids":{"description":"This field is a array of PGUIDs.","type":"array","items":{"type":"string"}},"pageIndex":{"description":"Used for paging the result. Given the list, A, of matched People; pageIndex determines which page of A, of size pageSize, to be returned in the response.","type":"integer","format":"int64","default":0},"pageSize":{"description":"Number of people, starting from first, to be returned in the response.","type":"integer","default":20},"restrictions":{"$ref":"#/components/schemas/Restrictions"},"operator":{"deprecated":true,"description":"Logical operator used in the request.\n\n**IMPORTANT:** The data->`operator` field is no longer supported from GBDS API version 5.0.0 onwards. Requests including it will return a 400 Bad Request error. Instead, use the `AND` and `OR` restriction operators in the data->`restrictions` array.\n\n**IMPORTANT:** The `OR` operator is no longer supported from GBDS API version 4.7.4 onwards. Requests including it will return a 400 Bad Request error.\n","type":"string","enum":["AND"]},"includeAnomalies":{"description":"Whether to match People with anomalies.","type":"boolean","default":false},"paginationCount":{"description":"Defines if total count on pagination will be on or off. It overwrites the value of gbds.peopleList.countFromRDB setting in the configuration file.","type":"boolean","default":true},"biographicBase":{"description":"Determines if the API will try to get biographics from the Biobase Server or not.","type":"boolean"},"indexes":{"description":"List of indexes to be returned. The list may contain only one index. If a provided index does not exist, it will be ignored.","type":"array","items":{"type":"integer"}},"startDate":{"description":"Start time. Must be in milliseconds.","type":"string","format":"date"},"endDate":{"description":"End time. Must be in milliseconds.","type":"string","format":"date"}}}}},"Restrictions":{"description":"<br> **Array of restrictions** to be applied to the search.\n\nSearch restriction types: `BIOGRAPHIC`, `KEY`, `LABEL`, `AND`, `OR`.\n\n**Note:** In the `AND` and `OR` restriction operators, the property `restrictions` recursively accepts *arrays of restrictions* following this same structure. See example in the *Request samples*.\n\n**IMPORTANT:** The **DATE** restriction is no longer supported from GBDS API version 5.0.0 onwards. Instead, use the fields data->`startDate` and data->`endDate`.\n","type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/RestrictionBiographic"},{"$ref":"#/components/schemas/RestrictionKey"},{"$ref":"#/components/schemas/RestrictionLabel"},{"$ref":"#/components/schemas/RestrictionAnd"},{"$ref":"#/components/schemas/RestrictionOr"},{"$ref":"#/components/schemas/RestrictionDate"}]}},"RestrictionBiographic":{"title":"BIOGRAPHIC","type":"object","properties":{"type":{"description":"Value MUST be `BIOGRAPHIC`.","type":"string","default":"BIOGRAPHIC"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionKey":{"title":"KEY","type":"object","properties":{"type":{"description":"Value MUST be `KEY`.","type":"string","default":"KEY"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionLabel":{"title":"LABEL","type":"object","properties":{"type":{"description":"Value MUST be `LABEL`.","type":"string","default":"LABEL"},"label":{"type":"string"},"exists":{"type":"boolean"}}},"RestrictionAnd":{"title":"AND","type":"object","properties":{"type":{"description":"Value MUST be `AND`.","type":"string","default":"AND"},"restrictions":{"$ref":"#/components/schemas/Restrictions"}}},"RestrictionOr":{"title":"OR","type":"object","properties":{"type":{"description":"Value MUST be `OR`.","type":"string","default":"OR"},"restrictions":{"$ref":"#/components/schemas/Restrictions"}}},"RestrictionDate":{"title":"DATE","deprecated":true,"type":"object","properties":{"type":{"description":"Value MUST be `DATE`.","type":"string","default":"DATE"},"startDate":{"description":"Start time. Must be in milliseconds.","type":"integer"},"endDate":{"description":"End time. Must be in milliseconds.","type":"integer"}}}}}}
```

## The PersonFieldsCollection object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"PersonFieldsCollection":{"description":"Defines the return information.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["BIOMETRIC","AUXILIARIES","KEYS","BIOGRAPHICS","LABELS","METADATA","BASIC_FIELDS","NO_FIELDS","ALL_FIELDS"]}}}}}
```

## The Restrictions object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Restrictions":{"description":"<br> **Array of restrictions** to be applied to the search.\n\nSearch restriction types: `BIOGRAPHIC`, `KEY`, `LABEL`, `AND`, `OR`.\n\n**Note:** In the `AND` and `OR` restriction operators, the property `restrictions` recursively accepts *arrays of restrictions* following this same structure. See example in the *Request samples*.\n\n**IMPORTANT:** The **DATE** restriction is no longer supported from GBDS API version 5.0.0 onwards. Instead, use the fields data->`startDate` and data->`endDate`.\n","type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/RestrictionBiographic"},{"$ref":"#/components/schemas/RestrictionKey"},{"$ref":"#/components/schemas/RestrictionLabel"},{"$ref":"#/components/schemas/RestrictionAnd"},{"$ref":"#/components/schemas/RestrictionOr"},{"$ref":"#/components/schemas/RestrictionDate"}]}},"RestrictionBiographic":{"title":"BIOGRAPHIC","type":"object","properties":{"type":{"description":"Value MUST be `BIOGRAPHIC`.","type":"string","default":"BIOGRAPHIC"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionKey":{"title":"KEY","type":"object","properties":{"type":{"description":"Value MUST be `KEY`.","type":"string","default":"KEY"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionLabel":{"title":"LABEL","type":"object","properties":{"type":{"description":"Value MUST be `LABEL`.","type":"string","default":"LABEL"},"label":{"type":"string"},"exists":{"type":"boolean"}}},"RestrictionAnd":{"title":"AND","type":"object","properties":{"type":{"description":"Value MUST be `AND`.","type":"string","default":"AND"},"restrictions":{"$ref":"#/components/schemas/Restrictions"}}},"RestrictionOr":{"title":"OR","type":"object","properties":{"type":{"description":"Value MUST be `OR`.","type":"string","default":"OR"},"restrictions":{"$ref":"#/components/schemas/Restrictions"}}},"RestrictionDate":{"title":"DATE","deprecated":true,"type":"object","properties":{"type":{"description":"Value MUST be `DATE`.","type":"string","default":"DATE"},"startDate":{"description":"Start time. Must be in milliseconds.","type":"integer"},"endDate":{"description":"End time. Must be in milliseconds.","type":"integer"}}}}}}
```

## The RestrictionAnd object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"RestrictionAnd":{"title":"AND","type":"object","properties":{"type":{"description":"Value MUST be `AND`.","type":"string","default":"AND"},"restrictions":{"$ref":"#/components/schemas/Restrictions"}}},"Restrictions":{"description":"<br> **Array of restrictions** to be applied to the search.\n\nSearch restriction types: `BIOGRAPHIC`, `KEY`, `LABEL`, `AND`, `OR`.\n\n**Note:** In the `AND` and `OR` restriction operators, the property `restrictions` recursively accepts *arrays of restrictions* following this same structure. See example in the *Request samples*.\n\n**IMPORTANT:** The **DATE** restriction is no longer supported from GBDS API version 5.0.0 onwards. Instead, use the fields data->`startDate` and data->`endDate`.\n","type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/RestrictionBiographic"},{"$ref":"#/components/schemas/RestrictionKey"},{"$ref":"#/components/schemas/RestrictionLabel"},{"$ref":"#/components/schemas/RestrictionAnd"},{"$ref":"#/components/schemas/RestrictionOr"},{"$ref":"#/components/schemas/RestrictionDate"}]}},"RestrictionBiographic":{"title":"BIOGRAPHIC","type":"object","properties":{"type":{"description":"Value MUST be `BIOGRAPHIC`.","type":"string","default":"BIOGRAPHIC"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionKey":{"title":"KEY","type":"object","properties":{"type":{"description":"Value MUST be `KEY`.","type":"string","default":"KEY"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionLabel":{"title":"LABEL","type":"object","properties":{"type":{"description":"Value MUST be `LABEL`.","type":"string","default":"LABEL"},"label":{"type":"string"},"exists":{"type":"boolean"}}},"RestrictionOr":{"title":"OR","type":"object","properties":{"type":{"description":"Value MUST be `OR`.","type":"string","default":"OR"},"restrictions":{"$ref":"#/components/schemas/Restrictions"}}},"RestrictionDate":{"title":"DATE","deprecated":true,"type":"object","properties":{"type":{"description":"Value MUST be `DATE`.","type":"string","default":"DATE"},"startDate":{"description":"Start time. Must be in milliseconds.","type":"integer"},"endDate":{"description":"End time. Must be in milliseconds.","type":"integer"}}}}}}
```

## The RestrictionOr object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"RestrictionOr":{"title":"OR","type":"object","properties":{"type":{"description":"Value MUST be `OR`.","type":"string","default":"OR"},"restrictions":{"$ref":"#/components/schemas/Restrictions"}}},"Restrictions":{"description":"<br> **Array of restrictions** to be applied to the search.\n\nSearch restriction types: `BIOGRAPHIC`, `KEY`, `LABEL`, `AND`, `OR`.\n\n**Note:** In the `AND` and `OR` restriction operators, the property `restrictions` recursively accepts *arrays of restrictions* following this same structure. See example in the *Request samples*.\n\n**IMPORTANT:** The **DATE** restriction is no longer supported from GBDS API version 5.0.0 onwards. Instead, use the fields data->`startDate` and data->`endDate`.\n","type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/RestrictionBiographic"},{"$ref":"#/components/schemas/RestrictionKey"},{"$ref":"#/components/schemas/RestrictionLabel"},{"$ref":"#/components/schemas/RestrictionAnd"},{"$ref":"#/components/schemas/RestrictionOr"},{"$ref":"#/components/schemas/RestrictionDate"}]}},"RestrictionBiographic":{"title":"BIOGRAPHIC","type":"object","properties":{"type":{"description":"Value MUST be `BIOGRAPHIC`.","type":"string","default":"BIOGRAPHIC"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionKey":{"title":"KEY","type":"object","properties":{"type":{"description":"Value MUST be `KEY`.","type":"string","default":"KEY"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionLabel":{"title":"LABEL","type":"object","properties":{"type":{"description":"Value MUST be `LABEL`.","type":"string","default":"LABEL"},"label":{"type":"string"},"exists":{"type":"boolean"}}},"RestrictionAnd":{"title":"AND","type":"object","properties":{"type":{"description":"Value MUST be `AND`.","type":"string","default":"AND"},"restrictions":{"$ref":"#/components/schemas/Restrictions"}}},"RestrictionDate":{"title":"DATE","deprecated":true,"type":"object","properties":{"type":{"description":"Value MUST be `DATE`.","type":"string","default":"DATE"},"startDate":{"description":"Start time. Must be in milliseconds.","type":"integer"},"endDate":{"description":"End time. Must be in milliseconds.","type":"integer"}}}}}}
```

## The RestrictionBiographic object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"RestrictionBiographic":{"title":"BIOGRAPHIC","type":"object","properties":{"type":{"description":"Value MUST be `BIOGRAPHIC`.","type":"string","default":"BIOGRAPHIC"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}}}}}
```

## The RestrictionDate object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"RestrictionDate":{"title":"DATE","deprecated":true,"type":"object","properties":{"type":{"description":"Value MUST be `DATE`.","type":"string","default":"DATE"},"startDate":{"description":"Start time. Must be in milliseconds.","type":"integer"},"endDate":{"description":"End time. Must be in milliseconds.","type":"integer"}}}}}}
```

## The RestrictionKey object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"RestrictionKey":{"title":"KEY","type":"object","properties":{"type":{"description":"Value MUST be `KEY`.","type":"string","default":"KEY"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}}}}}
```

## The RestrictionLabel object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"RestrictionLabel":{"title":"LABEL","type":"object","properties":{"type":{"description":"Value MUST be `LABEL`.","type":"string","default":"LABEL"},"label":{"type":"string"},"exists":{"type":"boolean"}}}}}}
```

## The ListPeopleResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListPeopleResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Person"}},"pagination":{"oneOf":[{"$ref":"#/components/schemas/Pagination"},{"$ref":"#/components/schemas/PaginationOff"}]},"expression":{"description":"This field describes in a more natural language the restrictions used in the search (array of restrictions, data->`restrictions`, in the payload).","type":"string"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"PaginationOff":{"type":"object","properties":{"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"}}}}}}
```

## The GetPeoplePguidUsingKeyResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetPeoplePguidUsingKeyResponse":{"type":"object","properties":{"data":{"description":"Person PGUID.","type":"string"}}}}}}
```

## The CreatePeopleTrustedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreatePeopleTrustedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/TrustedEnrollMeta"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"TrustedEnrollMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"active":{"description":"Determines if the biometric sent will be loaded into RAM and be available for Search and biometric validation.","type":"boolean"},"externalIDs":{"description":"a","type":"array","items":{"$ref":"#/components/schemas/ExternalIDRequest"}},"labelsOperation":{"description":"a","type":"string","enum":["REPLACE","ACCUMULATE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalIDRequest":{"type":"object","properties":{"name":{"type":"string"},"keys":{"type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}}}}}
```

## The TrustedEnrollMeta object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TrustedEnrollMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"active":{"description":"Determines if the biometric sent will be loaded into RAM and be available for Search and biometric validation.","type":"boolean"},"externalIDs":{"description":"a","type":"array","items":{"$ref":"#/components/schemas/ExternalIDRequest"}},"labelsOperation":{"description":"a","type":"string","enum":["REPLACE","ACCUMULATE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalIDRequest":{"type":"object","properties":{"name":{"type":"string"},"keys":{"type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}}}}}
```

## The ExternalIDRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ExternalIDRequest":{"type":"object","properties":{"name":{"type":"string"},"keys":{"type":"string"}}}}}}
```

## The UpdatePeopleTrustedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdatePeopleTrustedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/TrustedEnrollMeta"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"TrustedEnrollMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"active":{"description":"Determines if the biometric sent will be loaded into RAM and be available for Search and biometric validation.","type":"boolean"},"externalIDs":{"description":"a","type":"array","items":{"$ref":"#/components/schemas/ExternalIDRequest"}},"labelsOperation":{"description":"a","type":"string","enum":["REPLACE","ACCUMULATE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalIDRequest":{"type":"object","properties":{"name":{"type":"string"},"keys":{"type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}}}}}
```

## The DuplicationIssue object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"DuplicationIssue":{"type":"object","properties":{"indexes":{"description":"List of pairs of duplicated indexes found.","type":"array","items":{"type":"integer","format":"int32"}}}}}}}
```

## The QualityAnalysis object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"QualityAnalysis":{"type":"object","properties":{"status":{"description":"Status of the analysis.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"user":{"description":"Username of whom issued the approval.","type":"string"},"comments":{"description":"User comments on the approval.","type":"string"},"timestamp":{"description":"Creation time of the approval, be it manual or automatic. If the enroll did not have any anomalies, the approval was automatic, thus this field will be equal to the enroll time. Otherwise, this timestamp will be the time when the user either approved or rejected the enrollment.","type":"integer","format":"int64"},"duplicationIssues":{"type":"array","items":{"$ref":"#/components/schemas/DuplicationIssue"}},"qualityIssues":{"type":"array","items":{"$ref":"#/components/schemas/QualityIssue"}},"sequenceControlIssues":{"type":"array","items":{"$ref":"#/components/schemas/SequenceControlIssue"}}}},"DuplicationIssue":{"type":"object","properties":{"indexes":{"description":"List of pairs of duplicated indexes found.","type":"array","items":{"type":"integer","format":"int32"}}}},"QualityIssue":{"type":"object","properties":{"index":{"description":"Index of the referred finger.","type":"integer","format":"int32"},"quality":{"description":"Quality calculated for the template.","type":"integer","format":"int32"}}},"SequenceControlIssue":{"type":"object","properties":{"index":{"description":"Index of the problematic finger.","type":"integer","format":"int32"},"matches":{"description":"List of sequence control indexes that matched the given finger and its matching score.","type":"array","items":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}}}}}
```

## The QualityIssue object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"QualityIssue":{"type":"object","properties":{"index":{"description":"Index of the referred finger.","type":"integer","format":"int32"},"quality":{"description":"Quality calculated for the template.","type":"integer","format":"int32"}}}}}}
```

## The SequenceControlIssue object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SequenceControlIssue":{"type":"object","properties":{"index":{"description":"Index of the problematic finger.","type":"integer","format":"int32"},"matches":{"description":"List of sequence control indexes that matched the given finger and its matching score.","type":"array","items":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}}}}}
```

## The UpdateQualityAnalysisMeta object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdateQualityAnalysisMeta":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"}}}}}}
```

## The UpdateQualityAnalysisRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdateQualityAnalysisRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"qualityAnalysis":{"$ref":"#/components/schemas/QualityAnalysis"},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}}}},"meta":{"$ref":"#/components/schemas/UpdateQualityAnalysisMeta"}}},"QualityAnalysis":{"type":"object","properties":{"status":{"description":"Status of the analysis.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"user":{"description":"Username of whom issued the approval.","type":"string"},"comments":{"description":"User comments on the approval.","type":"string"},"timestamp":{"description":"Creation time of the approval, be it manual or automatic. If the enroll did not have any anomalies, the approval was automatic, thus this field will be equal to the enroll time. Otherwise, this timestamp will be the time when the user either approved or rejected the enrollment.","type":"integer","format":"int64"},"duplicationIssues":{"type":"array","items":{"$ref":"#/components/schemas/DuplicationIssue"}},"qualityIssues":{"type":"array","items":{"$ref":"#/components/schemas/QualityIssue"}},"sequenceControlIssues":{"type":"array","items":{"$ref":"#/components/schemas/SequenceControlIssue"}}}},"DuplicationIssue":{"type":"object","properties":{"indexes":{"description":"List of pairs of duplicated indexes found.","type":"array","items":{"type":"integer","format":"int32"}}}},"QualityIssue":{"type":"object","properties":{"index":{"description":"Index of the referred finger.","type":"integer","format":"int32"},"quality":{"description":"Quality calculated for the template.","type":"integer","format":"int32"}}},"SequenceControlIssue":{"type":"object","properties":{"index":{"description":"Index of the problematic finger.","type":"integer","format":"int32"},"matches":{"description":"List of sequence control indexes that matched the given finger and its matching score.","type":"array","items":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"UpdateQualityAnalysisMeta":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"}}}}}}
```

## The UpdateQualityAnalysisResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdateQualityAnalysisResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"newTransactionGUID":{"description":"Transaction GUID for new enroll transaction generated.","type":"string"}}}}}}}}
```

## The GetSearchesResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetSearchesResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Search"}}},"Search":{"type":"object","properties":{"status":{"description":"Status of the search.","type":"string","enum":["ENQUEUED","PREPARED","PROCESSING","MATCH","NOT_MATCH","FAILED","PENDING","PERSON_NOT_FOUND"]},"tguid":{"description":"Search transaction TGUID.","type":"string"},"candidates":{"description":"List of match candidates.","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"progress":{"type":"number","format":"float"},"request":{"$ref":"#/components/schemas/SearchSpec"},"failReason":{"description":"Fail message on why search didn't complete.","type":"string"},"searchType":{"description":"Type of finger that was searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometrics":{"description":"List of biometrics","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"apiID":{"description":"API ID","type":"string"},"gbdsVersion":{"description":"GBDS Version","type":"string"},"extractionElapsed":{"description":"Time to complete the extraction.","type":"integer","format":"int64"},"searchElapsed":{"description":"Time to complete the search.","type":"integer","format":"int64"},"postSearchElapsed":{"description":"Time to complete the post match.","type":"integer","format":"int64"},"ulsearch":{"description":"Unsolved latent search.","type":"boolean"},"latentSearch":{"description":"Latent search.","type":"boolean"},"score":{"description":"Score of the biometric comparison. Only returned if a single biometric was provided in the payload of the request that created the search.","type":"integer","format":"int32"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Only returned if the `liveness` flag was set to `true` in the payload of the request that created the search. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"},"metadata":{"$ref":"#/components/schemas/SearchMetadata"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"SearchSpec":{"type":"object","properties":{"searchType":{"description":"Type of finger to be searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometric":{"description":"If only one biometric is provided, a match score will be returned. If more than one biometric is provided, a list of candidates can be retrieved using getSearchResult.","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"pguids":{"description":"This field is a list of PGUIDs. If the list is empty or null, the search will be against the entire database. If it has only one PGUID, the search will be 1:1. It is possible to make 1:1 searches with more than one PGUID.","type":"array","items":{"type":"string"}},"labelFilters":{"description":"Used for 1:N operations. The filters will be compared with the labels field registered by the enroll method.","uniqueItems":true,"type":"array","items":{"type":"string"}},"isLatentSearch":{"description":"Flag indicating if the search is a Latent Search.","type":"boolean"},"isULSearch":{"description":"Flag indicating if the search is an UL Search.","type":"boolean"},"numberOfCandidates":{"description":"Number of candidates to be returned.","type":"integer","format":"int32"},"classificationThreshold":{"description":"Threshold for either classifying biometric data or marking it as UNKNOWN.","type":"integer","format":"int32"},"classifications":{"description":"Vector containing the classifications to be considered. Defaults to UNKNOWN.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["PLAIN_ARCH","LEFT_LOOP","RIGHT_LOOP","WHORL","SCAR","UNKNOWN","AMPUTATION","OTHER"]}},"singularities":{"description":"Singularities to be considered. Defaults to NONE.","type":"string","enum":["NONE","NO_DELTA_ALL_CORES","ONE_DELTA_NO_CORES","ONE_DELTA_ALL_CORES"]},"latentSearchOptions":{"$ref":"#/components/schemas/LatentSearchOptions"},"searchOptions":{"$ref":"#/components/schemas/SearchOptions"},"user":{"type":"string"},"uguids":{"description":"Globally unique ID of the UL. Can be a list of uguids.","type":"array","items":{"type":"string"}},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned.","type":"boolean"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"LatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"}}},"SearchOptions":{"type":"object","properties":{"biometricType":{"description":"biometricType must contain its data and be one of the following values - FINGERPRINT, PALMPRINT, FACE, IRIS, NEWBORN_PALMPRINT, i.e., you must substitute the \"biometricType\" field name by one of the ENUM names.","type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"},"matcher":{"description":"Define which ginger preset will be used.","type":"string","enum":["DEFAULT","MOBILE"]}}}}},"SearchMetadata":{"description":"Additional information.","type":"object","additionalProperties":{"description":"A flexible key-value pair where the key is a string."}}}}}
```

## The LatentSearchOptions object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"}}}}}}
```

## The SearchOptions object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SearchOptions":{"type":"object","properties":{"biometricType":{"description":"biometricType must contain its data and be one of the following values - FINGERPRINT, PALMPRINT, FACE, IRIS, NEWBORN_PALMPRINT, i.e., you must substitute the \"biometricType\" field name by one of the ENUM names.","type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"},"matcher":{"description":"Define which ginger preset will be used.","type":"string","enum":["DEFAULT","MOBILE"]}}}}}}}}
```

## The Search object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Search":{"type":"object","properties":{"status":{"description":"Status of the search.","type":"string","enum":["ENQUEUED","PREPARED","PROCESSING","MATCH","NOT_MATCH","FAILED","PENDING","PERSON_NOT_FOUND"]},"tguid":{"description":"Search transaction TGUID.","type":"string"},"candidates":{"description":"List of match candidates.","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"progress":{"type":"number","format":"float"},"request":{"$ref":"#/components/schemas/SearchSpec"},"failReason":{"description":"Fail message on why search didn't complete.","type":"string"},"searchType":{"description":"Type of finger that was searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometrics":{"description":"List of biometrics","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"apiID":{"description":"API ID","type":"string"},"gbdsVersion":{"description":"GBDS Version","type":"string"},"extractionElapsed":{"description":"Time to complete the extraction.","type":"integer","format":"int64"},"searchElapsed":{"description":"Time to complete the search.","type":"integer","format":"int64"},"postSearchElapsed":{"description":"Time to complete the post match.","type":"integer","format":"int64"},"ulsearch":{"description":"Unsolved latent search.","type":"boolean"},"latentSearch":{"description":"Latent search.","type":"boolean"},"score":{"description":"Score of the biometric comparison. Only returned if a single biometric was provided in the payload of the request that created the search.","type":"integer","format":"int32"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Only returned if the `liveness` flag was set to `true` in the payload of the request that created the search. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"},"metadata":{"$ref":"#/components/schemas/SearchMetadata"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"SearchSpec":{"type":"object","properties":{"searchType":{"description":"Type of finger to be searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometric":{"description":"If only one biometric is provided, a match score will be returned. If more than one biometric is provided, a list of candidates can be retrieved using getSearchResult.","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"pguids":{"description":"This field is a list of PGUIDs. If the list is empty or null, the search will be against the entire database. If it has only one PGUID, the search will be 1:1. It is possible to make 1:1 searches with more than one PGUID.","type":"array","items":{"type":"string"}},"labelFilters":{"description":"Used for 1:N operations. The filters will be compared with the labels field registered by the enroll method.","uniqueItems":true,"type":"array","items":{"type":"string"}},"isLatentSearch":{"description":"Flag indicating if the search is a Latent Search.","type":"boolean"},"isULSearch":{"description":"Flag indicating if the search is an UL Search.","type":"boolean"},"numberOfCandidates":{"description":"Number of candidates to be returned.","type":"integer","format":"int32"},"classificationThreshold":{"description":"Threshold for either classifying biometric data or marking it as UNKNOWN.","type":"integer","format":"int32"},"classifications":{"description":"Vector containing the classifications to be considered. Defaults to UNKNOWN.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["PLAIN_ARCH","LEFT_LOOP","RIGHT_LOOP","WHORL","SCAR","UNKNOWN","AMPUTATION","OTHER"]}},"singularities":{"description":"Singularities to be considered. Defaults to NONE.","type":"string","enum":["NONE","NO_DELTA_ALL_CORES","ONE_DELTA_NO_CORES","ONE_DELTA_ALL_CORES"]},"latentSearchOptions":{"$ref":"#/components/schemas/LatentSearchOptions"},"searchOptions":{"$ref":"#/components/schemas/SearchOptions"},"user":{"type":"string"},"uguids":{"description":"Globally unique ID of the UL. Can be a list of uguids.","type":"array","items":{"type":"string"}},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned.","type":"boolean"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"LatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"}}},"SearchOptions":{"type":"object","properties":{"biometricType":{"description":"biometricType must contain its data and be one of the following values - FINGERPRINT, PALMPRINT, FACE, IRIS, NEWBORN_PALMPRINT, i.e., you must substitute the \"biometricType\" field name by one of the ENUM names.","type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"},"matcher":{"description":"Define which ginger preset will be used.","type":"string","enum":["DEFAULT","MOBILE"]}}}}},"SearchMetadata":{"description":"Additional information.","type":"object","additionalProperties":{"description":"A flexible key-value pair where the key is a string."}}}}}
```

## The SearchSpec object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SearchSpec":{"type":"object","properties":{"searchType":{"description":"Type of finger to be searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometric":{"description":"If only one biometric is provided, a match score will be returned. If more than one biometric is provided, a list of candidates can be retrieved using getSearchResult.","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"pguids":{"description":"This field is a list of PGUIDs. If the list is empty or null, the search will be against the entire database. If it has only one PGUID, the search will be 1:1. It is possible to make 1:1 searches with more than one PGUID.","type":"array","items":{"type":"string"}},"labelFilters":{"description":"Used for 1:N operations. The filters will be compared with the labels field registered by the enroll method.","uniqueItems":true,"type":"array","items":{"type":"string"}},"isLatentSearch":{"description":"Flag indicating if the search is a Latent Search.","type":"boolean"},"isULSearch":{"description":"Flag indicating if the search is an UL Search.","type":"boolean"},"numberOfCandidates":{"description":"Number of candidates to be returned.","type":"integer","format":"int32"},"classificationThreshold":{"description":"Threshold for either classifying biometric data or marking it as UNKNOWN.","type":"integer","format":"int32"},"classifications":{"description":"Vector containing the classifications to be considered. Defaults to UNKNOWN.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["PLAIN_ARCH","LEFT_LOOP","RIGHT_LOOP","WHORL","SCAR","UNKNOWN","AMPUTATION","OTHER"]}},"singularities":{"description":"Singularities to be considered. Defaults to NONE.","type":"string","enum":["NONE","NO_DELTA_ALL_CORES","ONE_DELTA_NO_CORES","ONE_DELTA_ALL_CORES"]},"latentSearchOptions":{"$ref":"#/components/schemas/LatentSearchOptions"},"searchOptions":{"$ref":"#/components/schemas/SearchOptions"},"user":{"type":"string"},"uguids":{"description":"Globally unique ID of the UL. Can be a list of uguids.","type":"array","items":{"type":"string"}},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned.","type":"boolean"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"LatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"}}},"SearchOptions":{"type":"object","properties":{"biometricType":{"description":"biometricType must contain its data and be one of the following values - FINGERPRINT, PALMPRINT, FACE, IRIS, NEWBORN_PALMPRINT, i.e., you must substitute the \"biometricType\" field name by one of the ENUM names.","type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"},"matcher":{"description":"Define which ginger preset will be used.","type":"string","enum":["DEFAULT","MOBILE"]}}}}}}}}
```

## The CreateSearchRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreateSearchRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SearchSpec"},"meta":{"$ref":"#/components/schemas/SearchMeta"}}},"SearchSpec":{"type":"object","properties":{"searchType":{"description":"Type of finger to be searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometric":{"description":"If only one biometric is provided, a match score will be returned. If more than one biometric is provided, a list of candidates can be retrieved using getSearchResult.","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"pguids":{"description":"This field is a list of PGUIDs. If the list is empty or null, the search will be against the entire database. If it has only one PGUID, the search will be 1:1. It is possible to make 1:1 searches with more than one PGUID.","type":"array","items":{"type":"string"}},"labelFilters":{"description":"Used for 1:N operations. The filters will be compared with the labels field registered by the enroll method.","uniqueItems":true,"type":"array","items":{"type":"string"}},"isLatentSearch":{"description":"Flag indicating if the search is a Latent Search.","type":"boolean"},"isULSearch":{"description":"Flag indicating if the search is an UL Search.","type":"boolean"},"numberOfCandidates":{"description":"Number of candidates to be returned.","type":"integer","format":"int32"},"classificationThreshold":{"description":"Threshold for either classifying biometric data or marking it as UNKNOWN.","type":"integer","format":"int32"},"classifications":{"description":"Vector containing the classifications to be considered. Defaults to UNKNOWN.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["PLAIN_ARCH","LEFT_LOOP","RIGHT_LOOP","WHORL","SCAR","UNKNOWN","AMPUTATION","OTHER"]}},"singularities":{"description":"Singularities to be considered. Defaults to NONE.","type":"string","enum":["NONE","NO_DELTA_ALL_CORES","ONE_DELTA_NO_CORES","ONE_DELTA_ALL_CORES"]},"latentSearchOptions":{"$ref":"#/components/schemas/LatentSearchOptions"},"searchOptions":{"$ref":"#/components/schemas/SearchOptions"},"user":{"type":"string"},"uguids":{"description":"Globally unique ID of the UL. Can be a list of uguids.","type":"array","items":{"type":"string"}},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned.","type":"boolean"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"LatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"}}},"SearchOptions":{"type":"object","properties":{"biometricType":{"description":"biometricType must contain its data and be one of the following values - FINGERPRINT, PALMPRINT, FACE, IRIS, NEWBORN_PALMPRINT, i.e., you must substitute the \"biometricType\" field name by one of the ENUM names.","type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"},"matcher":{"description":"Define which ginger preset will be used.","type":"string","enum":["DEFAULT","MOBILE"]}}}}},"SearchMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"metadata":{"$ref":"#/components/schemas/SearchMetadata"},"verifyResult":{"type":"boolean","description":"Flag to request the result of the Verification call (Verify - when keys and/or PGUIDs are provided). Default: `false`.\n\nIf `false`, the Verify will return:\n- `tguid`\n- `status`\n- `score` (if only one biometric was provided in the request payload and the `searchType` is `SAME_FINGERS`; if more than one biometric was provided, the score will not be returned)\n- `bonafideScore` (for faces, if the data->`liveness` flag is set to `true` in the request payload)\n\nIf `true`, the Verify will return all above plus:\n- `candidates` (if more than one biometric is provided, candidates will be returned and the score will not be returned)\n- `progress`\n- `searchType`\n- `metadata`\n- `apiID`\n- `gbdsVersion`\n- `extractionElapsed`\n- `searchElapsed`\n- `postSearchElapsed`\n- `ulsearch`\n- `latentSearch`\n\nPS: `biometrics` are never returned in the response.\n"}}},"SearchMetadata":{"description":"Additional information.","type":"object","additionalProperties":{"description":"A flexible key-value pair where the key is a string."}}}}}
```

## The SearchMeta object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SearchMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"metadata":{"$ref":"#/components/schemas/SearchMetadata"},"verifyResult":{"type":"boolean","description":"Flag to request the result of the Verification call (Verify - when keys and/or PGUIDs are provided). Default: `false`.\n\nIf `false`, the Verify will return:\n- `tguid`\n- `status`\n- `score` (if only one biometric was provided in the request payload and the `searchType` is `SAME_FINGERS`; if more than one biometric was provided, the score will not be returned)\n- `bonafideScore` (for faces, if the data->`liveness` flag is set to `true` in the request payload)\n\nIf `true`, the Verify will return all above plus:\n- `candidates` (if more than one biometric is provided, candidates will be returned and the score will not be returned)\n- `progress`\n- `searchType`\n- `metadata`\n- `apiID`\n- `gbdsVersion`\n- `extractionElapsed`\n- `searchElapsed`\n- `postSearchElapsed`\n- `ulsearch`\n- `latentSearch`\n\nPS: `biometrics` are never returned in the response.\n"}}},"SearchMetadata":{"description":"Additional information.","type":"object","additionalProperties":{"description":"A flexible key-value pair where the key is a string."}}}}}
```

## The CreateSearchResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreateSearchResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"description":"Status of the search.","type":"string","enum":["ENQUEUED","PROCESSING","MATCH","NOT_MATCH","FAILED"]},"tguid":{"description":"Search transaction TGUID.","type":"string"},"score":{"description":"Biometric comparison score. <br><br> Only returned if a **single** biometric was provided in the request payload and the `searchType` is `SAME_FINGERS`.","type":"integer","format":"int32"},"bonafideScore":{"description":"Bonafide score of the liveness verification. <br><br> Only returned for **faces** and if the `liveness` flag was set to `true` in the request payload. Ranges from 0 to 100. (0=attack, 100=genuine).","type":"integer","format":"int32"},"candidates":{"description":"List of match candidates. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"progress":{"description":"Progress. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"number","format":"float"},"searchType":{"description":"Type of finger that was searched. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"metadata":{"allOf":[{"description":"Additional Information. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*"},{"$ref":"#/components/schemas/SearchMetadata"}]},"apiID":{"description":"API ID. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"string"},"gbdsVersion":{"description":"GBDS Version. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"string"},"extractionElapsed":{"description":"Time to complete the extraction. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"integer","format":"int64"},"searchElapsed":{"description":"Time to complete the search. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"integer","format":"int64"},"postSearchElapsed":{"description":"Time to complete the post match. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"integer","format":"int64"},"ulsearch":{"description":"Unsolved latent search. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"boolean"},"latentSearch":{"description":"Latent search. <br><br> *(Only returned if meta->`verifyResult` is `true` in the request payload)*","type":"boolean"}}}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"SearchMetadata":{"description":"Additional information.","type":"object","additionalProperties":{"description":"A flexible key-value pair where the key is a string."}}}}}
```

## The Enroll object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Enroll":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"pguid":{"description":"PGUID of the UL candidate.","type":"string"},"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED","RESENT_ENROLL"]},"timestamp":{"description":"Timestamp of Enroll creation.","type":"integer","format":"int64"},"progress":{"description":"Progress of the Enroll operation.","type":"number","format":"float"},"candidates":{"description":"Identify candidates","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"person":{"$ref":"#/components/schemas/Person"},"qualityAnalysis":{"$ref":"#/components/schemas/QualityAnalysis"},"failReason":{"description":"Message describing why the enroll failed","type":"string"},"isCurrentTransaction":{"description":"Whether this is the current transaction for the person identified by PGUID.","type":"boolean"},"refusedReason":{"$ref":"#/components/schemas/EnrollRefusedReason"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Only returned if the `liveness` flag was set to `true` in the payload of the enroll/update request. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"},"postSearchElapsed":{"description":"Time to complete the post match.","type":"integer","format":"int64"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"QualityAnalysis":{"type":"object","properties":{"status":{"description":"Status of the analysis.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"user":{"description":"Username of whom issued the approval.","type":"string"},"comments":{"description":"User comments on the approval.","type":"string"},"timestamp":{"description":"Creation time of the approval, be it manual or automatic. If the enroll did not have any anomalies, the approval was automatic, thus this field will be equal to the enroll time. Otherwise, this timestamp will be the time when the user either approved or rejected the enrollment.","type":"integer","format":"int64"},"duplicationIssues":{"type":"array","items":{"$ref":"#/components/schemas/DuplicationIssue"}},"qualityIssues":{"type":"array","items":{"$ref":"#/components/schemas/QualityIssue"}},"sequenceControlIssues":{"type":"array","items":{"$ref":"#/components/schemas/SequenceControlIssue"}}}},"DuplicationIssue":{"type":"object","properties":{"indexes":{"description":"List of pairs of duplicated indexes found.","type":"array","items":{"type":"integer","format":"int32"}}}},"QualityIssue":{"type":"object","properties":{"index":{"description":"Index of the referred finger.","type":"integer","format":"int32"},"quality":{"description":"Quality calculated for the template.","type":"integer","format":"int32"}}},"SequenceControlIssue":{"type":"object","properties":{"index":{"description":"Index of the problematic finger.","type":"integer","format":"int32"},"matches":{"description":"List of sequence control indexes that matched the given finger and its matching score.","type":"array","items":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}},"EnrollRefusedReason":{"type":"object","properties":{"matchedPeopleThatAreReferenceInSomeExceptionUnderAnalysis":{"description":"List of PGUID of the people that is the reference in some exception under analysis.","type":"array","items":{"type":"string"}},"matchedTransactionsThatHaveAnExceptionUnderAnalysis":{"description":"List of TGUID of entrant transactions with the exception under analysis.","type":"array","items":{"type":"string"}}}}}}}
```

## The EnrollTransaction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"EnrollTransaction":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"pguid":{"description":"PGUID of the UL candidate.","type":"string"},"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED","RESENT_ENROLL"]},"timestamp":{"description":"Timestamp of Enroll creation.","type":"integer","format":"int64"},"progress":{"description":"Progress of the Enroll operation.","type":"number","format":"float"},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"person":{"$ref":"#/components/schemas/Person"},"qualityAnalysis":{"$ref":"#/components/schemas/QualityAnalysis"},"failReason":{"description":"Message describing why the enroll failed","type":"string"},"isCurrentTransaction":{"description":"Whether this is the current transaction for the person identified by PGUID.","type":"boolean"},"refusedReason":{"$ref":"#/components/schemas/EnrollRefusedReason"},"apiID":{"description":"API ID that processed the enroll/search transaction","type":"string"},"gbdsVersion":{"description":"GBDS version that processed the transaction","type":"string"},"extractionElapsed":{"type":"integer","format":"int64"},"extractionQualityElapsed":{"type":"integer","format":"int64"},"searchElapsed":{"type":"integer","format":"int64"}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"QualityAnalysis":{"type":"object","properties":{"status":{"description":"Status of the analysis.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"user":{"description":"Username of whom issued the approval.","type":"string"},"comments":{"description":"User comments on the approval.","type":"string"},"timestamp":{"description":"Creation time of the approval, be it manual or automatic. If the enroll did not have any anomalies, the approval was automatic, thus this field will be equal to the enroll time. Otherwise, this timestamp will be the time when the user either approved or rejected the enrollment.","type":"integer","format":"int64"},"duplicationIssues":{"type":"array","items":{"$ref":"#/components/schemas/DuplicationIssue"}},"qualityIssues":{"type":"array","items":{"$ref":"#/components/schemas/QualityIssue"}},"sequenceControlIssues":{"type":"array","items":{"$ref":"#/components/schemas/SequenceControlIssue"}}}},"DuplicationIssue":{"type":"object","properties":{"indexes":{"description":"List of pairs of duplicated indexes found.","type":"array","items":{"type":"integer","format":"int32"}}}},"QualityIssue":{"type":"object","properties":{"index":{"description":"Index of the referred finger.","type":"integer","format":"int32"},"quality":{"description":"Quality calculated for the template.","type":"integer","format":"int32"}}},"SequenceControlIssue":{"type":"object","properties":{"index":{"description":"Index of the problematic finger.","type":"integer","format":"int32"},"matches":{"description":"List of sequence control indexes that matched the given finger and its matching score.","type":"array","items":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}},"EnrollRefusedReason":{"type":"object","properties":{"matchedPeopleThatAreReferenceInSomeExceptionUnderAnalysis":{"description":"List of PGUID of the people that is the reference in some exception under analysis.","type":"array","items":{"type":"string"}},"matchedTransactionsThatHaveAnExceptionUnderAnalysis":{"description":"List of TGUID of entrant transactions with the exception under analysis.","type":"array","items":{"type":"string"}}}}}}}
```

## The GetEnrollTransactionsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetEnrollTransactionsResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Enroll"}}},"Enroll":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"pguid":{"description":"PGUID of the UL candidate.","type":"string"},"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED","RESENT_ENROLL"]},"timestamp":{"description":"Timestamp of Enroll creation.","type":"integer","format":"int64"},"progress":{"description":"Progress of the Enroll operation.","type":"number","format":"float"},"candidates":{"description":"Identify candidates","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"person":{"$ref":"#/components/schemas/Person"},"qualityAnalysis":{"$ref":"#/components/schemas/QualityAnalysis"},"failReason":{"description":"Message describing why the enroll failed","type":"string"},"isCurrentTransaction":{"description":"Whether this is the current transaction for the person identified by PGUID.","type":"boolean"},"refusedReason":{"$ref":"#/components/schemas/EnrollRefusedReason"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Only returned if the `liveness` flag was set to `true` in the payload of the enroll/update request. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"},"postSearchElapsed":{"description":"Time to complete the post match.","type":"integer","format":"int64"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"QualityAnalysis":{"type":"object","properties":{"status":{"description":"Status of the analysis.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"user":{"description":"Username of whom issued the approval.","type":"string"},"comments":{"description":"User comments on the approval.","type":"string"},"timestamp":{"description":"Creation time of the approval, be it manual or automatic. If the enroll did not have any anomalies, the approval was automatic, thus this field will be equal to the enroll time. Otherwise, this timestamp will be the time when the user either approved or rejected the enrollment.","type":"integer","format":"int64"},"duplicationIssues":{"type":"array","items":{"$ref":"#/components/schemas/DuplicationIssue"}},"qualityIssues":{"type":"array","items":{"$ref":"#/components/schemas/QualityIssue"}},"sequenceControlIssues":{"type":"array","items":{"$ref":"#/components/schemas/SequenceControlIssue"}}}},"DuplicationIssue":{"type":"object","properties":{"indexes":{"description":"List of pairs of duplicated indexes found.","type":"array","items":{"type":"integer","format":"int32"}}}},"QualityIssue":{"type":"object","properties":{"index":{"description":"Index of the referred finger.","type":"integer","format":"int32"},"quality":{"description":"Quality calculated for the template.","type":"integer","format":"int32"}}},"SequenceControlIssue":{"type":"object","properties":{"index":{"description":"Index of the problematic finger.","type":"integer","format":"int32"},"matches":{"description":"List of sequence control indexes that matched the given finger and its matching score.","type":"array","items":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}},"EnrollRefusedReason":{"type":"object","properties":{"matchedPeopleThatAreReferenceInSomeExceptionUnderAnalysis":{"description":"List of PGUID of the people that is the reference in some exception under analysis.","type":"array","items":{"type":"string"}},"matchedTransactionsThatHaveAnExceptionUnderAnalysis":{"description":"List of TGUID of entrant transactions with the exception under analysis.","type":"array","items":{"type":"string"}}}}}}}
```

## The ListEnrollTransactionsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListEnrollTransactionsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Enroll"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"meta":{"$ref":"#/components/schemas/ResponseMeta"}}},"Enroll":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"pguid":{"description":"PGUID of the UL candidate.","type":"string"},"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED","RESENT_ENROLL"]},"timestamp":{"description":"Timestamp of Enroll creation.","type":"integer","format":"int64"},"progress":{"description":"Progress of the Enroll operation.","type":"number","format":"float"},"candidates":{"description":"Identify candidates","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"person":{"$ref":"#/components/schemas/Person"},"qualityAnalysis":{"$ref":"#/components/schemas/QualityAnalysis"},"failReason":{"description":"Message describing why the enroll failed","type":"string"},"isCurrentTransaction":{"description":"Whether this is the current transaction for the person identified by PGUID.","type":"boolean"},"refusedReason":{"$ref":"#/components/schemas/EnrollRefusedReason"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Only returned if the `liveness` flag was set to `true` in the payload of the enroll/update request. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"},"postSearchElapsed":{"description":"Time to complete the post match.","type":"integer","format":"int64"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"QualityAnalysis":{"type":"object","properties":{"status":{"description":"Status of the analysis.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"user":{"description":"Username of whom issued the approval.","type":"string"},"comments":{"description":"User comments on the approval.","type":"string"},"timestamp":{"description":"Creation time of the approval, be it manual or automatic. If the enroll did not have any anomalies, the approval was automatic, thus this field will be equal to the enroll time. Otherwise, this timestamp will be the time when the user either approved or rejected the enrollment.","type":"integer","format":"int64"},"duplicationIssues":{"type":"array","items":{"$ref":"#/components/schemas/DuplicationIssue"}},"qualityIssues":{"type":"array","items":{"$ref":"#/components/schemas/QualityIssue"}},"sequenceControlIssues":{"type":"array","items":{"$ref":"#/components/schemas/SequenceControlIssue"}}}},"DuplicationIssue":{"type":"object","properties":{"indexes":{"description":"List of pairs of duplicated indexes found.","type":"array","items":{"type":"integer","format":"int32"}}}},"QualityIssue":{"type":"object","properties":{"index":{"description":"Index of the referred finger.","type":"integer","format":"int32"},"quality":{"description":"Quality calculated for the template.","type":"integer","format":"int32"}}},"SequenceControlIssue":{"type":"object","properties":{"index":{"description":"Index of the problematic finger.","type":"integer","format":"int32"},"matches":{"description":"List of sequence control indexes that matched the given finger and its matching score.","type":"array","items":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}},"EnrollRefusedReason":{"type":"object","properties":{"matchedPeopleThatAreReferenceInSomeExceptionUnderAnalysis":{"description":"List of PGUID of the people that is the reference in some exception under analysis.","type":"array","items":{"type":"string"}},"matchedTransactionsThatHaveAnExceptionUnderAnalysis":{"description":"List of TGUID of entrant transactions with the exception under analysis.","type":"array","items":{"type":"string"}}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ResponseMeta":{"type":"object","properties":{"tguidsWithError":{"description":"Array containing TGUID for transactions, of the requested page, which had errors during retrieval and thus are NOT present in the returned page.","type":"array","items":{"type":"string"}}}}}}}
```

## The ResponseMeta object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ResponseMeta":{"type":"object","properties":{"tguidsWithError":{"description":"Array containing TGUID for transactions, of the requested page, which had errors during retrieval and thus are NOT present in the returned page.","type":"array","items":{"type":"string"}}}}}}}
```

## The Fragment object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Fragment":{"type":"object","properties":{"id":{"description":"ID of the fragment.","type":"string"},"caseId":{"description":"ID of case the fragment is associated to.","type":"string"},"image":{"$ref":"#/components/schemas/Biometric"},"template":{"$ref":"#/components/schemas/Biometric"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}}}}}
```

## The ListULsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListULsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UL"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"UL":{"type":"object","properties":{"uguid":{"description":"Globally unique ID of the UL.","type":"string"},"status":{"description":"UL Status.","type":"string","enum":["UNSOLVED","SOLVED","ENQUEUED","FAILED"]},"creationTime":{"description":"Timestamp, in milliseconds, of UL creation.","type":"integer","format":"int64"},"personPguid":{"description":"PGUID of the person the UL was matched against. Only present when the UL has status RESOLVED.","type":"string"},"personTguid":{"description":"TGUID of the person the UL was matched against. Only present when the UL has status RESOLVED.","type":"string"},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"linkedULs":{"description":"List of UGUIDs if ULs that were linked against this UL.","type":"array","items":{"type":"string"}},"fragment":{"$ref":"#/components/schemas/Fragment"},"ulAnalysis":{"$ref":"#/components/schemas/ULAnalysis"},"isSearchable":{"description":"Flag that indicates whether the UL's fragment is already registered and searchable.","type":"boolean"},"failReason":{"description":"If failed, this field indicates the reason.","type":"string"}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Fragment":{"type":"object","properties":{"id":{"description":"ID of the fragment.","type":"string"},"caseId":{"description":"ID of case the fragment is associated to.","type":"string"},"image":{"$ref":"#/components/schemas/Biometric"},"template":{"$ref":"#/components/schemas/Biometric"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ULAnalysis":{"type":"object","properties":{"user":{"description":"Username of user that solved UL.","type":"string"},"timestamp":{"description":"Timestamp, in milliseconds, of when UL was solved.","type":"integer","format":"int64"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}}}}}
```

## The UL object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UL":{"type":"object","properties":{"uguid":{"description":"Globally unique ID of the UL.","type":"string"},"status":{"description":"UL Status.","type":"string","enum":["UNSOLVED","SOLVED","ENQUEUED","FAILED"]},"creationTime":{"description":"Timestamp, in milliseconds, of UL creation.","type":"integer","format":"int64"},"personPguid":{"description":"PGUID of the person the UL was matched against. Only present when the UL has status RESOLVED.","type":"string"},"personTguid":{"description":"TGUID of the person the UL was matched against. Only present when the UL has status RESOLVED.","type":"string"},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"linkedULs":{"description":"List of UGUIDs if ULs that were linked against this UL.","type":"array","items":{"type":"string"}},"fragment":{"$ref":"#/components/schemas/Fragment"},"ulAnalysis":{"$ref":"#/components/schemas/ULAnalysis"},"isSearchable":{"description":"Flag that indicates whether the UL's fragment is already registered and searchable.","type":"boolean"},"failReason":{"description":"If failed, this field indicates the reason.","type":"string"}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Fragment":{"type":"object","properties":{"id":{"description":"ID of the fragment.","type":"string"},"caseId":{"description":"ID of case the fragment is associated to.","type":"string"},"image":{"$ref":"#/components/schemas/Biometric"},"template":{"$ref":"#/components/schemas/Biometric"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ULAnalysis":{"type":"object","properties":{"user":{"description":"Username of user that solved UL.","type":"string"},"timestamp":{"description":"Timestamp, in milliseconds, of when UL was solved.","type":"integer","format":"int64"}}}}}}
```

## The ULAnalysis object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ULAnalysis":{"type":"object","properties":{"user":{"description":"Username of user that solved UL.","type":"string"},"timestamp":{"description":"Timestamp, in milliseconds, of when UL was solved.","type":"integer","format":"int64"}}}}}}
```

## The ListULCandidatesResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListULCandidatesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ULCandidate"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"ULCandidate":{"type":"object","properties":{"uguid":{"description":"Globally unique ID of the UL it has matched.","type":"string"},"status":{"description":"Matched UL status.","type":"string","enum":["UNSOLVED","SOLVED"]},"creationTime":{"description":"Timestamp, in milliseconds, of UL creation.","type":"string","format":"date-time"},"matchedPersonPguid":{"description":"PGUID of the person the UL candidate was matched against. Only present when the UL has status RESOLVED.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the UL candidate was matched against. Only present when the UL has status RESOLVED.","type":"string"},"caseId":{"description":"Case ID of the UL it has matched.","type":"string"},"fragmentId":{"description":"Fragment ID of the UL it has matched.","type":"string"},"fragmentIndex":{"description":"UL index that matched.","type":"integer","format":"int32"},"user":{"description":"User assigned to the matched UL.","type":"string"},"timestamp":{"description":"Timestamp in milliseconds of the match.","type":"string","format":"date-time"},"candidatePguid":{"description":"PGUID of the UL candidate.","type":"string"},"candidateTguid":{"description":"TGUID of the UL candidate.","type":"string"},"candidateIndex":{"description":"UL candidate index that matched.","type":"integer","format":"int32"},"score":{"description":"Score of the match.","type":"integer","format":"int32"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}}}}}
```

## The ULCandidate object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ULCandidate":{"type":"object","properties":{"uguid":{"description":"Globally unique ID of the UL it has matched.","type":"string"},"status":{"description":"Matched UL status.","type":"string","enum":["UNSOLVED","SOLVED"]},"creationTime":{"description":"Timestamp, in milliseconds, of UL creation.","type":"string","format":"date-time"},"matchedPersonPguid":{"description":"PGUID of the person the UL candidate was matched against. Only present when the UL has status RESOLVED.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the UL candidate was matched against. Only present when the UL has status RESOLVED.","type":"string"},"caseId":{"description":"Case ID of the UL it has matched.","type":"string"},"fragmentId":{"description":"Fragment ID of the UL it has matched.","type":"string"},"fragmentIndex":{"description":"UL index that matched.","type":"integer","format":"int32"},"user":{"description":"User assigned to the matched UL.","type":"string"},"timestamp":{"description":"Timestamp in milliseconds of the match.","type":"string","format":"date-time"},"candidatePguid":{"description":"PGUID of the UL candidate.","type":"string"},"candidateTguid":{"description":"TGUID of the UL candidate.","type":"string"},"candidateIndex":{"description":"UL candidate index that matched.","type":"integer","format":"int32"},"score":{"description":"Score of the match.","type":"integer","format":"int32"}}}}}}
```

## The CreateULsRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreateULsRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Fragment"},"meta":{"$ref":"#/components/schemas/ULValidation"}}},"Fragment":{"type":"object","properties":{"id":{"description":"ID of the fragment.","type":"string"},"caseId":{"description":"ID of case the fragment is associated to.","type":"string"},"image":{"$ref":"#/components/schemas/Biometric"},"template":{"$ref":"#/components/schemas/Biometric"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ULValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"}}}}}}
```

## The ULValidation object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ULValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"}}}}}}
```

## The CreateULsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreateULsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"uguid":{"description":"UGUID of target UL.","type":"string"}}}}}}}}
```

## The GetULsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetULsResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UL"}}},"UL":{"type":"object","properties":{"uguid":{"description":"Globally unique ID of the UL.","type":"string"},"status":{"description":"UL Status.","type":"string","enum":["UNSOLVED","SOLVED","ENQUEUED","FAILED"]},"creationTime":{"description":"Timestamp, in milliseconds, of UL creation.","type":"integer","format":"int64"},"personPguid":{"description":"PGUID of the person the UL was matched against. Only present when the UL has status RESOLVED.","type":"string"},"personTguid":{"description":"TGUID of the person the UL was matched against. Only present when the UL has status RESOLVED.","type":"string"},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"linkedULs":{"description":"List of UGUIDs if ULs that were linked against this UL.","type":"array","items":{"type":"string"}},"fragment":{"$ref":"#/components/schemas/Fragment"},"ulAnalysis":{"$ref":"#/components/schemas/ULAnalysis"},"isSearchable":{"description":"Flag that indicates whether the UL's fragment is already registered and searchable.","type":"boolean"},"failReason":{"description":"If failed, this field indicates the reason.","type":"string"}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"Fragment":{"type":"object","properties":{"id":{"description":"ID of the fragment.","type":"string"},"caseId":{"description":"ID of case the fragment is associated to.","type":"string"},"image":{"$ref":"#/components/schemas/Biometric"},"template":{"$ref":"#/components/schemas/Biometric"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ULAnalysis":{"type":"object","properties":{"user":{"description":"Username of user that solved UL.","type":"string"},"timestamp":{"description":"Timestamp, in milliseconds, of when UL was solved.","type":"integer","format":"int64"}}}}}}
```

## The SolveULsRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SolveULsRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"tguid":{"description":"TGUID of reference person to which the UL should be matched.","type":"string"},"user":{"description":"User that is solving UL.","type":"string"}}}}}}}}
```

## The DeleteULCandidatesRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"DeleteULCandidatesRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DeleteULCandidatesSpec"}}},"DeleteULCandidatesSpec":{"type":"object","properties":{"uguid":{"description":"UGUID of target UL.","type":"string"},"candidates":{"description":"Array of people whose biometric data matched with the biometric data.","type":"array","items":{"$ref":"#/components/schemas/ULCandidateIdentifier"}}}},"ULCandidateIdentifier":{"type":"object","properties":{"pguid":{"description":"PGUID of the target candidate.","type":"string"},"tguid":{"description":"TGUID of the target candidate.","type":"string"},"index":{"description":"Index of the target candidate.","type":"integer","format":"int32"}}}}}}
```

## The ULCandidateIdentifier object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ULCandidateIdentifier":{"type":"object","properties":{"pguid":{"description":"PGUID of the target candidate.","type":"string"},"tguid":{"description":"TGUID of the target candidate.","type":"string"},"index":{"description":"Index of the target candidate.","type":"integer","format":"int32"}}}}}}
```

## The DeleteULCandidatesSpec object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"DeleteULCandidatesSpec":{"type":"object","properties":{"uguid":{"description":"UGUID of target UL.","type":"string"},"candidates":{"description":"Array of people whose biometric data matched with the biometric data.","type":"array","items":{"$ref":"#/components/schemas/ULCandidateIdentifier"}}}},"ULCandidateIdentifier":{"type":"object","properties":{"pguid":{"description":"PGUID of the target candidate.","type":"string"},"tguid":{"description":"TGUID of the target candidate.","type":"string"},"index":{"description":"Index of the target candidate.","type":"integer","format":"int32"}}}}}}
```

## The EnrollRefusedReason object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"EnrollRefusedReason":{"type":"object","properties":{"matchedPeopleThatAreReferenceInSomeExceptionUnderAnalysis":{"description":"List of PGUID of the people that is the reference in some exception under analysis.","type":"array","items":{"type":"string"}},"matchedTransactionsThatHaveAnExceptionUnderAnalysis":{"description":"List of TGUID of entrant transactions with the exception under analysis.","type":"array","items":{"type":"string"}}}}}}}
```

## The GetVersion object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetVersion":{"type":"object","properties":{"data":{"type":"object","properties":{"api":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"}}},"searchEngine":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"}}}}}}}}}}
```

## The GroupEmail object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GroupEmail":{"type":"object","properties":{"data":{"type":"object","properties":{"name":{"description":"Name of the group","type":"string"},"enabled":{"description":"Enable or disable the send email service for this group.","type":"boolean"},"emails":{"description":"array of e-mails","type":"array","items":{"type":"string"}}}}}}}}}
```

## The CreateGroupEmailResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreateGroupEmailResponse":{"type":"object","properties":{"status":{"type":"string"},"data":{"type":"object","properties":{"name":{"description":"Name of the group","type":"string"},"enabled":{"description":"Enable or disable the send email service for this group.","type":"boolean"},"emails":{"description":"array of e-mails","type":"array","items":{"type":"string"}}}}}}}}}
```

## The UserGroup object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UserGroup":{"type":"object","properties":{"data":{"type":"object","properties":{"username":{"description":"Name of the user.","type":"string"},"groups":{"description":"Array of group name objects.","type":"array","items":{"type":"object","properties":{"name":{"type":"string"}}}}}}}}}}}
```

## The CreateUserEmailResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreateUserEmailResponse":{"type":"object","properties":{"status":{"type":"string"},"data":{"type":"object","properties":{"username":{"description":"Name of the user.","type":"string"},"groups":{"description":"Array of objects of groups","type":"array","items":{"type":"object","properties":{"name":{"type":"string"}}}}}}}}}}}
```

## The ConfigurationRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ConfigurationRequest":{"type":"object","properties":{"application":{"description":"Configuration mode for the application.","type":"string","enum":["GBDS_API","GBDS_DRIVER","GBDS_API_AND_DRIVER"]},"configurations":{"description":"Dictionary of configuration parameters and default values. It can contain multiple unique parameters as Strings.","type":"object"}}}}}}
```

## The TransparencyPeopleRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TransparencyPeopleRequest":{"type":"object","properties":{"pguid":{"description":"person global ID.","type":"string"},"action":{"description":"transparency action","type":"string","enum":["NOTIFY","CLASSIFIED","REMOVE"]},"enabled":{"type":"string"},"groups":{"description":"groups the pguid belongs to","type":"array","items":{"type":"object"}}}}}}}
```

## The TransparencyPeopleResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TransparencyPeopleResponse":{"type":"object","properties":{"status":{"type":"string","description":"transaction status."},"data":{"$ref":"#/components/schemas/TransparencyPeopleRequest"}}},"TransparencyPeopleRequest":{"type":"object","properties":{"pguid":{"description":"person global ID.","type":"string"},"action":{"description":"transparency action","type":"string","enum":["NOTIFY","CLASSIFIED","REMOVE"]},"enabled":{"type":"string"},"groups":{"description":"groups the pguid belongs to","type":"array","items":{"type":"object"}}}}}}}
```

## The GetTransparencyPeople object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetTransparencyPeople":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TransparencyPeopleRequest"}}}},"TransparencyPeopleRequest":{"type":"object","properties":{"pguid":{"description":"person global ID.","type":"string"},"action":{"description":"transparency action","type":"string","enum":["NOTIFY","CLASSIFIED","REMOVE"]},"enabled":{"type":"string"},"groups":{"description":"groups the pguid belongs to","type":"array","items":{"type":"object"}}}}}}}
```

## The GetMatcherStatusResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetMatcherStatusResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"configuredMatchers":{"description":"Number of matchers running on the cluster.","type":"integer","format":"int32"},"peopleCount":{"description":"Sum of all people in the nodes.","type":"integer","format":"int32"},"ulCount":{"description":"Sum of all ULs in the nodes.","type":"integer","format":"int32"},"nodes":{"description":"Array of nodes.","type":"array","items":{"type":"object","properties":{"hostname":{"description":"Name of the node.","type":"string"},"monitorPort":{"description":"Port of the GBDS Monitor service.","type":"integer","format":"int32"},"status":{"description":"Status of the node.","type":"string","enum":["NONE","SPRING_START","CLUSTER_ASSEMBLY","MATCHERS_ASSEMBLY","PEOPLE_BOOT","UL_BOOT","KAFKA_START","RUNNING","SHUTTING_DOWN"]},"configuredMatchers":{"description":"Number of matchers running on the node.","type":"integer","format":"int32"},"peopleCount":{"description":"Sum of all people in this node.","type":"integer","format":"int32"},"ulCount":{"description":"Sum of all ULs in this node.","type":"integer","format":"int32"},"memory":{"description":"Memory used by the node. Unused biometric modalities will not be shown.","$ref":"#/components/schemas/Memory"},"activeMatchers":{"description":"Matchers running on the node.","type":"array","items":{"type":"object","properties":{"name":{"description":"Name of the matcher.","type":"string"},"peopleCount":{"description":"Quantity of people in the matcher.","type":"integer","format":"int32"},"ulCount":{"description":"Quantity of ULs in the matcher.","type":"integer","format":"int32"},"memory":{"description":"Memory used by the matcher. Unused biometric modalities will not be shown.","$ref":"#/components/schemas/Memory"}}}}}}}}}}},"Memory":{"type":"object","properties":{"FINGERPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"PALMPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"NEWBORN":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"UL_FINGERPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"UL_PALMPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"FACE":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"IRIS":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}}}}}}}
```

## The Memory object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Memory":{"type":"object","properties":{"FINGERPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"PALMPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"NEWBORN":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"UL_FINGERPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"UL_PALMPRINT":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"FACE":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}},"IRIS":{"type":"object","properties":{"size":{"type":"integer","format":"int32"},"total":{"type":"integer","format":"int32"}}}}}}}}
```

## The GetGBDSStatusResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetGBDSStatusResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"configuredMatchers":{"description":"Number of matchers running on the cluster.","type":"integer","format":"int32"},"nodes":{"type":"array","items":{"type":"object","properties":{"hostname":{"description":"Name of the node.","type":"string"},"monitorPort":{"description":"Port of the GBDS Monitor service.","type":"integer","format":"int32"},"configuredMatchers":{"description":"Number of matchers running on the node.","type":"integer","format":"int32"}}}}}}}}}}}
```

## The ChangeLogLevel object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ChangeLogLevel":{"type":"object","properties":{"component":{"type":"string","enum":["API","DRIVER"]},"logLevel":{"type":"string","enum":["TRACE","DEBUG","INFO","WARN","ERROR","OFF","ALL"]}}}}}}
```

## The ChangeLogLevelRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ChangeLogLevelRequest":{"type":"object","properties":{"data":{"type":"array","writeOnly":true,"items":{"$ref":"#/components/schemas/ChangeLogLevel"}}}},"ChangeLogLevel":{"type":"object","properties":{"component":{"type":"string","enum":["API","DRIVER"]},"logLevel":{"type":"string","enum":["TRACE","DEBUG","INFO","WARN","ERROR","OFF","ALL"]}}}}}}
```

## The ExtractionServiceBean object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ExtractionServiceBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["GINGER","FACE","GIRL"]},"message":{"type":"string"}}}}}}
```

## The ListExtractionServicesResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListExtractionServicesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ExtractionServiceBean"}}}},"ExtractionServiceBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["GINGER","FACE","GIRL"]},"message":{"type":"string"}}}}}}
```

## The ExtractionServiceRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ExtractionServiceRequest":{"type":"object","properties":{"library":{"type":"string","enum":["GINGER","FACE","GIRL"]},"count":{"type":"integer","format":"int32"}}}}}}
```

## The ShutdownRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ShutdownRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"shouldShutdownAPI":{"type":"boolean"},"shouldShutdownDriver":{"type":"boolean"}}}}}}}}
```

## The QualityExtractionBean object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"QualityExtractionBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["FACE","FINGER"]},"message":{"type":"string"}}}}}}
```

## The QualityExtractionResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"QualityExtractionResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/QualityExtractionBean"}}}},"QualityExtractionBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["FACE","FINGER"]},"message":{"type":"string"}}}}}}
```

## The QualityExtractionRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"QualityExtractionRequest":{"type":"object","properties":{"library":{"type":"string","enum":["FINGER","FACE"]},"count":{"type":"integer","format":"int32"}}}}}}
```

## The API object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"API":{"type":"object","properties":{"apiId":{"type":"string","description":"Unique ID of the API instance."},"hostname":{"type":"string","description":"Hostname or IP Address of the node that is hosting the API instance."},"port":{"type":"integer","format":"int32","description":"Port mapped to the API instance."},"type":{"type":"string","enum":["LEADER","RUNNER"]}}}}}}
```

## The CreateAPIRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreateAPIRequest":{"type":"object","properties":{"data":{"type":"object","$ref":"#/components/schemas/API"}}},"API":{"type":"object","properties":{"apiId":{"type":"string","description":"Unique ID of the API instance."},"hostname":{"type":"string","description":"Hostname or IP Address of the node that is hosting the API instance."},"port":{"type":"integer","format":"int32","description":"Port mapped to the API instance."},"type":{"type":"string","enum":["LEADER","RUNNER"]}}}}}}
```

## The CreateAPIResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreateAPIResponse":{"type":"object","properties":{"status":{"type":"string","enum":["CREATED","UPDATED"]},"data":{"type":"object","$ref":"#/components/schemas/API"}}},"API":{"type":"object","properties":{"apiId":{"type":"string","description":"Unique ID of the API instance."},"hostname":{"type":"string","description":"Hostname or IP Address of the node that is hosting the API instance."},"port":{"type":"integer","format":"int32","description":"Port mapped to the API instance."},"type":{"type":"string","enum":["LEADER","RUNNER"]}}}}}}
```

## The ListAPIsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListAPIsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/API"}}}},"API":{"type":"object","properties":{"apiId":{"type":"string","description":"Unique ID of the API instance."},"hostname":{"type":"string","description":"Hostname or IP Address of the node that is hosting the API instance."},"port":{"type":"integer","format":"int32","description":"Port mapped to the API instance."},"type":{"type":"string","enum":["LEADER","RUNNER"]}}}}}}
```

## The TransactionReportResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TransactionReportResponse":{"type":"object","properties":{"data":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/ReportGroupedByAPIEnroll"},{"$ref":"#/components/schemas/ReportGroupedByAPISearch"},{"$ref":"#/components/schemas/ReportNotGroupedByAPIEnroll"},{"$ref":"#/components/schemas/ReportNotGroupedByAPISearch"}]}}}},"ReportGroupedByAPIEnroll":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]},"apiId":{"description":"API ID to group transactions.","type":"string"}}},"ReportGroupedByAPISearch":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["VERIFY","IDENTIFY"]},"latent":{"description":"Whether the transactions are latent searches or not.","type":"boolean"},"ul":{"description":"Whether the transactions are UL searches or not.","type":"boolean"},"apiId":{"description":"API ID to group transactions.","type":"string"}}},"ReportNotGroupedByAPIEnroll":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]}}},"ReportNotGroupedByAPISearch":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["VERIFY","IDENTIFY"]},"latent":{"description":"Whether the transactions are latent searches or not.","type":"boolean"},"ul":{"description":"Whether the transactions are UL searches or not.","type":"boolean"}}}}}}
```

## The ReportGroupedByAPIEnroll object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ReportGroupedByAPIEnroll":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]},"apiId":{"description":"API ID to group transactions.","type":"string"}}}}}}
```

## The ReportGroupedByAPISearch object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ReportGroupedByAPISearch":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["VERIFY","IDENTIFY"]},"latent":{"description":"Whether the transactions are latent searches or not.","type":"boolean"},"ul":{"description":"Whether the transactions are UL searches or not.","type":"boolean"},"apiId":{"description":"API ID to group transactions.","type":"string"}}}}}}
```

## The ReportNotGroupedByAPIEnroll object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ReportNotGroupedByAPIEnroll":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]}}}}}}
```

## The ReportNotGroupedByAPISearch object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ReportNotGroupedByAPISearch":{"type":"object","properties":{"count":{"description":"Sum of transactions of this type in during the specified period.","type":"integer","format":"int32"},"extractionTimeAvg":{"description":"Average time for template extraction.","type":"number","format":"double"},"extractionTimeMin":{"description":"Minimum time for template extraction.","type":"integer","format":"int32"},"extractionTimeMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"extractionQualityAvg":{"description":"Average time for quality extraction.","type":"number","format":"double"},"extractionQualityMin":{"description":"Minimum time for quality extraction.","type":"integer","format":"int32"},"extractionQualityMax":{"description":"Maximum time for template extraction.","type":"integer","format":"int32"},"matchAvg":{"description":"Average time for biometric comparison.","type":"number","format":"double"},"matchMin":{"description":"Minimum time for biometric comparison.","type":"integer","format":"int32"},"matchMax":{"description":"Maximum time for biometric comparison.","type":"integer","format":"int32"},"totalAvg":{"description":"Average time to complete a transaction.","type":"number","format":"double"},"totalMin":{"description":"Minimum time to complete a transaction.","type":"integer","format":"int32"},"totalMax":{"description":"Maximum time to complete a transaction.","type":"integer","format":"int32"},"type":{"description":"Transaction type.","type":"string","enum":["VERIFY","IDENTIFY"]},"latent":{"description":"Whether the transactions are latent searches or not.","type":"boolean"},"ul":{"description":"Whether the transactions are UL searches or not.","type":"boolean"}}}}}}
```

## The TrustedAddKeysResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TrustedAddKeysResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person to whom the keys were added.","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the current Person transaction that was changed.","type":"string"},"keys":{"description":"List of all keys of the Person, after new keys were added.","type":"array","items":{"$ref":"#/components/schemas/Key"}}}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}}}}}
```

## The BiographicBaseStatus object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]}}}}
```

## The LivenessCheckBiometric object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LivenessCheckBiometric":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained. The value must be `ORIGINAL`.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data. The value must be `FACE`.","type":"string","enum":["FACE"]},"format":{"description":"Format of the biometric data. `REQUIRED`.","type":"string","enum":["JPEG","JPEG2000","PNG","TIFF","GIF","BMP"]},"content":{"description":"Base64 encoded biometric data. `REQUIRED`.","type":"string"}}}}}}
```

## The LivenessCheckRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LivenessCheckRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/LivenessCheckBiometric"}}},"LivenessCheckBiometric":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained. The value must be `ORIGINAL`.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data. The value must be `FACE`.","type":"string","enum":["FACE"]},"format":{"description":"Format of the biometric data. `REQUIRED`.","type":"string","enum":["JPEG","JPEG2000","PNG","TIFF","GIF","BMP"]},"content":{"description":"Base64 encoded biometric data. `REQUIRED`.","type":"string"}}}}}}
```

## The LivenessCheckResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LivenessCheckResponse":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"}}}}}}
```

## The GetLivenessResultResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetLivenessResultResponse":{"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"biometric":{"description":"Biometric data used for the liveness verification.","$ref":"#/components/schemas/LivenessCheckBiometric"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"}}},"LivenessCheckBiometric":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained. The value must be `ORIGINAL`.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data. The value must be `FACE`.","type":"string","enum":["FACE"]},"format":{"description":"Format of the biometric data. `REQUIRED`.","type":"string","enum":["JPEG","JPEG2000","PNG","TIFF","GIF","BMP"]},"content":{"description":"Base64 encoded biometric data. `REQUIRED`.","type":"string"}}}}}}
```

## The BiographicBaseFlags object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}}}}}
```

## The UpdateBiographicsOnBiobaseRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdateBiographicsOnBiobaseRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/BioBaseBiographic"}}}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"BioBaseBiographic":{"type":"object","properties":{"id":{"type":"string","description":"Biographic key."},"type":{"type":"string","description":"Biographic type. It can be TEXT or FACE.","enum":["TEXT","FACE"]},"value":{"type":"string","description":"Biographic value. Faces are encoded in Base64."}}}}}}
```

## The TrustedAddKeysRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TrustedAddKeysRequest":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Key"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}}}}}
```

## The ForceBobFlag object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ForceBobFlag":{"type":"boolean","description":"Forces the use of Best of Biometrics (BoB).\n\nIf set to `true`, a trusted updated will be performed immediately after the update using the best biometric data available. <br>\nIf set to `false`, or absent, no action will be performed.\n\nAlso, the trusted update will only be performed if the update status is `ENROLLED`. Otherwise:\n- If the update status is `PENDING` (MIR), the trusted update will be performed only after the quality approval, if approved.\n- If the update status is `EXCEPTION` (ETR), the trusted update will be performed only after the exception is treated, if approved.\n\nIf the BoB trusted update is successfully performed (response 201 Enrolled), the response will contain some additional information:\n- `bobTguid`: transaction GUID of the BoB trusted update.\n- `bobStatus`: enroll status of the BoB trusted update. Usually `ENQUEUED`.\n\nThis behavior can be turned on/off using the RDB configuration on the table `gbds.settings`: <br>\n**gbds.bestOfBiometrics.forceUsingTrustedUpdate.enabled**, type **API**, default **true**.\n"}}}}
```

## The NotificationOperationEnum object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotificationOperationEnum":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION"]}}}}
```

## The NotificationObject object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotificationObject":{"type":"object","properties":{"operation":{"$ref":"#/components/schemas/NotificationOperationEnum","description":"Operation for TGUID."},"tguid":{"type":"string","format":"uuid","description":"Transaction GUID."},"newTguid":{"type":"string","format":"uuid","description":"New Transaction GUID, when it was edited during quality analysis."},"pguid":{"type":"string","format":"uuid","description":"Person GUID."},"enrollPguid":{"type":"string","format":"uuid","description":"Enroll Person GUID, when an exception treatment is performed."},"status":{"type":"string","description":"Status for TGUID."},"sender":{"type":"string","description":"Sender of the notification. `null` if the sender was GBDS."},"uguid":{"type":"string","format":"uuid","description":"UL GUID."},"treatment":{"type":"string","description":"Exception treatment."},"update":{"type":"boolean","description":"`true` if it is an update."},"trusted":{"type":"boolean","description":"On enrollment notifications, `true` if it is a trusted enroll."},"origin":{"type":"string","enum":["API","GBDS"],"description":"Indicates notification origin."},"additionalData":{"type":"object","description":"Map of strings with additional data.","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the notification transaction.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}},"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"timestamp":{"type":"integer","format":"int64"},"acks":{"description":"List of clients that have acknowledged the notification.","type":"array","items":{"type":"object","properties":{"client":{"type":"string","description":"Client name. Example: ETR, BEST."},"timestamp":{"type":"integer","format":"int64"},"comments":{"type":"string"}}}}}},"NotificationOperationEnum":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION"]},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```

## The SingleNotificationResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SingleNotificationResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotificationObject"}}},"NotificationObject":{"type":"object","properties":{"operation":{"$ref":"#/components/schemas/NotificationOperationEnum","description":"Operation for TGUID."},"tguid":{"type":"string","format":"uuid","description":"Transaction GUID."},"newTguid":{"type":"string","format":"uuid","description":"New Transaction GUID, when it was edited during quality analysis."},"pguid":{"type":"string","format":"uuid","description":"Person GUID."},"enrollPguid":{"type":"string","format":"uuid","description":"Enroll Person GUID, when an exception treatment is performed."},"status":{"type":"string","description":"Status for TGUID."},"sender":{"type":"string","description":"Sender of the notification. `null` if the sender was GBDS."},"uguid":{"type":"string","format":"uuid","description":"UL GUID."},"treatment":{"type":"string","description":"Exception treatment."},"update":{"type":"boolean","description":"`true` if it is an update."},"trusted":{"type":"boolean","description":"On enrollment notifications, `true` if it is a trusted enroll."},"origin":{"type":"string","enum":["API","GBDS"],"description":"Indicates notification origin."},"additionalData":{"type":"object","description":"Map of strings with additional data.","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the notification transaction.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}},"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"timestamp":{"type":"integer","format":"int64"},"acks":{"description":"List of clients that have acknowledged the notification.","type":"array","items":{"type":"object","properties":{"client":{"type":"string","description":"Client name. Example: ETR, BEST."},"timestamp":{"type":"integer","format":"int64"},"comments":{"type":"string"}}}}}},"NotificationOperationEnum":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION"]},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```

## The MultipleNotificationsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"MultipleNotificationsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotificationObject"}},"pagination":{"type":"object","properties":{"total":{"type":"integer","description":"Total number of notifications with the given filters."},"count":{"type":"integer","description":"Number of notifications in the current page."},"pageSize":{"type":"integer","description":"Number of notifications per page."},"currentPage":{"type":"integer","description":"Current page number. Zero-based."},"totalPages":{"type":"integer","description":"Total number of pages. Starts at 1."}}}}},"NotificationObject":{"type":"object","properties":{"operation":{"$ref":"#/components/schemas/NotificationOperationEnum","description":"Operation for TGUID."},"tguid":{"type":"string","format":"uuid","description":"Transaction GUID."},"newTguid":{"type":"string","format":"uuid","description":"New Transaction GUID, when it was edited during quality analysis."},"pguid":{"type":"string","format":"uuid","description":"Person GUID."},"enrollPguid":{"type":"string","format":"uuid","description":"Enroll Person GUID, when an exception treatment is performed."},"status":{"type":"string","description":"Status for TGUID."},"sender":{"type":"string","description":"Sender of the notification. `null` if the sender was GBDS."},"uguid":{"type":"string","format":"uuid","description":"UL GUID."},"treatment":{"type":"string","description":"Exception treatment."},"update":{"type":"boolean","description":"`true` if it is an update."},"trusted":{"type":"boolean","description":"On enrollment notifications, `true` if it is a trusted enroll."},"origin":{"type":"string","enum":["API","GBDS"],"description":"Indicates notification origin."},"additionalData":{"type":"object","description":"Map of strings with additional data.","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the notification transaction.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}},"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"timestamp":{"type":"integer","format":"int64"},"acks":{"description":"List of clients that have acknowledged the notification.","type":"array","items":{"type":"object","properties":{"client":{"type":"string","description":"Client name. Example: ETR, BEST."},"timestamp":{"type":"integer","format":"int64"},"comments":{"type":"string"}}}}}},"NotificationOperationEnum":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION"]},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```

## The ListNotificationsErrorResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListNotificationsErrorResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}
```

## The GetNotificationErrorResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetNotificationErrorResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object","properties":{"nguid":{"type":"string","format":"uuid"}}}}}}}}}}}
```

## The AcknowledgeNotificationRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"AcknowledgeNotificationRequest":{"type":"object","properties":{"nguid":{"type":"string","format":"uuid","description":"Notification GUID."},"client":{"type":"string","description":"Name of the client that is acknowledging the notification. Example: ETR, BEST."},"comments":{"type":"string","description":"Comments from the client about the notification. *(optional)*"}}}}}}
```

## The AcknowledgeNotificationByTguidRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"AcknowledgeNotificationByTguidRequest":{"type":"object","properties":{"tguid":{"type":"string","format":"uuid","description":"Notification GUID."},"client":{"type":"string","description":"Name of the client that is acknowledging the notification. Example: ETR, BEST."},"comments":{"type":"string","description":"Comments from the client about the notification. *(optional)*"}}}}}}
```

## The AcknowledgeNotificationErrorResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"AcknowledgeNotificationErrorResponse":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object","properties":{"nguid":{"type":"string","format":"uuid"}}}}}}}}}}}
```

## The SearchMetadata object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SearchMetadata":{"description":"Additional information.","type":"object","additionalProperties":{"description":"A flexible key-value pair where the key is a string."}}}}}
```

## The QualityControl object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"QualityControl":{"type":"object","properties":{"tguid":{"description":"Transaction GUID.","type":"string","format":"uuid"},"pguid":{"description":"Person GUID.","type":"string","format":"uuid"},"created":{"description":"Creation timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"updated":{"description":"Update timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"qualityStatus":{"description":"Quality status.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"enrollStatus":{"description":"Enroll status.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","REFUSED","PENDING","RESENT_ENROLL"]},"person":{"description":"A summary of the person (some fields may be omitted).","allOf":[{"$ref":"#/components/schemas/Person"}]},"transactionType":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]},"issues":{"type":"object","description":"Number of issues found per type.","properties":{"lowQuality":{"type":"integer","description":"Number of quality issues."},"duplication":{"type":"integer","description":"Number of duplication issues."},"sequenceControl":{"type":"integer","description":"Number of sequence control issues."}}},"apiID":{"description":"API ID","type":"string","format":"uuid"},"gbdsVersion":{"description":"GBDS Version","type":"string"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]}}}}
```

## The GetQualityControlResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetQualityControlResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/QualityControl"}}},"QualityControl":{"type":"object","properties":{"tguid":{"description":"Transaction GUID.","type":"string","format":"uuid"},"pguid":{"description":"Person GUID.","type":"string","format":"uuid"},"created":{"description":"Creation timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"updated":{"description":"Update timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"qualityStatus":{"description":"Quality status.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"enrollStatus":{"description":"Enroll status.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","REFUSED","PENDING","RESENT_ENROLL"]},"person":{"description":"A summary of the person (some fields may be omitted).","allOf":[{"$ref":"#/components/schemas/Person"}]},"transactionType":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]},"issues":{"type":"object","description":"Number of issues found per type.","properties":{"lowQuality":{"type":"integer","description":"Number of quality issues."},"duplication":{"type":"integer","description":"Number of duplication issues."},"sequenceControl":{"type":"integer","description":"Number of sequence control issues."}}},"apiID":{"description":"API ID","type":"string","format":"uuid"},"gbdsVersion":{"description":"GBDS Version","type":"string"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]}}}}
```

## The ListQualityControlResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListQualityControlResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/QualityControl"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"QualityControl":{"type":"object","properties":{"tguid":{"description":"Transaction GUID.","type":"string","format":"uuid"},"pguid":{"description":"Person GUID.","type":"string","format":"uuid"},"created":{"description":"Creation timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"updated":{"description":"Update timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"qualityStatus":{"description":"Quality status.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"enrollStatus":{"description":"Enroll status.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","REFUSED","PENDING","RESENT_ENROLL"]},"person":{"description":"A summary of the person (some fields may be omitted).","allOf":[{"$ref":"#/components/schemas/Person"}]},"transactionType":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]},"issues":{"type":"object","description":"Number of issues found per type.","properties":{"lowQuality":{"type":"integer","description":"Number of quality issues."},"duplication":{"type":"integer","description":"Number of duplication issues."},"sequenceControl":{"type":"integer","description":"Number of sequence control issues."}}},"apiID":{"description":"API ID","type":"string","format":"uuid"},"gbdsVersion":{"description":"GBDS Version","type":"string"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}}}}}
```

## The APIBean object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"APIBean":{"type":"object","properties":{"apiId":{"type":"string"},"hostname":{"type":"string"},"port":{"type":"integer","format":"int32"},"type":{"type":"string","enum":["LEADER","RUNNER"]},"rdbWriters":{"type":"integer","format":"int32"}}}}}}
```

## The APIEnrollRefusedReason object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"APIEnrollRefusedReason":{"type":"object","properties":{"type":{"type":"string","enum":["MATCHES_PERSONS_INVOLVED_IN_EXCEPTIONS_UNDER_ANALYSIS"]},"matchedPeopleThatAreReferenceInSomeExceptionUnderAnalysis":{"type":"array","items":{"type":"string"}},"matchedTransactionsThatHaveAnExceptionUnderAnalysis":{"type":"array","items":{"type":"string"}},"description":{"type":"string"}}}}}}
```

## The APIRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"APIRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/APIBean"}}},"APIBean":{"type":"object","properties":{"apiId":{"type":"string"},"hostname":{"type":"string"},"port":{"type":"integer","format":"int32"},"type":{"type":"string","enum":["LEADER","RUNNER"]},"rdbWriters":{"type":"integer","format":"int32"}}}}}}
```

## The APIResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"APIResponse":{"type":"object","properties":{"status":{"type":"string","enum":["CREATED","UPDATED"]},"data":{"$ref":"#/components/schemas/APIBean"}}},"APIBean":{"type":"object","properties":{"apiId":{"type":"string"},"hostname":{"type":"string"},"port":{"type":"integer","format":"int32"},"type":{"type":"string","enum":["LEADER","RUNNER"]},"rdbWriters":{"type":"integer","format":"int32"}}}}}}
```

## The AckNotificationRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"AckNotificationRequest":{"type":"object","properties":{"nguid":{"type":"string"},"client":{"type":"string"},"comments":{"type":"string"}}}}}}
```

## The AckNotificationTguidRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"AckNotificationTguidRequest":{"type":"object","properties":{"tguid":{"type":"string"},"client":{"type":"string"},"comments":{"type":"string"}}}}}}
```

## The AddKeysRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"AddKeysRequest":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Key"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}}}}}
```

## The AndRestriction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"AndRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/Restriction"}]},"Restriction":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The BiobaseUpdateRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"BiobaseUpdateRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Data"}}},"Data":{"type":"object","properties":{"api":{"$ref":"#/components/schemas/VersionInfo"},"searchEngine":{"$ref":"#/components/schemas/VersionInfo"}}},"VersionInfo":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"},"apiType":{"type":"string","enum":["LEADER","RUNNER"]}}}}}}
```

## The BiographicBaseMeta object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"BiographicBaseMeta":{"type":"object","properties":{"autoUpdate":{"type":"boolean"},"sendPguidAsKey":{"type":"boolean"},"sendTguidAsKey":{"type":"boolean"}}}}}}
```

## The BiographicRestriction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"BiographicRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/Restriction"},{"type":"object","properties":{"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}}]},"Restriction":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The ConfigurationResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ConfigurationResponse":{"type":"object","properties":{"configurations":{"type":"object","additionalProperties":{"type":"string"}},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The CountExceptionBiometricRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CountExceptionBiometricRequest":{"type":"object","properties":{"user":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}}}}}}}
```

## The CountExceptionBiometricResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CountExceptionBiometricResponse":{"type":"object","properties":{"remaining":{"type":"object","additionalProperties":{"type":"integer","format":"int64"}},"doneByTheDay":{"type":"object","additionalProperties":{"type":"integer","format":"int64"}},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The CountExceptionGroupRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CountExceptionGroupRequest":{"type":"object","properties":{"user":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"origin":{"type":"string","enum":["ENTRANT","BOTH"]}}}}}}
```

## The CountExceptionGroupResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CountExceptionGroupResponse":{"type":"object","properties":{"remaining":{"type":"object","additionalProperties":{"type":"integer","format":"int64"}},"doneByTheDay":{"type":"object","additionalProperties":{"type":"integer","format":"int64"}},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The CreatePeopleTrustedValidatedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreatePeopleTrustedValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Person"},"meta":{"$ref":"#/components/schemas/TrustedEnrollMeta"},"metaIfNotNull":{"$ref":"#/components/schemas/TrustedEnrollMeta"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"TrustedEnrollMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"active":{"description":"Determines if the biometric sent will be loaded into RAM and be available for Search and biometric validation.","type":"boolean"},"externalIDs":{"description":"a","type":"array","items":{"$ref":"#/components/schemas/ExternalIDRequest"}},"labelsOperation":{"description":"a","type":"string","enum":["REPLACE","ACCUMULATE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalIDRequest":{"type":"object","properties":{"name":{"type":"string"},"keys":{"type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}}}}}
```

## The CreatePeopleValidatedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreatePeopleValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Person"},"meta":{"$ref":"#/components/schemas/BiometricValidation"},"biometricValidationIfNotNull":{"$ref":"#/components/schemas/BiometricValidation"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"BiometricValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"validationType":{"description":"Defines the type of biometric validation to be performed against the AFIS.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"externalIDs":{"description":"List of externalIDs related to this transaction.","type":"array","items":{"$ref":"#/components/schemas/ExternalID"}},"labels":{"type":"string","enum":["ACCUMULATE","REPLACE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}}}}}
```

## The CreateSearchesValidatedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"CreateSearchesValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SearchSpec"},"meta":{"$ref":"#/components/schemas/SearchMeta"},"subject":{"$ref":"#/components/schemas/Subject"},"remoteAddr":{"type":"string"},"deviceId":{"type":"string"},"nonce":{"type":"array","items":{"type":"string","format":"byte"}},"verify":{"type":"boolean"},"timeout":{"type":"integer","format":"int32"},"validatedMeta":{"$ref":"#/components/schemas/ValidatedSearchMeta"},"searchType":{"type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"validatedSearchSpec":{"$ref":"#/components/schemas/ValidatedSearchSpec"},"priority":{"type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]}}},"SearchSpec":{"type":"object","properties":{"searchType":{"description":"Type of finger to be searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometric":{"description":"If only one biometric is provided, a match score will be returned. If more than one biometric is provided, a list of candidates can be retrieved using getSearchResult.","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"pguids":{"description":"This field is a list of PGUIDs. If the list is empty or null, the search will be against the entire database. If it has only one PGUID, the search will be 1:1. It is possible to make 1:1 searches with more than one PGUID.","type":"array","items":{"type":"string"}},"labelFilters":{"description":"Used for 1:N operations. The filters will be compared with the labels field registered by the enroll method.","uniqueItems":true,"type":"array","items":{"type":"string"}},"isLatentSearch":{"description":"Flag indicating if the search is a Latent Search.","type":"boolean"},"isULSearch":{"description":"Flag indicating if the search is an UL Search.","type":"boolean"},"numberOfCandidates":{"description":"Number of candidates to be returned.","type":"integer","format":"int32"},"classificationThreshold":{"description":"Threshold for either classifying biometric data or marking it as UNKNOWN.","type":"integer","format":"int32"},"classifications":{"description":"Vector containing the classifications to be considered. Defaults to UNKNOWN.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["PLAIN_ARCH","LEFT_LOOP","RIGHT_LOOP","WHORL","SCAR","UNKNOWN","AMPUTATION","OTHER"]}},"singularities":{"description":"Singularities to be considered. Defaults to NONE.","type":"string","enum":["NONE","NO_DELTA_ALL_CORES","ONE_DELTA_NO_CORES","ONE_DELTA_ALL_CORES"]},"latentSearchOptions":{"$ref":"#/components/schemas/LatentSearchOptions"},"searchOptions":{"$ref":"#/components/schemas/SearchOptions"},"user":{"type":"string"},"uguids":{"description":"Globally unique ID of the UL. Can be a list of uguids.","type":"array","items":{"type":"string"}},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned.","type":"boolean"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"LatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"}}},"SearchOptions":{"type":"object","properties":{"biometricType":{"description":"biometricType must contain its data and be one of the following values - FINGERPRINT, PALMPRINT, FACE, IRIS, NEWBORN_PALMPRINT, i.e., you must substitute the \"biometricType\" field name by one of the ENUM names.","type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"},"matcher":{"description":"Define which ginger preset will be used.","type":"string","enum":["DEFAULT","MOBILE"]}}}}},"SearchMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"metadata":{"$ref":"#/components/schemas/SearchMetadata"},"verifyResult":{"type":"boolean","description":"Flag to request the result of the Verification call (Verify - when keys and/or PGUIDs are provided). Default: `false`.\n\nIf `false`, the Verify will return:\n- `tguid`\n- `status`\n- `score` (if only one biometric was provided in the request payload and the `searchType` is `SAME_FINGERS`; if more than one biometric was provided, the score will not be returned)\n- `bonafideScore` (for faces, if the data->`liveness` flag is set to `true` in the request payload)\n\nIf `true`, the Verify will return all above plus:\n- `candidates` (if more than one biometric is provided, candidates will be returned and the score will not be returned)\n- `progress`\n- `searchType`\n- `metadata`\n- `apiID`\n- `gbdsVersion`\n- `extractionElapsed`\n- `searchElapsed`\n- `postSearchElapsed`\n- `ulsearch`\n- `latentSearch`\n\nPS: `biometrics` are never returned in the response.\n"}}},"SearchMetadata":{"description":"Additional information.","type":"object","additionalProperties":{"description":"A flexible key-value pair where the key is a string."}},"Subject":{"type":"object","properties":{"name":{"type":"string"},"roles":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/Role"}},"permissions":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/Permission"}}}},"Role":{"type":"object"},"Permission":{"type":"object"},"ValidatedSearchMeta":{"type":"object","properties":{"timeout":{"type":"integer","format":"int32"},"priority":{"type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"verifyResult":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":{"type":"object"}},"priorityIfNotNull":{"type":"string","writeOnly":true,"enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"timeoutIfNotNull":{"type":"integer","format":"int32","writeOnly":true}}},"ValidatedSearchSpec":{"type":"object","properties":{"searchType":{"type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"pguids":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"uguids":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"labelFilters":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"isLatentSearch":{"type":"boolean"},"isULSearch":{"type":"boolean"},"numberOfCandidates":{"type":"integer","format":"int32"},"classificationThreshold":{"type":"integer","format":"int32"},"classifications":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["PLAIN_ARCH","LEFT_LOOP","RIGHT_LOOP","WHORL","SCAR","UNKNOWN","AMPUTATION","OTHER"]}},"singularities":{"type":"string","enum":["NONE","NO_DELTA_ALL_CORES","ONE_DELTA_NO_CORES","ONE_DELTA_ALL_CORES"]},"latentSearchOptions":{"$ref":"#/components/schemas/LatentSearchOptions"},"searchOptions":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SearchOptions"}},"liveness":{"type":"boolean"},"user":{"type":"string"},"validatedLatentSearchOptions":{"$ref":"#/components/schemas/ValidatedLatentSearchOptions"},"searchOptionsIfnOtNull":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SearchOptions"},"writeOnly":true},"verify":{"type":"boolean"}}},"ValidatedLatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"type":"integer","format":"int32"},"rotationAngleThreshold":{"type":"integer","format":"int32"},"default":{"type":"boolean"}}}}}}
```

## The Data object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Data":{"type":"object","properties":{"api":{"$ref":"#/components/schemas/VersionInfo"},"searchEngine":{"$ref":"#/components/schemas/VersionInfo"}}},"VersionInfo":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"},"apiType":{"type":"string","enum":["LEADER","RUNNER"]}}}}}}
```

## The DeleteBiometricTransactionEvent object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"DeleteBiometricTransactionEvent":{"type":"object","allOf":[{"$ref":"#/components/schemas/HistoryEvent"},{"type":"object","properties":{"biometricIndex":{"type":"integer","format":"int32"}}}]},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The DeleteULCandidatesValidatedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"DeleteULCandidatesValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ValidatedDeleteULCandidatesSpec"}}},"ValidatedDeleteULCandidatesSpec":{"type":"object","properties":{"uguid":{"type":"string"},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/ULCandidateIdentifier"}},"uguidIfNotNull":{"type":"string","writeOnly":true},"candidatesIfNotNull":{"type":"array","writeOnly":true,"items":{"$ref":"#/components/schemas/ULCandidateIdentifier"}}}},"ULCandidateIdentifier":{"type":"object","properties":{"pguid":{"description":"PGUID of the target candidate.","type":"string"},"tguid":{"description":"TGUID of the target candidate.","type":"string"},"index":{"description":"Index of the target candidate.","type":"integer","format":"int32"}}}}}}
```

## The DisableTransactionEvent object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"DisableTransactionEvent":{"type":"object","allOf":[{"$ref":"#/components/schemas/HistoryEvent"},{"type":"object","properties":{"targetTguid":{"type":"string"}}}]},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The DriverInfo object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"DriverInfo":{"type":"object","properties":{"configuredMatchers":{"type":"integer","format":"int64"},"peopleCount":{"type":"integer","format":"int64"},"ulCount":{"type":"integer","format":"int64"},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/NodeInfo"}}}},"NodeInfo":{"type":"object","properties":{"hostname":{"type":"string"},"monitorPort":{"type":"integer","format":"int32"},"status":{"type":"string","enum":["NONE","SPRING_START","CLUSTER_ASSEMBLY","MATCHERS_ASSEMBLY","PEOPLE_BOOT","UL_BOOT","KAFKA_START","RUNNING","SHUTTING_DOWN"]},"configuredMatchers":{"type":"integer","format":"int64"},"peopleCount":{"type":"integer","format":"int64"},"ulCount":{"type":"integer","format":"int64"},"memory":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SizeInfo"}},"activeMatchers":{"type":"array","items":{"$ref":"#/components/schemas/MatcherInfo"}}}},"SizeInfo":{"type":"object","properties":{"size":{"type":"integer","format":"int64"},"total":{"type":"integer","format":"int64"}}},"MatcherInfo":{"type":"object","properties":{"name":{"type":"string"},"peopleCount":{"type":"integer","format":"int64"},"ulCount":{"type":"integer","format":"int64"},"memory":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SizeInfo"}}}}}}}
```

## The DriverStatusResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"DriverStatusResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DriverInfo"}}},"DriverInfo":{"type":"object","properties":{"configuredMatchers":{"type":"integer","format":"int64"},"peopleCount":{"type":"integer","format":"int64"},"ulCount":{"type":"integer","format":"int64"},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/NodeInfo"}}}},"NodeInfo":{"type":"object","properties":{"hostname":{"type":"string"},"monitorPort":{"type":"integer","format":"int32"},"status":{"type":"string","enum":["NONE","SPRING_START","CLUSTER_ASSEMBLY","MATCHERS_ASSEMBLY","PEOPLE_BOOT","UL_BOOT","KAFKA_START","RUNNING","SHUTTING_DOWN"]},"configuredMatchers":{"type":"integer","format":"int64"},"peopleCount":{"type":"integer","format":"int64"},"ulCount":{"type":"integer","format":"int64"},"memory":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SizeInfo"}},"activeMatchers":{"type":"array","items":{"$ref":"#/components/schemas/MatcherInfo"}}}},"SizeInfo":{"type":"object","properties":{"size":{"type":"integer","format":"int64"},"total":{"type":"integer","format":"int64"}}},"MatcherInfo":{"type":"object","properties":{"name":{"type":"string"},"peopleCount":{"type":"integer","format":"int64"},"ulCount":{"type":"integer","format":"int64"},"memory":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SizeInfo"}}}}}}}
```

## The EnrollTransactionEvent object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"EnrollTransactionEvent":{"type":"object","allOf":[{"$ref":"#/components/schemas/HistoryEvent"}]},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The Error object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Error":{"required":["type"],"type":"object","properties":{"message":{"type":"string"},"meta":{"$ref":"#/components/schemas/ResponseMeta"},"type":{"type":"string"}},"discriminator":{"propertyName":"type"}},"ResponseMeta":{"type":"object","properties":{"tguidsWithError":{"description":"Array containing TGUID for transactions, of the requested page, which had errors during retrieval and thus are NOT present in the returned page.","type":"array","items":{"type":"string"}}}}}}}
```

## The ExceptionGroup object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ExceptionGroup":{"type":"object","properties":{"gguid":{"type":"string"},"tguid":{"type":"string"},"target":{"type":"string","enum":["BIOGRAPHIC","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH"]},"decision":{"type":"string","enum":["APPROVE","REJECT","KEEP"]},"status":{"type":"string","enum":["ANALYSIS","PENDING","READY","PROCESSING","DONE","REFUSED","ERROR"]},"priority":{"type":"boolean"},"organizations":{"type":"array","items":{"$ref":"#/components/schemas/Organization"}},"created":{"type":"string","format":"date-time"},"updated":{"type":"string","format":"date-time"},"user":{"type":"string"},"comments":{"type":"string"},"message":{"type":"string"},"parameters":{"$ref":"#/components/schemas/GroupDecisionParameters"},"lightsOutCriteria":{"$ref":"#/components/schemas/LightsOutCriteria"},"lockedUser":{"type":"string"},"lockedTimestamp":{"type":"string","format":"date-time"},"lockedTimeout":{"type":"string","format":"date-time"},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/Exception"}},"newTguid":{"type":"string"},"refusedStatus":{"type":"string","enum":["CREATED","REMOVED","READY_TO_RESEND","SENDING","SENT","ERROR"]},"refusedNewTguid":{"type":"string"},"refusedGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}},"holdingGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}}}},"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}},"GroupDecisionParameters":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"labels":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"keepTransactions":{"type":"array","items":{"type":"string"}},"removeTransactions":{"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"LightsOutCriteria":{"type":"object","properties":{"nonConflitantKeys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"weakKeys":{"type":"array","items":{"type":"string"}},"matchedBiographics":{"type":"array","items":{"type":"string"}}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}}}}}
```

## The ExtNotification object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ExtNotification":{"type":"object","properties":{"operation":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY","CREATE_EXCEPTION","CREATE_EXCEPTION_GROUP","PRIORITY_EXCEPTION","PRIORITY_EXCEPTION_GROUP","TREAT_EXCEPTION_BIOMETRIC","TREAT_EXCEPTION_GROUP","CHANGE_REFUSED_STATUS","RESEND_REFUSED","LIGHTS_OUT"]},"tguid":{"type":"string"},"status":{"type":"string"},"sender":{"type":"string"},"uguid":{"type":"string"},"externalIDs":{"type":"array","items":{"$ref":"#/components/schemas/NotificationExternalID"}},"relatedExternalIDs":{"type":"array","items":{"$ref":"#/components/schemas/NotificationExternalID"}},"keptTguids":{"type":"array","items":{"type":"string"}},"additionalData":{"type":"object","additionalProperties":{"type":"string"},"writeOnly":true},"nguid":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"acks":{"type":"array","items":{"$ref":"#/components/schemas/NotificationAck"}},"pguid":{"type":"string"},"newTguid":{"type":"string"},"enrollPguid":{"type":"string"},"treatment":{"type":"string"},"update":{"type":"boolean"},"trusted":{"type":"boolean"},"origin":{"type":"string","enum":["GBDS","API"]}}},"NotificationExternalID":{"type":"object","properties":{"name":{"type":"string"},"key":{"type":"string"}}},"NotificationAck":{"type":"object","properties":{"client":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"comments":{"type":"string"}}}}}}
```

## The ExtractionIssue object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ExtractionIssue":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"message":{"type":"string"}}}}}}
```

## The ExtractionRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ExtractionRequest":{"type":"object","properties":{"verify":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Person"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]}}}}
```

## The ExtractionResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ExtractionResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Person"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]}}}}
```

## The FixUpdateResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"FixUpdateResponse":{"type":"object","properties":{"removeKeys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"removedLabels":{"type":"array","items":{"type":"string"}},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The GetExceptionGroupResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetExceptionGroupResponse":{"type":"object","properties":{"remaining":{"type":"integer","format":"int64"},"treatable":{"type":"boolean"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"$ref":"#/components/schemas/ExceptionGroup"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"ExceptionGroup":{"type":"object","properties":{"gguid":{"type":"string"},"tguid":{"type":"string"},"target":{"type":"string","enum":["BIOGRAPHIC","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH"]},"decision":{"type":"string","enum":["APPROVE","REJECT","KEEP"]},"status":{"type":"string","enum":["ANALYSIS","PENDING","READY","PROCESSING","DONE","REFUSED","ERROR"]},"priority":{"type":"boolean"},"organizations":{"type":"array","items":{"$ref":"#/components/schemas/Organization"}},"created":{"type":"string","format":"date-time"},"updated":{"type":"string","format":"date-time"},"user":{"type":"string"},"comments":{"type":"string"},"message":{"type":"string"},"parameters":{"$ref":"#/components/schemas/GroupDecisionParameters"},"lightsOutCriteria":{"$ref":"#/components/schemas/LightsOutCriteria"},"lockedUser":{"type":"string"},"lockedTimestamp":{"type":"string","format":"date-time"},"lockedTimeout":{"type":"string","format":"date-time"},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/Exception"}},"newTguid":{"type":"string"},"refusedStatus":{"type":"string","enum":["CREATED","REMOVED","READY_TO_RESEND","SENDING","SENT","ERROR"]},"refusedNewTguid":{"type":"string"},"refusedGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}},"holdingGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}}}},"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}},"GroupDecisionParameters":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"labels":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"keepTransactions":{"type":"array","items":{"type":"string"}},"removeTransactions":{"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"LightsOutCriteria":{"type":"object","properties":{"nonConflitantKeys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"weakKeys":{"type":"array","items":{"type":"string"}},"matchedBiographics":{"type":"array","items":{"type":"string"}}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}}}}}
```

## The GetNextBiometricRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetNextBiometricRequest":{"type":"object","properties":{"user":{"type":"string"},"order":{"type":"string","enum":["ASC","DESC"]},"permissions":{"type":"array","items":{"type":"string"}},"modality":{"type":"string","enum":["FINGERPRINT","FACE"]},"origin":{"type":"string","enum":["ENTRANT","BOTH"]}}}}}}
```

## The GetNextGroupRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetNextGroupRequest":{"type":"object","properties":{"user":{"type":"string"},"order":{"type":"string","enum":["ASC","DESC"]},"permissions":{"type":"array","items":{"type":"string"}},"origin":{"type":"string","enum":["ENTRANT","BOTH"]},"pending":{"type":"boolean"}}}}}}
```

## The GetNotificationResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GetNotificationResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ExtNotification"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"ExtNotification":{"type":"object","properties":{"operation":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY","CREATE_EXCEPTION","CREATE_EXCEPTION_GROUP","PRIORITY_EXCEPTION","PRIORITY_EXCEPTION_GROUP","TREAT_EXCEPTION_BIOMETRIC","TREAT_EXCEPTION_GROUP","CHANGE_REFUSED_STATUS","RESEND_REFUSED","LIGHTS_OUT"]},"tguid":{"type":"string"},"status":{"type":"string"},"sender":{"type":"string"},"uguid":{"type":"string"},"externalIDs":{"type":"array","items":{"$ref":"#/components/schemas/NotificationExternalID"}},"relatedExternalIDs":{"type":"array","items":{"$ref":"#/components/schemas/NotificationExternalID"}},"keptTguids":{"type":"array","items":{"type":"string"}},"additionalData":{"type":"object","additionalProperties":{"type":"string"},"writeOnly":true},"nguid":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"acks":{"type":"array","items":{"$ref":"#/components/schemas/NotificationAck"}},"pguid":{"type":"string"},"newTguid":{"type":"string"},"enrollPguid":{"type":"string"},"treatment":{"type":"string"},"update":{"type":"boolean"},"trusted":{"type":"boolean"},"origin":{"type":"string","enum":["GBDS","API"]}}},"NotificationExternalID":{"type":"object","properties":{"name":{"type":"string"},"key":{"type":"string"}}},"NotificationAck":{"type":"object","properties":{"client":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"comments":{"type":"string"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The GroupDecisionParameters object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"GroupDecisionParameters":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"labels":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"keepTransactions":{"type":"array","items":{"type":"string"}},"removeTransactions":{"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}}}}}
```

## The HttpResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The IncorrectEnrollTreatmentEvent object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"IncorrectEnrollTreatmentEvent":{"type":"object","allOf":[{"$ref":"#/components/schemas/HistoryEvent"}]},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The Issues object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Issues":{"type":"object","properties":{"lowQuality":{"type":"integer","format":"int32"},"duplication":{"type":"integer","format":"int32"},"sequenceControl":{"type":"integer","format":"int32"}}}}}}
```

## The KeyFormat object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"KeyFormat":{"type":"object","properties":{"keyId":{"type":"string"},"formatType":{"type":"string","enum":["TITULO","CPF","ALPHANUMERIC","NUMERIC","ALPHABETIC","REGEX"]},"regex":{"type":"string"},"minLength":{"type":"integer","format":"int32"},"maxLength":{"type":"integer","format":"int32"}}}}}}
```

## The KeyFormatResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"KeyFormatResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"$ref":"#/components/schemas/KeyFormat"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"KeyFormat":{"type":"object","properties":{"keyId":{"type":"string"},"formatType":{"type":"string","enum":["TITULO","CPF","ALPHANUMERIC","NUMERIC","ALPHABETIC","REGEX"]},"regex":{"type":"string"},"minLength":{"type":"integer","format":"int32"},"maxLength":{"type":"integer","format":"int32"}}}}}}
```

## The KeyRestriction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"KeyRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/Restriction"},{"type":"object","properties":{"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}}]},"Restriction":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The LabelRestriction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LabelRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/Restriction"},{"type":"object","properties":{"label":{"type":"string"},"exists":{"type":"boolean"}}}]},"Restriction":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The LightsOutCriteria object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LightsOutCriteria":{"type":"object","properties":{"nonConflitantKeys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"weakKeys":{"type":"array","items":{"type":"string"}},"matchedBiographics":{"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}}}}}
```

## The LinkULsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LinkULsResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The ListExceptionGroupResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListExceptionGroupResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"ExceptionGroup":{"type":"object","properties":{"gguid":{"type":"string"},"tguid":{"type":"string"},"target":{"type":"string","enum":["BIOGRAPHIC","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH"]},"decision":{"type":"string","enum":["APPROVE","REJECT","KEEP"]},"status":{"type":"string","enum":["ANALYSIS","PENDING","READY","PROCESSING","DONE","REFUSED","ERROR"]},"priority":{"type":"boolean"},"organizations":{"type":"array","items":{"$ref":"#/components/schemas/Organization"}},"created":{"type":"string","format":"date-time"},"updated":{"type":"string","format":"date-time"},"user":{"type":"string"},"comments":{"type":"string"},"message":{"type":"string"},"parameters":{"$ref":"#/components/schemas/GroupDecisionParameters"},"lightsOutCriteria":{"$ref":"#/components/schemas/LightsOutCriteria"},"lockedUser":{"type":"string"},"lockedTimestamp":{"type":"string","format":"date-time"},"lockedTimeout":{"type":"string","format":"date-time"},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/Exception"}},"newTguid":{"type":"string"},"refusedStatus":{"type":"string","enum":["CREATED","REMOVED","READY_TO_RESEND","SENDING","SENT","ERROR"]},"refusedNewTguid":{"type":"string"},"refusedGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}},"holdingGroups":{"type":"array","items":{"$ref":"#/components/schemas/ExceptionGroup"}}}},"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}},"GroupDecisionParameters":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"labels":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"keepTransactions":{"type":"array","items":{"type":"string"}},"removeTransactions":{"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"LightsOutCriteria":{"type":"object","properties":{"nonConflitantKeys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"weakKeys":{"type":"array","items":{"type":"string"}},"matchedBiographics":{"type":"array","items":{"type":"string"}}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}}}}}
```

## The ListKeyFormatResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListKeyFormatResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"type":"array","items":{"$ref":"#/components/schemas/KeyFormat"}}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"KeyFormat":{"type":"object","properties":{"keyId":{"type":"string"},"formatType":{"type":"string","enum":["TITULO","CPF","ALPHANUMERIC","NUMERIC","ALPHABETIC","REGEX"]},"regex":{"type":"string"},"minLength":{"type":"integer","format":"int32"},"maxLength":{"type":"integer","format":"int32"}}}}}}
```

## The ListNotificationResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListNotificationResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ExtNotification"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"ExtNotification":{"type":"object","properties":{"operation":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY","CREATE_EXCEPTION","CREATE_EXCEPTION_GROUP","PRIORITY_EXCEPTION","PRIORITY_EXCEPTION_GROUP","TREAT_EXCEPTION_BIOMETRIC","TREAT_EXCEPTION_GROUP","CHANGE_REFUSED_STATUS","RESEND_REFUSED","LIGHTS_OUT"]},"tguid":{"type":"string"},"status":{"type":"string"},"sender":{"type":"string"},"uguid":{"type":"string"},"externalIDs":{"type":"array","items":{"$ref":"#/components/schemas/NotificationExternalID"}},"relatedExternalIDs":{"type":"array","items":{"$ref":"#/components/schemas/NotificationExternalID"}},"keptTguids":{"type":"array","items":{"type":"string"}},"additionalData":{"type":"object","additionalProperties":{"type":"string"},"writeOnly":true},"nguid":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"acks":{"type":"array","items":{"$ref":"#/components/schemas/NotificationAck"}},"pguid":{"type":"string"},"newTguid":{"type":"string"},"enrollPguid":{"type":"string"},"treatment":{"type":"string"},"update":{"type":"boolean"},"trusted":{"type":"boolean"},"origin":{"type":"string","enum":["GBDS","API"]}}},"NotificationExternalID":{"type":"object","properties":{"name":{"type":"string"},"key":{"type":"string"}}},"NotificationAck":{"type":"object","properties":{"client":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"comments":{"type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The ListOperationLogResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListOperationLogResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"type":"array","items":{"$ref":"#/components/schemas/OperationLog"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"OperationLog":{"type":"object","properties":{"guid":{"type":"string"},"logType":{"type":"string","enum":["EXCEPTION","EXCEPTION_BIOMETRIC","EXCEPTION_GROUP","TRANSACTION"]},"operation":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY","CREATE_EXCEPTION","CREATE_EXCEPTION_GROUP","PRIORITY_EXCEPTION","PRIORITY_EXCEPTION_GROUP","TREAT_EXCEPTION_BIOMETRIC","TREAT_EXCEPTION_GROUP","CHANGE_REFUSED_STATUS","RESEND_REFUSED","LIGHTS_OUT"]},"index":{"type":"integer","format":"int32"},"status":{"type":"string","enum":["ANALYSIS","READY","PROCESSING","REFUSED","DONE","PENDING","ERROR","ENQUEUED","OK","NOT_FINAL","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH","BIOGRAPHIC","APPROVE","REJECT","LIGHTS_OUT"]},"decision":{"type":"string","enum":["UNCERTAIN","UNCERTAIN_EXPERT","MISMATCH","NO_HIT","HIT","ERROR","APPROVE","REJECT","KEEP","CREATED","REMOVED","READY_TO_RESEND"]},"user":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"tguid":{"type":"string"},"pguid":{"type":"string"},"keptTguids":{"type":"array","items":{"type":"string"}},"message":{"type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}}}}}
```

## The ListOrganizationsResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListOrganizationsResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Organization"}}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}}}}}
```

## The ListPeopleValidatedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListPeopleValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Data"},"personFields":{"$ref":"#/components/schemas/PersonFieldsCollection"},"validatedRestrictions":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/ValidatedBiographicRestriction"},{"$ref":"#/components/schemas/ValidatedKeyRestriction"},{"$ref":"#/components/schemas/ValidatedLabelRestriction"},{"$ref":"#/components/schemas/ValidatedOrRestriction"}]}},"pageSizeIfNotNull":{"type":"integer","format":"int32","writeOnly":true},"restrictionsIfNotNull":{"type":"array","writeOnly":true,"items":{"oneOf":[{"$ref":"#/components/schemas/AndRestriction"},{"$ref":"#/components/schemas/BiographicRestriction"},{"$ref":"#/components/schemas/KeyRestriction"},{"$ref":"#/components/schemas/LabelRestriction"},{"$ref":"#/components/schemas/OrRestriction"}]}},"pageIndexIfNotNull":{"type":"integer","format":"int64","writeOnly":true},"includesAnomaliesIfNotNull":{"type":"boolean","writeOnly":true},"pguidsIfNotNull":{"type":"array","writeOnly":true,"items":{"type":"string"}}}},"Data":{"type":"object","properties":{"api":{"$ref":"#/components/schemas/VersionInfo"},"searchEngine":{"$ref":"#/components/schemas/VersionInfo"}}},"VersionInfo":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"},"apiType":{"type":"string","enum":["LEADER","RUNNER"]}}},"PersonFieldsCollection":{"description":"Defines the return information.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["BIOMETRIC","AUXILIARIES","KEYS","BIOGRAPHICS","LABELS","METADATA","BASIC_FIELDS","NO_FIELDS","ALL_FIELDS"]}},"ValidatedBiographicRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/ValidatedRestriction"},{"type":"object","properties":{"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]},"matchModeIfNotNull":{"type":"string","writeOnly":true,"enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]},"existsIfNotNull":{"type":"boolean","writeOnly":true}}}]},"ValidatedRestriction":{"type":"object","properties":{"type":{"type":"string","enum":["KEY","BIOGRAPHIC","LABEL","OR","AND"]}},"discriminator":{"propertyName":"type"}},"ValidatedKeyRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/ValidatedRestriction"},{"type":"object","properties":{"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]},"matchModeIfNotNull":{"type":"string","writeOnly":true,"enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]},"existsIfNotNull":{"type":"boolean","writeOnly":true}}}]},"ValidatedLabelRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/ValidatedRestriction"},{"type":"object","properties":{"label":{"type":"string"},"exists":{"type":"boolean"},"existsIfNotNull":{"type":"boolean","writeOnly":true}}}]},"ValidatedOrRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/ValidatedRestriction"},{"type":"object","properties":{"restrictions":{"type":"array","items":{"$ref":"#/components/schemas/Restriction"}}}}]},"Restriction":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}},"AndRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/Restriction"}]},"BiographicRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/Restriction"},{"type":"object","properties":{"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}}]},"KeyRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/Restriction"},{"type":"object","properties":{"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}}]},"LabelRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/Restriction"},{"type":"object","properties":{"label":{"type":"string"},"exists":{"type":"boolean"}}}]},"OrRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/Restriction"},{"type":"object","properties":{"restrictions":{"type":"array","items":{"$ref":"#/components/schemas/Restriction"}}}}]}}}}
```

## The ListPersonTransparencyResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListPersonTransparencyResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PersonTransparency"}}}},"PersonTransparency":{"type":"object","properties":{"pguid":{"type":"string"},"action":{"type":"string","enum":["REMOVE","CLASSIFIED","NOTIFY"]},"enabled":{"type":"boolean"},"groups":{"type":"array","items":{"$ref":"#/components/schemas/NotifyGroup"}}}},"NotifyGroup":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"users":{"type":"array","items":{"$ref":"#/components/schemas/NotifyUser"}},"emails":{"type":"array","items":{"type":"string"}}}},"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The ListQualityServicesResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListQualityServicesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/QualityServiceBean"}}}},"QualityServiceBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["FINGER","FACE"]},"message":{"type":"string"}}}}}}
```

## The ListSearchesResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ListSearchesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Search"}},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"Search":{"type":"object","properties":{"status":{"description":"Status of the search.","type":"string","enum":["ENQUEUED","PREPARED","PROCESSING","MATCH","NOT_MATCH","FAILED","PENDING","PERSON_NOT_FOUND"]},"tguid":{"description":"Search transaction TGUID.","type":"string"},"candidates":{"description":"List of match candidates.","type":"array","items":{"$ref":"#/components/schemas/MatchBob"}},"progress":{"type":"number","format":"float"},"request":{"$ref":"#/components/schemas/SearchSpec"},"failReason":{"description":"Fail message on why search didn't complete.","type":"string"},"searchType":{"description":"Type of finger that was searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometrics":{"description":"List of biometrics","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"apiID":{"description":"API ID","type":"string"},"gbdsVersion":{"description":"GBDS Version","type":"string"},"extractionElapsed":{"description":"Time to complete the extraction.","type":"integer","format":"int64"},"searchElapsed":{"description":"Time to complete the search.","type":"integer","format":"int64"},"postSearchElapsed":{"description":"Time to complete the post match.","type":"integer","format":"int64"},"ulsearch":{"description":"Unsolved latent search.","type":"boolean"},"latentSearch":{"description":"Latent search.","type":"boolean"},"score":{"description":"Score of the biometric comparison. Only returned if a single biometric was provided in the payload of the request that created the search.","type":"integer","format":"int32"},"bonafideScore":{"description":"Bonafide score of the liveness verification. Only returned if the `liveness` flag was set to `true` in the payload of the request that created the search. Ranges from 0 to 100 (0=attack, 100=genuine).","type":"integer","format":"int32"},"metadata":{"$ref":"#/components/schemas/SearchMetadata"}}},"MatchBob":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **DISABLED**. Otherwise, omitted here and **one TGUID per biometric** is returned at the `biometricMatches` level (child).\n","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatchBob"}}}},"BiometricMatchBob":{"type":"object","properties":{"matchedPersonTguid":{"description":"TGUID of the person the candidate matched against.\n\nReturned at this level only when Best of Biometrics (**BoB**) is **ENABLED**. Otherwise, omitted here and only **one TGUID per candidate** is returned at the `candidates` level (parent).\n","type":"string","format":"uuid"},"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"SearchSpec":{"type":"object","properties":{"searchType":{"description":"Type of finger to be searched.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometric":{"description":"If only one biometric is provided, a match score will be returned. If more than one biometric is provided, a list of candidates can be retrieved using getSearchResult.","type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"pguids":{"description":"This field is a list of PGUIDs. If the list is empty or null, the search will be against the entire database. If it has only one PGUID, the search will be 1:1. It is possible to make 1:1 searches with more than one PGUID.","type":"array","items":{"type":"string"}},"labelFilters":{"description":"Used for 1:N operations. The filters will be compared with the labels field registered by the enroll method.","uniqueItems":true,"type":"array","items":{"type":"string"}},"isLatentSearch":{"description":"Flag indicating if the search is a Latent Search.","type":"boolean"},"isULSearch":{"description":"Flag indicating if the search is an UL Search.","type":"boolean"},"numberOfCandidates":{"description":"Number of candidates to be returned.","type":"integer","format":"int32"},"classificationThreshold":{"description":"Threshold for either classifying biometric data or marking it as UNKNOWN.","type":"integer","format":"int32"},"classifications":{"description":"Vector containing the classifications to be considered. Defaults to UNKNOWN.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["PLAIN_ARCH","LEFT_LOOP","RIGHT_LOOP","WHORL","SCAR","UNKNOWN","AMPUTATION","OTHER"]}},"singularities":{"description":"Singularities to be considered. Defaults to NONE.","type":"string","enum":["NONE","NO_DELTA_ALL_CORES","ONE_DELTA_NO_CORES","ONE_DELTA_ALL_CORES"]},"latentSearchOptions":{"$ref":"#/components/schemas/LatentSearchOptions"},"searchOptions":{"$ref":"#/components/schemas/SearchOptions"},"user":{"type":"string"},"uguids":{"description":"Globally unique ID of the UL. Can be a list of uguids.","type":"array","items":{"type":"string"}},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned.","type":"boolean"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"LatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"}}},"SearchOptions":{"type":"object","properties":{"biometricType":{"description":"biometricType must contain its data and be one of the following values - FINGERPRINT, PALMPRINT, FACE, IRIS, NEWBORN_PALMPRINT, i.e., you must substitute the \"biometricType\" field name by one of the ENUM names.","type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"},"matcher":{"description":"Define which ginger preset will be used.","type":"string","enum":["DEFAULT","MOBILE"]}}}}},"SearchMetadata":{"description":"Additional information.","type":"object","additionalProperties":{"description":"A flexible key-value pair where the key is a string."}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The LivenessHeuristicDevice object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LivenessHeuristicDevice":{"type":"object","properties":{"deviceId":{"type":"string"},"watchlist":{"type":"boolean"},"timeout":{"type":"integer","format":"int64"},"tries":{"type":"integer","format":"int32"},"personCount":{"type":"integer","format":"int32"},"success":{"type":"integer","format":"int32"},"matchFails":{"type":"integer","format":"int32"},"livenessFails":{"type":"integer","format":"int32"}}}}}}
```

## The LivenessHeuristicPPE object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LivenessHeuristicPPE":{"type":"object","properties":{"personKey":{"type":"string"},"description":{"type":"string"}}}}}}
```

## The LivenessHeuristicPerson object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LivenessHeuristicPerson":{"type":"object","properties":{"personKey":{"type":"string"},"ppe":{"type":"boolean"},"watchlist":{"type":"boolean"},"timeout":{"type":"integer","format":"int64"},"tries":{"type":"integer","format":"int32"},"devices":{"type":"integer","format":"int32"},"success":{"type":"integer","format":"int32"},"matchFails":{"type":"integer","format":"int32"},"livenessFails":{"type":"integer","format":"int32"}}}}}}
```

## The LivenessHeuristicPersonDevice object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LivenessHeuristicPersonDevice":{"type":"object","properties":{"personKey":{"type":"string"},"deviceId":{"type":"string"},"approved":{"type":"boolean"},"success":{"type":"integer","format":"int32"},"matchFails":{"type":"integer","format":"int32"},"livenessFails":{"type":"integer","format":"int32"}}}}}}
```

## The LivenessHeuristicTransaction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LivenessHeuristicTransaction":{"type":"object","properties":{"tguid":{"type":"string"},"personKey":{"type":"string"},"deviceId":{"type":"string"},"model":{"type":"string"},"soVersion":{"type":"string"},"timestamp":{"type":"integer","format":"int64"},"bccMobileVersion":{"type":"string"},"liveness":{"type":"boolean"},"ipAddress":{"type":"string"},"success":{"type":"boolean"},"description":{"type":"string"},"score":{"type":"integer","format":"int32"},"imageQuality":{"type":"integer","format":"int32"},"originalBonafideScore":{"type":"integer","format":"int32"},"adjustedBonafideScore":{"type":"integer","format":"int32"}}}}}}
```

## The LivenessRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LivenessRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Biometric"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}}}}}
```

## The LivenessResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LivenessResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"$ref":"#/components/schemas/Data"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"Data":{"type":"object","properties":{"api":{"$ref":"#/components/schemas/VersionInfo"},"searchEngine":{"$ref":"#/components/schemas/VersionInfo"}}},"VersionInfo":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"},"apiType":{"type":"string","enum":["LEADER","RUNNER"]}}}}}}
```

## The LivenessSettings object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"LivenessSettings":{"type":"object","properties":{"settings":{"type":"object","additionalProperties":{"type":"string"}},"tings":{"$ref":"#/components/schemas/LivenessSettings"}}}}}}
```

## The MatchDecision object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"MatchDecision":{"type":"object","properties":{"user":{"type":"string"},"lockedTimestamp":{"type":"string","format":"date-time"},"timestamp":{"type":"string","format":"date-time"},"decision":{"type":"string","enum":["HIT","NO_HIT","UNCERTAIN","UNCERTAIN_EXPERT","MISMATCH","ERROR"]}}}}}}
```

## The MatcherInfo object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"MatcherInfo":{"type":"object","properties":{"name":{"type":"string"},"peopleCount":{"type":"integer","format":"int64"},"ulCount":{"type":"integer","format":"int64"},"memory":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SizeInfo"}}}},"SizeInfo":{"type":"object","properties":{"size":{"type":"integer","format":"int64"},"total":{"type":"integer","format":"int64"}}}}}}
```

## The NodeInfo object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NodeInfo":{"type":"object","properties":{"hostname":{"type":"string"},"monitorPort":{"type":"integer","format":"int32"},"status":{"type":"string","enum":["NONE","SPRING_START","CLUSTER_ASSEMBLY","MATCHERS_ASSEMBLY","PEOPLE_BOOT","UL_BOOT","KAFKA_START","RUNNING","SHUTTING_DOWN"]},"configuredMatchers":{"type":"integer","format":"int64"},"peopleCount":{"type":"integer","format":"int64"},"ulCount":{"type":"integer","format":"int64"},"memory":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SizeInfo"}},"activeMatchers":{"type":"array","items":{"$ref":"#/components/schemas/MatcherInfo"}}}},"SizeInfo":{"type":"object","properties":{"size":{"type":"integer","format":"int64"},"total":{"type":"integer","format":"int64"}}},"MatcherInfo":{"type":"object","properties":{"name":{"type":"string"},"peopleCount":{"type":"integer","format":"int64"},"ulCount":{"type":"integer","format":"int64"},"memory":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SizeInfo"}}}}}}}
```

## The NotificationAck object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotificationAck":{"type":"object","properties":{"client":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"comments":{"type":"string"}}}}}}
```

## The NotificationExternalID object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotificationExternalID":{"type":"object","properties":{"name":{"type":"string"},"key":{"type":"string"}}}}}}
```

## The NotifyGroup object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotifyGroup":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"users":{"type":"array","items":{"$ref":"#/components/schemas/NotifyUser"}},"emails":{"type":"array","items":{"type":"string"}}}},"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The NotifyGroupListResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotifyGroupListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotifyGroup"}}}},"NotifyGroup":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"users":{"type":"array","items":{"$ref":"#/components/schemas/NotifyUser"}},"emails":{"type":"array","items":{"type":"string"}}}},"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The NotifyGroupRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotifyGroupRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotifyGroup"}}},"NotifyGroup":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"users":{"type":"array","items":{"$ref":"#/components/schemas/NotifyUser"}},"emails":{"type":"array","items":{"type":"string"}}}},"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The NotifyGroupResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotifyGroupResponse":{"type":"object","properties":{"status":{"type":"string","enum":["CREATED","UPDATED"]},"data":{"$ref":"#/components/schemas/NotifyGroup"}}},"NotifyGroup":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"users":{"type":"array","items":{"$ref":"#/components/schemas/NotifyUser"}},"emails":{"type":"array","items":{"type":"string"}}}},"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The NotifyUser object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The NotifyUserListResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotifyUserListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NotifyUser"}}}},"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The NotifyUserRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotifyUserRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NotifyUser"}}},"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The NotifyUserResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotifyUserResponse":{"type":"object","properties":{"status":{"type":"string","enum":["CREATED","UPDATED"]},"data":{"$ref":"#/components/schemas/NotifyUser"}}},"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The NotifyValidRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"NotifyValidRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/JsonNotification"}}},"JsonNotification":{"type":"object","properties":{"operation":{"description":"Operation type of the transaction that notification is related to.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]},"tguid":{"description":"Transaction's global unique ID of the transaction that notification is related to.","type":"string"},"status":{"description":"Current status of the transaction that notification is related to.","type":"string"},"sender":{"description":"The notification sender.","type":"string"},"uguid":{"description":"Global unique ID of an unsolved latent. Only used when the notification is related to a transaction that treats an unsolved latent.","type":"string"},"additionalData":{"description":"Map used to add custom information inside the notification that will be delivered to notifier endpoint.","type":"object","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the main transaction that notification is related to.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}}}},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}}}}}
```

## The OperationLog object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"OperationLog":{"type":"object","properties":{"guid":{"type":"string"},"logType":{"type":"string","enum":["EXCEPTION","EXCEPTION_BIOMETRIC","EXCEPTION_GROUP","TRANSACTION"]},"operation":{"type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","FILTER","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY","CREATE_EXCEPTION","CREATE_EXCEPTION_GROUP","PRIORITY_EXCEPTION","PRIORITY_EXCEPTION_GROUP","TREAT_EXCEPTION_BIOMETRIC","TREAT_EXCEPTION_GROUP","CHANGE_REFUSED_STATUS","RESEND_REFUSED","LIGHTS_OUT"]},"index":{"type":"integer","format":"int32"},"status":{"type":"string","enum":["ANALYSIS","READY","PROCESSING","REFUSED","DONE","PENDING","ERROR","ENQUEUED","OK","NOT_FINAL","BIOMETRIC","BIOMETRIC_INCONCLUSIVE","BIOMETRIC_MISMATCH","BIOGRAPHIC","APPROVE","REJECT","LIGHTS_OUT"]},"decision":{"type":"string","enum":["UNCERTAIN","UNCERTAIN_EXPERT","MISMATCH","NO_HIT","HIT","ERROR","APPROVE","REJECT","KEEP","CREATED","REMOVED","READY_TO_RESEND"]},"user":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"tguid":{"type":"string"},"pguid":{"type":"string"},"keptTguids":{"type":"array","items":{"type":"string"}},"message":{"type":"string"}}}}}}
```

## The OrRestriction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"OrRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/Restriction"},{"type":"object","properties":{"restrictions":{"type":"array","items":{"$ref":"#/components/schemas/Restriction"}}}}]},"Restriction":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The Organization object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}}}}}
```

## The OrganizationResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"OrganizationResponse":{"type":"object","properties":{"httpResponse":{"$ref":"#/components/schemas/HttpResponse"},"data":{"$ref":"#/components/schemas/Organization"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}},"Organization":{"type":"object","properties":{"parent":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}}}}}
```

## The Permission object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Permission":{"type":"object"}}}}
```

## The PersonTransparency object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"PersonTransparency":{"type":"object","properties":{"pguid":{"type":"string"},"action":{"type":"string","enum":["REMOVE","CLASSIFIED","NOTIFY"]},"enabled":{"type":"boolean"},"groups":{"type":"array","items":{"$ref":"#/components/schemas/NotifyGroup"}}}},"NotifyGroup":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"users":{"type":"array","items":{"$ref":"#/components/schemas/NotifyUser"}},"emails":{"type":"array","items":{"type":"string"}}}},"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The PersonTransparencyRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"PersonTransparencyRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonTransparency"}}},"PersonTransparency":{"type":"object","properties":{"pguid":{"type":"string"},"action":{"type":"string","enum":["REMOVE","CLASSIFIED","NOTIFY"]},"enabled":{"type":"boolean"},"groups":{"type":"array","items":{"$ref":"#/components/schemas/NotifyGroup"}}}},"NotifyGroup":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"users":{"type":"array","items":{"$ref":"#/components/schemas/NotifyUser"}},"emails":{"type":"array","items":{"type":"string"}}}},"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The PersonTransparencyResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"PersonTransparencyResponse":{"type":"object","properties":{"status":{"type":"string","enum":["CREATED","UPDATED"]},"data":{"$ref":"#/components/schemas/PersonTransparency"}}},"PersonTransparency":{"type":"object","properties":{"pguid":{"type":"string"},"action":{"type":"string","enum":["REMOVE","CLASSIFIED","NOTIFY"]},"enabled":{"type":"boolean"},"groups":{"type":"array","items":{"$ref":"#/components/schemas/NotifyGroup"}}}},"NotifyGroup":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"users":{"type":"array","items":{"$ref":"#/components/schemas/NotifyUser"}},"emails":{"type":"array","items":{"type":"string"}}}},"NotifyUser":{"type":"object","properties":{"username":{"type":"string"}}}}}}
```

## The PingResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"PingResponse":{"type":"object","properties":{"data":{"type":"string"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The QualityControlResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"QualityControlResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/QualityControl"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"QualityControl":{"type":"object","properties":{"tguid":{"description":"Transaction GUID.","type":"string","format":"uuid"},"pguid":{"description":"Person GUID.","type":"string","format":"uuid"},"created":{"description":"Creation timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"updated":{"description":"Update timestamp (Unix, in milliseconds).","type":"integer","format":"int64"},"qualityStatus":{"description":"Quality status.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"enrollStatus":{"description":"Enroll status.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","REFUSED","PENDING","RESENT_ENROLL"]},"person":{"description":"A summary of the person (some fields may be omitted).","allOf":[{"$ref":"#/components/schemas/Person"}]},"transactionType":{"description":"Transaction type.","type":"string","enum":["ENROLL","UPDATE"]},"issues":{"type":"object","description":"Number of issues found per type.","properties":{"lowQuality":{"type":"integer","description":"Number of quality issues."},"duplication":{"type":"integer","description":"Number of duplication issues."},"sequenceControl":{"type":"integer","description":"Number of sequence control issues."}}},"apiID":{"description":"API ID","type":"string","format":"uuid"},"gbdsVersion":{"description":"GBDS Version","type":"string"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The QualityServiceBean object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"QualityServiceBean":{"type":"object","properties":{"id":{"type":"integer","format":"int32"},"url":{"type":"string"},"enabled":{"type":"boolean"},"library":{"type":"string","enum":["FINGER","FACE"]},"message":{"type":"string"}}}}}}
```

## The QualityServiceRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"QualityServiceRequest":{"type":"object","properties":{"library":{"type":"string","enum":["FINGER","FACE"]},"count":{"type":"integer","format":"int32"}}}}}}
```

## The ReplaceKeyRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ReplaceKeyRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ReplaceKey"}}},"ReplaceKey":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"},"newValue":{"description":"New value of entity identifier.","type":"string"}}}}}}
```

## The ReprocessException object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ReprocessException":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"aguid":{"type":"string"},"entrantTguid":{"type":"string"},"entrantPguid":{"type":"string"},"entrantReextracted":{"type":"boolean"},"referenceTguid":{"type":"string"},"referencePguid":{"type":"string"},"referenceReextracted":{"type":"boolean"},"type":{"type":"string","enum":["ENROLL","UPDATE","VERIFY","IDENTIFY"]},"oldStatus":{"type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"newStatus":{"type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"message":{"type":"string"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The ReprocessExceptions object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ReprocessExceptions":{"type":"object","properties":{"guid":{"type":"string"},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/ReprocessException"}},"status":{"type":"string","enum":["ENQUEUED","COUNTING","LISTING","PROCESSING","PROCESSED"]},"index":{"type":"integer","format":"int32"},"processed":{"type":"integer","format":"int64"},"total":{"type":"integer","format":"int64"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"ReprocessException":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"aguid":{"type":"string"},"entrantTguid":{"type":"string"},"entrantPguid":{"type":"string"},"entrantReextracted":{"type":"boolean"},"referenceTguid":{"type":"string"},"referencePguid":{"type":"string"},"referenceReextracted":{"type":"boolean"},"type":{"type":"string","enum":["ENROLL","UPDATE","VERIFY","IDENTIFY"]},"oldStatus":{"type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"newStatus":{"type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"message":{"type":"string"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The ReprocessListRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ReprocessListRequest":{"type":"object","properties":{"tguids":{"type":"array","items":{"type":"string"}},"pageSize":{"type":"integer","format":"int32"},"user":{"type":"string"},"comments":{"type":"string"},"justAnalyse":{"type":"boolean"}}}}}}
```

## The ReprocessRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ReprocessRequest":{"type":"object","properties":{"tguid":{"type":"string"},"user":{"type":"string"},"comments":{"type":"string"},"justAnalyse":{"type":"boolean"}}}}}}
```

## The Restriction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Restriction":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The Role object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Role":{"type":"object"}}}}
```

## The SequenceControlMatch object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SequenceControlMatch":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}}
```

## The SequenceControlMismatchIssue object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SequenceControlMismatchIssue":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"matches":{"type":"array","items":{"$ref":"#/components/schemas/SequenceControlMatch"}}}},"SequenceControlMatch":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}}
```

## The SequenceControlParityIssue object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SequenceControlParityIssue":{"type":"object","properties":{"missingIndexes":{"type":"array","items":{"type":"integer","format":"int32"}}}}}}}
```

## The ServicesStatusResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ServicesStatusResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Data"},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"Data":{"type":"object","properties":{"api":{"$ref":"#/components/schemas/VersionInfo"},"searchEngine":{"$ref":"#/components/schemas/VersionInfo"}}},"VersionInfo":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"},"apiType":{"type":"string","enum":["LEADER","RUNNER"]}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```

## The SetConfigurationRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SetConfigurationRequest":{"type":"object","properties":{"application":{"type":"string","enum":["GBDS_API","GBDS_DRIVER","GBDS_API_AND_DRIVER"]},"configurations":{"type":"object","additionalProperties":{"type":"string"}}}}}}}
```

## The ShutdownInfo object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ShutdownInfo":{"type":"object","properties":{"shouldShutdownAPI":{"type":"boolean"},"shouldShutdownDriver":{"type":"boolean"}}}}}}
```

## The SizeInfo object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"SizeInfo":{"type":"object","properties":{"size":{"type":"integer","format":"int64"},"total":{"type":"integer","format":"int64"}}}}}}
```

## The StopServicesValidatedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"StopServicesValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Data"}}},"Data":{"type":"object","properties":{"api":{"$ref":"#/components/schemas/VersionInfo"},"searchEngine":{"$ref":"#/components/schemas/VersionInfo"}}},"VersionInfo":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"},"apiType":{"type":"string","enum":["LEADER","RUNNER"]}}}}}}
```

## The Subject object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"Subject":{"type":"object","properties":{"name":{"type":"string"},"roles":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/Role"}},"permissions":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/Permission"}}}},"Role":{"type":"object"},"Permission":{"type":"object"}}}}
```

## The TransactionReport object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TransactionReport":{"type":"object","properties":{"count":{"type":"integer","format":"int64"},"extractionTimeAvg":{"type":"number","format":"double"},"extractionTimeMin":{"type":"integer","format":"int64"},"extractionTimeMax":{"type":"integer","format":"int64"},"extractionQualityAvg":{"type":"number","format":"double"},"extractionQualityMin":{"type":"integer","format":"int64"},"extractionQualityMax":{"type":"integer","format":"int64"},"matchAvg":{"type":"number","format":"double"},"matchMin":{"type":"integer","format":"int64"},"matchMax":{"type":"integer","format":"int64"},"totalAvg":{"type":"number","format":"double"},"totalMin":{"type":"integer","format":"int64"},"totalMax":{"type":"integer","format":"int64"},"type":{"type":"string","enum":["ENROLL","UPDATE","VERIFY","IDENTIFY"]},"latent":{"type":"boolean"},"ul":{"type":"boolean"},"apiId":{"type":"string"}}}}}}
```

## The TreatExceptionBiometricRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TreatExceptionBiometricRequest":{"type":"object","properties":{"enrollTguid":{"type":"string"},"exceptionPguid":{"type":"string"},"index":{"type":"integer","format":"int32"},"decision":{"type":"string","enum":["HIT","NO_HIT","UNCERTAIN","UNCERTAIN_EXPERT","MISMATCH","ERROR"]},"user":{"type":"string"},"timeout":{"type":"integer","format":"int32"},"permissions":{"type":"array","items":{"type":"string"}}}}}}}
```

## The TreatExceptionGroupRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TreatExceptionGroupRequest":{"type":"object","properties":{"gguid":{"type":"string"},"user":{"type":"string"},"comments":{"type":"string"},"timeout":{"type":"integer","format":"int32"},"decision":{"type":"string","enum":["APPROVE","REJECT","KEEP"]},"parameters":{"$ref":"#/components/schemas/GroupDecisionParameters"},"permissions":{"type":"array","items":{"type":"string"}}}},"GroupDecisionParameters":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"labels":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"keepTransactions":{"type":"array","items":{"type":"string"}},"removeTransactions":{"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}}}}}
```

## The TreatExceptionPendingGroupRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TreatExceptionPendingGroupRequest":{"type":"object","properties":{"gguid":{"type":"string"},"pendingTreatment":{"type":"string","enum":["ACCEPT","REJECT"]},"user":{"type":"string"},"comments":{"type":"string"},"timeout":{"type":"integer","format":"int32"},"permissions":{"type":"array","items":{"type":"string"}}}}}}}
```

## The TreatExceptionsValidatedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"TreatExceptionsValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ExceptionTreatment"},"meta":{"$ref":"#/components/schemas/Meta"},"subject":{"$ref":"#/components/schemas/Subject"},"timeoutIfNotNull":{"$ref":"#/components/schemas/Meta"},"validatedExceptionTreatment":{"$ref":"#/components/schemas/ValidatedExceptionTreatment"}}},"ExceptionTreatment":{"type":"object","properties":{"enrollTguid":{"description":"TGUID of transaction that created the exception.","type":"string"},"exceptionPguid":{"description":"PGUID of the person that was matched to create the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"referenceIndexes":{"description":"List of biometric indexes. Specifies which biometric from the Update transaction should be used to update the Person.","type":"array","items":{"type":"integer","format":"int32"}}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Meta":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"discardReference":{"type":"boolean"}}},"Subject":{"type":"object","properties":{"name":{"type":"string"},"roles":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/Role"}},"permissions":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/Permission"}}}},"Role":{"type":"object"},"Permission":{"type":"object"},"ValidatedExceptionTreatment":{"type":"object","properties":{"enrollTguid":{"type":"string"},"exceptionPguid":{"type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"referenceIndexes":{"type":"array","items":{"type":"integer","format":"int32"}},"trustedMasterRecord":{"type":"boolean"}}}}}}
```

## The UpdatePeopleTrustedValidatedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdatePeopleTrustedValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Person"},"meta":{"$ref":"#/components/schemas/TrustedEnrollMeta"},"metaIfNotNull":{"$ref":"#/components/schemas/TrustedEnrollMeta"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"TrustedEnrollMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"active":{"description":"Determines if the biometric sent will be loaded into RAM and be available for Search and biometric validation.","type":"boolean"},"externalIDs":{"description":"a","type":"array","items":{"$ref":"#/components/schemas/ExternalIDRequest"}},"labelsOperation":{"description":"a","type":"string","enum":["REPLACE","ACCUMULATE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalIDRequest":{"type":"object","properties":{"name":{"type":"string"},"keys":{"type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}}}}}
```

## The UpdatePeopleValidatedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdatePeopleValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Person"},"meta":{"$ref":"#/components/schemas/BiometricValidation"},"pguid":{"type":"string"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"BiometricValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"validationType":{"description":"Defines the type of biometric validation to be performed against the AFIS.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"externalIDs":{"description":"List of externalIDs related to this transaction.","type":"array","items":{"$ref":"#/components/schemas/ExternalID"}},"labels":{"type":"string","enum":["ACCUMULATE","REPLACE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}}}}}
```

## The UpdateQualityAnalysisValidatedRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdateQualityAnalysisValidatedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Data"},"meta":{"$ref":"#/components/schemas/UpdateQualityAnalysisMeta"},"subject":{"$ref":"#/components/schemas/Subject"},"subjectName":{"type":"string"}}},"Data":{"type":"object","properties":{"api":{"$ref":"#/components/schemas/VersionInfo"},"searchEngine":{"$ref":"#/components/schemas/VersionInfo"}}},"VersionInfo":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"},"apiType":{"type":"string","enum":["LEADER","RUNNER"]}}},"UpdateQualityAnalysisMeta":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"}}},"Subject":{"type":"object","properties":{"name":{"type":"string"},"roles":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/Role"}},"permissions":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/Permission"}}}},"Role":{"type":"object"},"Permission":{"type":"object"}}}}
```

## The UpdateTransactionEvent object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdateTransactionEvent":{"type":"object","allOf":[{"$ref":"#/components/schemas/HistoryEvent"}]},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The UpdateULsRequest object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"UpdateULsRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Fragment"},"meta":{"$ref":"#/components/schemas/ULValidation"}}},"Fragment":{"type":"object","properties":{"id":{"description":"ID of the fragment.","type":"string"},"caseId":{"description":"ID of case the fragment is associated to.","type":"string"},"image":{"$ref":"#/components/schemas/Biometric"},"template":{"$ref":"#/components/schemas/Biometric"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ULValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"}}}}}}
```

## The ValidatedBiographicRestriction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ValidatedBiographicRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/ValidatedRestriction"},{"type":"object","properties":{"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]},"matchModeIfNotNull":{"type":"string","writeOnly":true,"enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]},"existsIfNotNull":{"type":"boolean","writeOnly":true}}}]},"ValidatedRestriction":{"type":"object","properties":{"type":{"type":"string","enum":["KEY","BIOGRAPHIC","LABEL","OR","AND"]}},"discriminator":{"propertyName":"type"}}}}}
```

## The ValidatedDeleteULCandidatesSpec object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ValidatedDeleteULCandidatesSpec":{"type":"object","properties":{"uguid":{"type":"string"},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/ULCandidateIdentifier"}},"uguidIfNotNull":{"type":"string","writeOnly":true},"candidatesIfNotNull":{"type":"array","writeOnly":true,"items":{"$ref":"#/components/schemas/ULCandidateIdentifier"}}}},"ULCandidateIdentifier":{"type":"object","properties":{"pguid":{"description":"PGUID of the target candidate.","type":"string"},"tguid":{"description":"TGUID of the target candidate.","type":"string"},"index":{"description":"Index of the target candidate.","type":"integer","format":"int32"}}}}}}
```

## The ValidatedExceptionTreatment object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ValidatedExceptionTreatment":{"type":"object","properties":{"enrollTguid":{"type":"string"},"exceptionPguid":{"type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"referenceIndexes":{"type":"array","items":{"type":"integer","format":"int32"}},"trustedMasterRecord":{"type":"boolean"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR","REFUSED"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}}}}}
```

## The ValidatedKeyRestriction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ValidatedKeyRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/ValidatedRestriction"},{"type":"object","properties":{"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]},"matchModeIfNotNull":{"type":"string","writeOnly":true,"enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]},"existsIfNotNull":{"type":"boolean","writeOnly":true}}}]},"ValidatedRestriction":{"type":"object","properties":{"type":{"type":"string","enum":["KEY","BIOGRAPHIC","LABEL","OR","AND"]}},"discriminator":{"propertyName":"type"}}}}}
```

## The ValidatedLabelRestriction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ValidatedLabelRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/ValidatedRestriction"},{"type":"object","properties":{"label":{"type":"string"},"exists":{"type":"boolean"},"existsIfNotNull":{"type":"boolean","writeOnly":true}}}]},"ValidatedRestriction":{"type":"object","properties":{"type":{"type":"string","enum":["KEY","BIOGRAPHIC","LABEL","OR","AND"]}},"discriminator":{"propertyName":"type"}}}}}
```

## The ValidatedLatentSearchOptions object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ValidatedLatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"type":"integer","format":"int32"},"rotationAngleThreshold":{"type":"integer","format":"int32"},"default":{"type":"boolean"}}}}}}
```

## The ValidatedOrRestriction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ValidatedOrRestriction":{"type":"object","allOf":[{"$ref":"#/components/schemas/ValidatedRestriction"},{"type":"object","properties":{"restrictions":{"type":"array","items":{"$ref":"#/components/schemas/Restriction"}}}}]},"ValidatedRestriction":{"type":"object","properties":{"type":{"type":"string","enum":["KEY","BIOGRAPHIC","LABEL","OR","AND"]}},"discriminator":{"propertyName":"type"}},"Restriction":{"required":["type"],"type":"object","properties":{"type":{"type":"string"}},"discriminator":{"propertyName":"type"}}}}}
```

## The ValidatedRestriction object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ValidatedRestriction":{"type":"object","properties":{"type":{"type":"string","enum":["KEY","BIOGRAPHIC","LABEL","OR","AND"]}},"discriminator":{"propertyName":"type"}}}}}
```

## The ValidatedSearchMeta object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ValidatedSearchMeta":{"type":"object","properties":{"timeout":{"type":"integer","format":"int32"},"priority":{"type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"verifyResult":{"type":"boolean"},"metadata":{"type":"object","additionalProperties":{"type":"object"}},"priorityIfNotNull":{"type":"string","writeOnly":true,"enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"timeoutIfNotNull":{"type":"integer","format":"int32","writeOnly":true}}}}}}
```

## The ValidatedSearchSpec object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"ValidatedSearchSpec":{"type":"object","properties":{"searchType":{"type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"pguids":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"uguids":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"labelFilters":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"isLatentSearch":{"type":"boolean"},"isULSearch":{"type":"boolean"},"numberOfCandidates":{"type":"integer","format":"int32"},"classificationThreshold":{"type":"integer","format":"int32"},"classifications":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["PLAIN_ARCH","LEFT_LOOP","RIGHT_LOOP","WHORL","SCAR","UNKNOWN","AMPUTATION","OTHER"]}},"singularities":{"type":"string","enum":["NONE","NO_DELTA_ALL_CORES","ONE_DELTA_NO_CORES","ONE_DELTA_ALL_CORES"]},"latentSearchOptions":{"$ref":"#/components/schemas/LatentSearchOptions"},"searchOptions":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SearchOptions"}},"liveness":{"type":"boolean"},"user":{"type":"string"},"validatedLatentSearchOptions":{"$ref":"#/components/schemas/ValidatedLatentSearchOptions"},"searchOptionsIfnOtNull":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SearchOptions"},"writeOnly":true},"verify":{"type":"boolean"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"title":"CONSOLIDATED_TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"title":"TEMPLATE","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"title":"ORIGINAL","type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"LatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"}}},"SearchOptions":{"type":"object","properties":{"biometricType":{"description":"biometricType must contain its data and be one of the following values - FINGERPRINT, PALMPRINT, FACE, IRIS, NEWBORN_PALMPRINT, i.e., you must substitute the \"biometricType\" field name by one of the ENUM names.","type":"object","properties":{"scoreThreshold":{"description":"Search score threshold.","type":"integer","format":"int32"},"rotationAngleThreshold":{"description":"Rotation angle threshold for searching.","type":"integer","format":"int32"},"matcher":{"description":"Define which ginger preset will be used.","type":"string","enum":["DEFAULT","MOBILE"]}}}}},"ValidatedLatentSearchOptions":{"type":"object","properties":{"scoreThreshold":{"type":"integer","format":"int32"},"rotationAngleThreshold":{"type":"integer","format":"int32"},"default":{"type":"boolean"}}}}}}
```

## The VersionInfo object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"VersionInfo":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"},"apiType":{"type":"string","enum":["LEADER","RUNNER"]}}}}}}
```

## The VersionResponse object

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"5.1.16"},"components":{"schemas":{"VersionResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Data"},"error":{"oneOf":[{"$ref":"#/components/schemas/InternalError"},{"$ref":"#/components/schemas/ProcessingError"},{"$ref":"#/components/schemas/SecurityError"},{"$ref":"#/components/schemas/ValidationError"}]},"httpResponse":{"$ref":"#/components/schemas/HttpResponse"}}},"Data":{"type":"object","properties":{"api":{"$ref":"#/components/schemas/VersionInfo"},"searchEngine":{"$ref":"#/components/schemas/VersionInfo"}}},"VersionInfo":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"},"apiType":{"type":"string","enum":["LEADER","RUNNER"]}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"SecurityError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["SECURITY_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["INVALID_CREDENTIALS","INVALID_TOKEN","INVALID_AUTHORIZATION_SCHEMA","MISSING_TOKEN","UNKNOWN_LOGIN_ERROR","UNKNOWN_TOKEN_ERROR","EXPIRED_TOKEN","UNAUTHORIZED_ACCESS"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"HttpResponse":{"type":"object","properties":{"httpCode":{"type":"integer","format":"int32"},"body":{"type":"string"}}}}}}
```


# GBDS 4


# Version

## getVersion

> This method return the GBDS version.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/version":{"get":{"description":"This method return the GBDS version.","tags":["version"],"operationId":"getVersion","summary":"getVersion","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVersion"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GetVersion":{"type":"object","properties":{"data":{"type":"object","properties":{"api":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"},"apiId":{"type":"string"}}},"searchEngine":{"type":"object","properties":{"version":{"type":"string"},"build":{"type":"string"}}}}}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# Exceptions

## getException

> This method returns an exception for a given person/transaction.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/{tguid}/{pguid}":{"get":{"description":"This method returns an exception for a given person/transaction.","tags":["exceptions"],"operationId":"getException","summary":"getException","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}},{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetExceptionsResponse"}}}},"404":{"description":"Enrollment transaction does not exist, the exception does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GetExceptionsResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Exception"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate was matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate was matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## listExceptions

> This method returns a list of exceptions that match the given search criteria.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions":{"get":{"description":"This method returns a list of exceptions that match the given search criteria.","tags":["exceptions"],"operationId":"listExceptions","summary":"listExceptions","parameters":[{"name":"status","description":"Status of the request.","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR"]}}},{"name":"startDate","description":"Minimum timestamp, in milliseconds.","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"endDate","description":"Maximum timestamp, in milliseconds.","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"user","description":"ID of the user.","in":"query","required":false,"schema":{"type":"string"}},{"name":"keys","description":"List of key values. Only anomalies.","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string"}}},{"name":"biographics","description":"List of biographic values.","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string"}}},{"name":"labels","description":"A list of labels of the person.","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string"}}},{"name":"exceptionFields","description":"List containing the names of the fields of the Exception entity to be included in the response.","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["NO_FIELDS","ALL_FIELDS"]}}},{"name":"pageIndex","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"pageSize","in":"query","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExceptionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListExceptionsResponse":{"type":"object","properties":{"data":{"description":"List of exceptions that matched the search criteria.","type":"array","items":{"$ref":"#/components/schemas/Exception"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate was matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate was matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## unassignException

> This method removes the assignment of a user to an exception.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/{tguid}/{pguid}/users":{"delete":{"description":"This method removes the assignment of a user to an exception.","tags":["exceptions"],"operationId":"unassignException","summary":"unassignException","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}},{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Exception does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## listByTransaction

> This method returns the exception list from a given exception.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/{tguid}":{"get":{"description":"This method returns the exception list from a given exception.","tags":["exceptions"],"operationId":"listByTransaction","summary":"listByTransaction","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExceptionsResponse"}}}},"404":{"description":"Enrollment transaction does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListExceptionsResponse":{"type":"object","properties":{"data":{"description":"List of exceptions that matched the search criteria.","type":"array","items":{"$ref":"#/components/schemas/Exception"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate was matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate was matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## assignException

> This method assigns an exception to a given user.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/{tguid}/{pguid}/users/{user}":{"put":{"description":"This method assigns an exception to a given user.","tags":["exceptions"],"operationId":"assignException","summary":"assignException","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}},{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"user","description":"ID of the user.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Exception does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## getTreatResult

> This method returns the status of the treatment given to a specific transaction.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/treatment/{tguid}":{"get":{"description":"This method returns the status of the treatment given to a specific transaction.","tags":["exceptions"],"operationId":"getTreatResult","summary":"getTreatResult","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Ok, enqueued, Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Exception treatment transaction does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## treatException

> This method provides the treatment for a given exception.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/treatment":{"post":{"description":"This method provides the treatment for a given exception.","tags":["exceptions"],"operationId":"treatException","summary":"treatException","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsRequest"}}}},"responses":{"201":{"description":"Enqueued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}},"202":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreatExceptionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"403":{"description":"User not authorized to treat exception.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"404":{"description":"Exception treatment transaction does not exist, exception does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"TreatExceptionsRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ExceptionTreatment"},"meta":{"$ref":"#/components/schemas/Meta"}}},"ExceptionTreatment":{"type":"object","properties":{"enrollTguid":{"description":"TGUID of transaction that created the exception.","type":"string"},"exceptionPguid":{"description":"PGUID of the person that was matched to create the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"referenceIndexes":{"description":"List of biometric indexes. Specifies which biometric from the Update transaction should be used to update the Person.","type":"array","items":{"type":"integer","format":"int32"}}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Meta":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"discardReference":{"type":"boolean"}}},"TreatExceptionsResponse":{"type":"object","properties":{"status":{"description":"Status of the treat operation.","type":"string","enum":["OK","ENQUEUED","ERROR"]},"treatTguid":{"description":"TGUID of treat operation.","type":"string"},"failReason":{"description":"If the treatment call failed, this field will contain a message describing the nature of the failure.","type":"string"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## GET /exceptions/byEntrant/{pguid}

> getExceptionByEntrantPguid

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/byEntrant/{pguid}":{"get":{"tags":["exceptions"],"operationId":"getExceptionByEntrantPguid","summary":"getExceptionByEntrantPguid","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExceptionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListExceptionsResponse":{"type":"object","properties":{"data":{"description":"List of exceptions that matched the search criteria.","type":"array","items":{"$ref":"#/components/schemas/Exception"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate was matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate was matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## GET /exceptions/byReference/{pguid}

> getExceptionByReferencePguid

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/exceptions/byReference/{pguid}":{"get":{"tags":["exceptions"],"operationId":"getExceptionByReferencePguid","summary":"getExceptionByReferencePguid","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListExceptionsResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListExceptionsResponse":{"type":"object","properties":{"data":{"description":"List of exceptions that matched the search criteria.","type":"array","items":{"$ref":"#/components/schemas/Exception"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"Exception":{"type":"object","properties":{"enrollPguid":{"description":"Global unique ID of the person.","type":"string"},"enrollTguid":{"description":"Global unique ID of the transaction.","type":"string"},"transactionTimestamp":{"description":"Timestamp of the transaction that generated the Exception.","type":"integer","format":"int64"},"match":{"$ref":"#/components/schemas/Match"},"assignedUser":{"description":"Username of user tasked with treating the exception.","type":"string"},"exceptionAnalysis":{"$ref":"#/components/schemas/ExceptionAnalysis"},"transactionType":{"description":"Type of the transaction that generated the exception.","type":"string","enum":["ENROLL","UPDATE"]}}},"Match":{"type":"object","properties":{"matchedPersonPguid":{"description":"PGUID of the person the candidate was matched against.","type":"string"},"matchedPersonTguid":{"description":"TGUID of the person the candidate was matched against.","type":"string"},"biometricMatches":{"description":"Information about the match.","type":"array","items":{"$ref":"#/components/schemas/BiometricMatch"}}}},"BiometricMatch":{"type":"object","properties":{"score":{"description":"Score of the match.","type":"integer","format":"int32"},"queryIndex":{"description":"Index of the biometric data that was sent and caused a match.","type":"integer","format":"int32"},"referenceIndex":{"description":"Index of the biometric data, from the already enrolled person, which matched.","type":"integer","format":"int32"},"minutia":{"description":"Array of minutia matches. Returned only for latent searches.","type":"array","items":{"$ref":"#/components/schemas/Minutiae"}}}},"Minutiae":{"type":"object","properties":{"query":{"description":"Index of Minutiae, from the provided biometric data, which was involved in the match.","type":"integer","format":"int32"},"reference":{"description":"Index of Minutiae, from biometric data already in the database, which was involved in the match.","type":"integer","format":"int32"}}},"ExceptionAnalysis":{"type":"object","properties":{"status":{"description":"Status of the exception.","type":"string","enum":["ANALYSIS","DIFFERENT_FINGERS","SAME_FINGERS","INCORRECT_ENROLL","RECOLLECT","MERGE_TRANSACTIONS","APPROVE","REJECT","ERROR"]},"exceptionTimestamp":{"description":"Timestamp of the exception. This is the timestamp that should be used during exception listing/filtering.","type":"integer","format":"int64"},"user":{"description":"User that performed the analysis of the exception. Used only if LDAP is not active.","type":"string"},"comments":{"description":"Comments made by the user.","type":"string"}}},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```


# External Keys

## getExternalID

> This method returns the data related to a given external ID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/externalID/{externalID}":{"get":{"description":"This method returns the data related to a given external ID.","tags":["external-keys"],"operationId":"getExternalID","summary":"getExternalID","parameters":[{"name":"externalID","description":"Any external key.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"tguid":{"type":"string"}}}}}}}}}}}
```


# Operations

## notify

> This method forces notification of a given transaction.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/operations/notify":{"post":{"description":"This method forces notification of a given transaction.","tags":["operations"],"operationId":"notify","summary":"notify","requestBody":{"content":{"application/json;charset=UTF-8":{"schema":{"$ref":"#/components/schemas/NotifyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"NotifyRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/JsonNotification"}}},"JsonNotification":{"type":"object","properties":{"operation":{"description":"Operation type of the transaction that notification is related to.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]},"tguid":{"description":"Transaction's global unique ID of the transaction that notification is related to.","type":"string"},"status":{"description":"Current status of the transaction that notification is related to.","type":"string"},"sender":{"description":"The notification sender.","type":"string"},"uguid":{"description":"Global unique ID of an unsolved latent. Only used when the notification is related to a transaction that treats an unsolved latent.","type":"string"},"additionalData":{"description":"Map used to add custom information inside the notification that will be delivered to notifier endpoint.","type":"object","additionalProperties":{"type":"string"}},"relatedTransactions":{"description":"List of transactions related to the main transaction that notification is related to.","type":"array","items":{"$ref":"#/components/schemas/PersonRelatedTransaction"}}}},"PersonRelatedTransaction":{"type":"object","properties":{"status":{"description":"Status of the transaction related to the main transaction.","type":"string"},"tguid":{"description":"Transaction's global unique ID of the transaction related to the main transaction.","type":"string"},"pguid":{"description":"Person's global unique ID of the person related to the transaction related to the main transaction.","type":"string"},"operation":{"description":"Operation type of the transaction related to the main transaction.","type":"string","enum":["UNKNOWN","CONNECT","DISCONNECT","AUTHENTICATE","ENROLL","EXTERNAL_AUTHENTICATE","BATCH_ENROLL","REGISTER_SEARCH","SEARCH","DELETE","GET_RESULT","CLOSE_SESSION","GET_PERSON","FILTER","COUNT_ANOMALIES","FIND_ANOMALIES","GET_ANOMALY","ASSIGN_ANOMALY","UNASSIGN_ANOMALY","TRUST_ENROLL","GET_TRANSACTION","CHANGE_PRIORITY","ADD_TO_REFERENCE","REMOVE_FROM_REFERENCE","REMOVE_KEYS","GET_PEOPLE_TRANSACTIONS","ANOMALY_ENROLL","GET_EXCEPTION_RESULT","QUALITY_ANALYSIS","FILTER_TRANSACTION","REGISTER_ENROLL","STOP_SERVICE","REGISTER_UL_BIOMETRIC","REMOVE_UL_BIOMETRIC","UPDATE_PERSON_BIOMETRIC","DISABLE_PERSON_TRANSACTION","TREAT_EXCEPTION","TREAT_ANOMALY"]}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## ping

> This method is used to check the API availability.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/operations/ping":{"get":{"description":"This method is used to check the API availability.","tags":["operations"],"operationId":"ping","summary":"ping","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"properties":{"body":{"type":"string","enum":["pong!"]}}}}}}}}}}}
```


# People

## getPerson

> This method returns the information of a person, given its PGUID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}":{"get":{"description":"This method returns the information of a person, given its PGUID.","tags":["people"],"operationId":"getPerson","summary":"getPerson","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"personFields","description":"List containing the names of the fields of the Person entity.","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["BIOMETRIC","AUXILIARIES","KEYS","BIOGRAPHICS","LABELS","METADATA","BASIC_FIELDS","NO_FIELDS","ALL_FIELDS"]}}},{"name":"biometricFields","description":"List containing the names of the fields of the Biometric entity.","in":"query","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string","enum":["INDEX","ALL_FIELDS"]}}},{"name":"biographicBase","description":"Determines if the API will try to get biographics from the Biobase Server or not.","in":"query","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPeopleResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GetPeopleResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Person"}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## update

> This method performs an update operation in GBDS.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}":{"put":{"description":"This method performs an update operation in GBDS.","tags":["people"],"operationId":"update","summary":"update","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePeopleRequest"}}},"required":true},"responses":{"201":{"description":"Enrolled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"202":{"description":"Enqueued, processing, exception.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"422":{"description":"Pending or failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"UpdatePeopleRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/UpdateBiometricValidation"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"UpdateBiometricValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the update operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"validationType":{"description":"Defines the type of biometric validation to be performed against the AFIS.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"externalIDs":{"description":"List of externalIDs related to this transaction.","type":"array","items":{"$ref":"#/components/schemas/ExternalID"}},"labels":{"type":"string","enum":["ACCUMULATE","REPLACE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}},"EnrollResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED"]},"tguid":{"description":"Global unique id of the transaction.","type":"string"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}}}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## deletePerson

> This method deletes the information of a person, given its PGUID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}":{"delete":{"description":"This method deletes the information of a person, given its PGUID.","tags":["people"],"operationId":"deletePerson","summary":"deletePerson","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"priority","description":"Priority of the operation. Default is `GOD_PRIORITY`.","in":"query","required":false,"schema":{"type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]}},{"name":"timeout","description":"Timeout of the operation. Default is `0`.\n\nIf the timeout is `-1`, the operation will be executed synchronously.<br>\nIf the timeout is `0`, the operation will be executed asynchronously.<br>\nIf the timeout is `>0` (greater than 0), the operation will be executed synchronously after the timeout.\n","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"204":{"description":"Deleted","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person not active, pending exceptions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## enroll

> This method submits a new enrollment operation to GBDS.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people":{"post":{"description":"This method submits a new enrollment operation to GBDS.","tags":["people"],"operationId":"enroll","summary":"enroll","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePeopleRequest"}}},"required":true},"responses":{"201":{"description":"Enrolled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"202":{"description":"Enqueued, processing, exception, refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"422":{"description":"Pending or failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"CreatePeopleRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/BiometricValidation"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricValidation":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"validationType":{"description":"Defines the type of biometric validation to be performed against the AFIS.","type":"string","enum":["SAME_FINGERS","ALL_FINGERS","CROSSED_WINDOW_TWEEZERS"]},"externalIDs":{"description":"List of externalIDs related to this transaction.","type":"array","items":{"$ref":"#/components/schemas/ExternalID"}},"labels":{"type":"string","enum":["ACCUMULATE","REPLACE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalID":{"type":"object","properties":{"name":{"description":"Name of the ID.","type":"string"},"key":{"description":"Value of the ID.","type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}},"EnrollResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED"]},"tguid":{"description":"Global unique id of the transaction.","type":"string"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}}}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## listPeople

> This method returns a list of people who match the given search criteria.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/list":{"post":{"description":"This method returns a list of people who match the given search criteria.","tags":["people"],"operationId":"listPeople","summary":"listPeople","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPeopleRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPeopleResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ListPeopleRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"personFields":{"description":"Defines the return information.","uniqueItems":true,"type":"array","items":{"type":"string","enum":["BIOMETRIC","AUXILIARIES","KEYS","BIOGRAPHICS","LABELS","METADATA","BASIC_FIELDS","NO_FIELDS","ALL_FIELDS"]}},"pguids":{"description":"This field is a array of PGUIDs.","type":"array","items":{"type":"string"}},"pageIndex":{"description":"Used for paging the result. Given the list, A, of matched People; pageIndex determines which page of A, of size pageSize, to be returned in the response.","type":"integer","format":"int64"},"pageSize":{"description":"Number of people, starting from first, to be returned in the response.","type":"integer"},"restrictions":{"description":"Search restrictions, as key, biographic, label, date, and metadata.","type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/RestrictionBiographic"},{"$ref":"#/components/schemas/RestrictionDate"},{"$ref":"#/components/schemas/RestrictionKey"},{"$ref":"#/components/schemas/RestrictionLabel"}]}},"operator":{"description":"Logical operator used in the request.","type":"string","enum":["AND","OR"]},"includeAnomalies":{"description":"Whether to match People with anomalies.","type":"boolean"},"paginationCount":{"description":"Defines if total count on pagination will be on or off. It overwrites the value of gbds.peopleList.countFromRDB setting in the configuration file.","type":"boolean"},"biographicBase":{"description":"Determines if the API will try to get biographics from the Biobase Server or not.","type":"boolean"}}}}},"RestrictionBiographic":{"type":"object","properties":{"type":{"description":"Value MUST be BIOGRAPHIC","type":"string","default":"BIOGRAPHIC"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionDate":{"type":"object","properties":{"type":{"description":"Value MUST be DATE.","type":"string","default":"DATE"},"startDate":{"description":"Start time. Must be in milliseconds.","type":"integer"},"endDate":{"description":"End time. Must be in milliseconds.","type":"integer"}}},"RestrictionKey":{"type":"object","properties":{"type":{"description":"Value MUST be KEY.","type":"string","default":"KEY"},"id":{"type":"string"},"value":{"type":"string"},"exists":{"type":"boolean"},"matchMode":{"type":"string","default":"EXACT","enum":["START","EXACT","ANYWHERE","END","NOT_EQUALS"]}}},"RestrictionLabel":{"type":"object","properties":{"type":{"description":"Value MUST be LABEL.","type":"string","default":"LABEL"},"label":{"type":"string"},"exists":{"type":"boolean"}}},"ListPeopleResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Person"}},"pagination":{"oneOf":[{"$ref":"#/components/schemas/Pagination"},{"$ref":"#/components/schemas/PaginationOff"}]}}},"Person":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person. This attribute is assigned by the AFIS once the person is successfully enrolled","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the latest transaction on this Person.","type":"string"},"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"array","items":{"type":"string"}},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}},"history":{"$ref":"#/components/schemas/History"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"History":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEvent"}}}},"HistoryEvent":{"required":["type"],"type":"object","properties":{"tguid":{"description":"Global unique ID of the transaction.","type":"string"},"timestamp":{"description":"Timestamp of event/transaction.","type":"integer","format":"int64"},"type":{"description":"Type of event/transaction.","type":"string"},"targetTguid":{"description":"Global unique ID of the transaction that was disabled.","type":"string"}},"discriminator":{"propertyName":"type"}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"Pagination":{"type":"object","properties":{"total":{"description":"Total number of elements that matched the selection criteria.","type":"integer","format":"int64"},"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"},"totalPages":{"description":"Number of total pages.","type":"integer","format":"int64"}}},"PaginationOff":{"type":"object","properties":{"count":{"description":"Number of elements in the response.","type":"integer","format":"int32"},"pageSize":{"description":"Size of the page.","type":"integer","format":"int32"},"currentPage":{"description":"Number of the current page.","type":"integer","format":"int64"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## deleteBiometric

> This method delete a specific biometric in a person's register, given the person's PGUID and biometric index.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/biometric/{biometricIndex}":{"delete":{"description":"This method delete a specific biometric in a person's register, given the person's PGUID and biometric index.","tags":["people"],"operationId":"deleteBiometric","summary":"deleteBiometric","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"biometricIndex","description":"Finger index to be excluded.","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}}}}
```

## getPguidUsingKeys

> This method returns the PGUID of a person, given its search keys.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/pguid":{"get":{"description":"This method returns the PGUID of a person, given its search keys.","tags":["people"],"operationId":"getPguidUsingKeys","summary":"getPguidUsingKeys","parameters":[{"name":"key_id","description":"ID of the key to be used to identify the reference person.","in":"query","required":true,"schema":{"type":"string"}},{"name":"key_value","description":"Value of the key to be used to identify the reference person.","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPeoplePguidUsingKeyResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"GetPeoplePguidUsingKeyResponse":{"type":"object","properties":{"data":{"description":"Person PGUID.","type":"string"}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## disablePeopleTransaction

> This method deletes a transaction from a person, given its TGUID and the person's PGUID.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/transactions/{tguid}":{"delete":{"description":"This method deletes a transaction from a person, given its TGUID and the person's PGUID.","tags":["people"],"operationId":"disablePeopleTransaction","summary":"disablePeopleTransaction","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Person does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Person does not have a transaction, transaction is already disabled, could not disable transaction.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## trustedEnroll

> This method performs an enrollment operation without comparing biometrics.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/trusted":{"post":{"description":"This method performs an enrollment operation without comparing biometrics.","tags":["people"],"operationId":"trustedEnroll","summary":"trustedEnroll","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePeopleTrustedRequest"}}},"required":true},"responses":{"201":{"description":"Enrolled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"202":{"description":"Enqueued, processing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"CreatePeopleTrustedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/TrustedEnrollMeta"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"TrustedEnrollMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"active":{"description":"Determines if the biometric sent will be loaded into RAM and be available for Search and biometric validation.","type":"boolean"},"externalIDs":{"description":"a","type":"array","items":{"$ref":"#/components/schemas/ExternalIDRequest"}},"labelsOperation":{"description":"a","type":"string","enum":["REPLACE","ACCUMULATE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalIDRequest":{"type":"object","properties":{"name":{"type":"string"},"keys":{"type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}},"EnrollResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED"]},"tguid":{"description":"Global unique id of the transaction.","type":"string"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}}}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## trustedUpdate

> This method performs an update operation without comparing biometrics.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/trusted":{"put":{"description":"This method performs an update operation without comparing biometrics.","tags":["people"],"operationId":"trustedUpdate","summary":"trustedUpdate","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePeopleTrustedRequest"}}},"required":true},"responses":{"201":{"description":"Enrolled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"202":{"description":"Enqueued, processing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"UpdatePeopleTrustedRequest":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PersonRequest"},"meta":{"$ref":"#/components/schemas/TrustedEnrollMeta"}}},"PersonRequest":{"type":"object","properties":{"timestamp":{"description":"Timestamp of the latest transaction on this Person.","type":"integer","format":"int64"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/Biographic"}},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"auxiliaries":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}},"metadata":{"description":"Arbitrary data associated with the person.","type":"string"},"labels":{"description":"Arbitrary labels associated with a person, which can be used as filters for database queries.","uniqueItems":true,"type":"array","items":{"type":"string"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"Biographic":{"type":"object","properties":{"id":{"description":"ID of the biographic data being stored.\n\nBiobase Server biographics have their IDs prepended with `bs-`. For example, `bs-name` and `bs-surname`.\n","type":"string"},"value":{"description":"Value of the biographic data.","type":"string"}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"TrustedEnrollMeta":{"description":"Contains extra information about the API call.","type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"},"priority":{"description":"Priority of the enroll operation.","type":"string","enum":["GOD_PRIORITY","HIGHEST_PRIORITY","HIGHER_PRIORITY","HIGH_PRIORITY","DEFAULT_PRIORITY","LOW_PRIORITY","LOWER_PRIORITY","LOWEST_PRIORITY"]},"active":{"description":"Determines if the biometric sent will be loaded into RAM and be available for Search and biometric validation.","type":"boolean"},"externalIDs":{"description":"a","type":"array","items":{"$ref":"#/components/schemas/ExternalIDRequest"}},"labelsOperation":{"description":"a","type":"string","enum":["REPLACE","ACCUMULATE"]},"liveness":{"description":"Flag to request liveness verification on query face image. If activated, a bonafide score will be returned on get transaction.","type":"boolean"},"biographicBase":{"$ref":"#/components/schemas/BiographicBaseFlags"}}},"ExternalIDRequest":{"type":"object","properties":{"name":{"type":"string"},"keys":{"type":"string"}}},"BiographicBaseFlags":{"description":"Biographic database interaction configuration flags.","type":"object","properties":{"autoUpdate":{"description":"Update biographic base.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.autoUpdate`.\n","type":"boolean"},"sendPguidAsKey":{"description":"Send PGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendPguidAsKey`.\n","type":"boolean"},"sendTguidAsKey":{"description":"Send TGUID as key on biographic base update.\n\nIf absent, uses value of API config parameter `gbds.biographicBase.sendTguidAsKey`.\n","type":"boolean"}}},"EnrollResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"description":"Status of the enroll transaction.","type":"string","enum":["ENQUEUED","PROCESSING","ENROLLED","EXCEPTION","FAILED","PENDING","REFUSED"]},"tguid":{"description":"Global unique id of the transaction.","type":"string"},"biographicBaseStatus":{"$ref":"#/components/schemas/BiographicBaseStatus"}}}}},"BiographicBaseStatus":{"description":"Status of the biographic base.\n- `UNAVAILABLE`: When all Biobase Servers are off.\n- `TIMEOUT`: When at least one Biobase Server is ON but the call timed out.\n- `UNAUTHORIZED`:\n  - If the **lookAllServers** conf is **ON**, it indicates that all running servers returned that the API authentication is unauthorized.\n  - If the **lookAllServers** conf is **OFF**, it indicates that the server that received the biographic request returned that the API authentication is unauthorized.\n- `INVALID_DATA`: The Biobase Server returned that the data request from the API is invalid. It is not supposed to happen if Biobase Server is implemented according to the Biographic Base API.\n- `NOT_FOUND`:\n  - If the **lookAllServers** conf is **ON**, it indicates that the person keys were not found on all Biobase Servers configured.\n  - If the **lookAllServers** conf is **OFF**, it indicates that person keys were not found on the server that received the biographic request.\n- `OK`: The Biobase Server returned biographics/face for the given person keys.\n","type":"string","enum":["UNAVAILABLE","TIMEOUT","UNAUTHORIZED","INVALID_DATA","NOT_FOUND","OK"]},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## trustedAddKeys

> Adds new keys to a person.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/trusted/keys":{"post":{"description":"Adds new keys to a person.","tags":["people"],"operationId":"trustedAddKeys","summary":"trustedAddKeys","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrustedAddKeysRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrustedAddKeysResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}}}}}},"components":{"schemas":{"TrustedAddKeysRequest":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Key"}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"TrustedAddKeysResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"pguid":{"description":"Global unique ID of the Person to whom the keys were added.","type":"string"},"lastEnrollTguid":{"description":"Global unique ID of the current Person transaction that was changed.","type":"string"},"keys":{"description":"List of all keys of the Person, after new keys were added.","type":"array","items":{"$ref":"#/components/schemas/Key"}}}}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## updateBiographicsOnBiobaseUsingPGUID

> This endpoint creates or updates biographics on the Biographic Base Server using BioBase configuration on API.\<br>\<br>\
> It uses any key provided to find a person/identity on the server. If it does, it updates it with all biographics provided, keeping the existing ones.\<br>\
> If it does not find any person/identity with the keys provided, it creates a person/identity on the server with the keys and biographics provided.\<br>\
> It calls all servers until one responds with a 2xx http code. If none respond successfully, it returns the last server response call code.\
> \
> \*\*Always send PGUID as key.\*\*<br>

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/bio-base":{"post":{"description":"This endpoint creates or updates biographics on the Biographic Base Server using BioBase configuration on API.<br><br>\nIt uses any key provided to find a person/identity on the server. If it does, it updates it with all biographics provided, keeping the existing ones.<br>\nIf it does not find any person/identity with the keys provided, it creates a person/identity on the server with the keys and biographics provided.<br>\nIt calls all servers until one responds with a 2xx http code. If none respond successfully, it returns the last server response call code.\n\n**Always send PGUID as key.**\n","tags":["people"],"operationId":"updateBiographicsOnBiobaseUsingPGUID","summary":"updateBiographicsOnBiobaseUsingPGUID","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBiographicsOnBiobaseRequest"}}},"required":true},"responses":{"201":{"description":"Identity created on Biobase Server"},"202":{"description":"Identity updated on Biobase Server"}}}}},"components":{"schemas":{"UpdateBiographicsOnBiobaseRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/BioBaseBiographic"}}}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"BioBaseBiographic":{"type":"object","properties":{"id":{"type":"string","description":"Biographic key."},"type":{"type":"string","description":"Biographic type. It can be TEXT or FACE.","enum":["TEXT","FACE"]},"value":{"type":"string","description":"Biographic value. Faces are encoded in Base64."}}}}}}
```

## updateBiographicsOnBiobaseUsingPGUIDAndTGUID

> This endpoint creates or updates biographics on the Biographic Base Server using BioBase configuration on API.\<br>\<br>\
> It uses any key provided to find a person/identity on the server. If it does, it updates it with all biographics provided, keeping the existing ones.\<br>\
> If it does not find any person/identity with the keys provided, it creates a person/identity on the server with the keys and biographics provided.\<br>\
> It calls all servers until one responds with a 2xx http code. If none respond successfully, it returns the last server response call code.\
> \
> \*\*Always send PGUID and TGUID as keys.\*\*<br>

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/{pguid}/bio-base/{tguid}":{"post":{"description":"This endpoint creates or updates biographics on the Biographic Base Server using BioBase configuration on API.<br><br>\nIt uses any key provided to find a person/identity on the server. If it does, it updates it with all biographics provided, keeping the existing ones.<br>\nIf it does not find any person/identity with the keys provided, it creates a person/identity on the server with the keys and biographics provided.<br>\nIt calls all servers until one responds with a 2xx http code. If none respond successfully, it returns the last server response call code.\n\n**Always send PGUID and TGUID as keys.**\n","tags":["people"],"operationId":"updateBiographicsOnBiobaseUsingPGUIDAndTGUID","summary":"updateBiographicsOnBiobaseUsingPGUIDAndTGUID","parameters":[{"name":"pguid","description":"Global unique ID of the person.","in":"path","required":true,"schema":{"type":"string"}},{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBiographicsOnBiobaseRequest"}}},"required":true},"responses":{"201":{"description":"Identity created on Biobase Server"},"202":{"description":"Identity updated on Biobase Server"}}}}},"components":{"schemas":{"UpdateBiographicsOnBiobaseRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"biographics":{"type":"array","items":{"$ref":"#/components/schemas/BioBaseBiographic"}}}}}},"Key":{"type":"object","properties":{"id":{"description":"Name of entity identifier.","type":"string"},"value":{"description":"Value of entity identifier.","type":"string"}}},"BioBaseBiographic":{"type":"object","properties":{"id":{"type":"string","description":"Biographic key."},"type":{"type":"string","description":"Biographic type. It can be TEXT or FACE.","enum":["TEXT","FACE"]},"value":{"type":"string","description":"Biographic value. Faces are encoded in Base64."}}}}}}
```


# Quality

## qualityAnalysis

> This method provides the quality analysis result for a given transaction.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/{tguid}/qualityAnalysis":{"put":{"description":"This method provides the quality analysis result for a given transaction.","tags":["quality"],"operationId":"qualityAnalysis","summary":"qualityAnalysis","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateQualityAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateQualityAnalysisResponse"}}}},"400":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"403":{"description":"Enrollment is not assigned, enroll has a different assigned user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"404":{"description":"Enrollment transaction does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Invalid transaction state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"UpdateQualityAnalysisRequest":{"type":"object","properties":{"data":{"type":"object","properties":{"qualityAnalysis":{"$ref":"#/components/schemas/QualityAnalysis"},"biometric":{"type":"array","items":{"$ref":"#/components/schemas/Biometric"}}}},"meta":{"$ref":"#/components/schemas/UpdateQualityAnalysisMeta"}}},"QualityAnalysis":{"type":"object","properties":{"status":{"description":"Status of the analysis.","type":"string","enum":["PENDING","APPROVED","REJECTED","OK","ERROR","PENDING_DUPLICITIES"]},"user":{"description":"Username of whom issued the approval.","type":"string"},"comments":{"description":"User comments on the approval.","type":"string"},"timestamp":{"description":"Creation time of the approval, be it manual or automatic. If the enroll did not have any anomalies, the approval was automatic, thus this field will be equal to the enroll time. Otherwise, this timestamp will be the time when the user either approved or rejected the enrollment.","type":"integer","format":"int64"},"duplicationIssues":{"type":"array","items":{"$ref":"#/components/schemas/DuplicationIssue"}},"qualityIssues":{"type":"array","items":{"$ref":"#/components/schemas/QualityIssue"}},"sequenceControlIssues":{"type":"array","items":{"$ref":"#/components/schemas/SequenceControlIssue"}}}},"DuplicationIssue":{"type":"object","properties":{"indexes":{"description":"List of pairs of duplicated indexes found.","type":"array","items":{"type":"integer","format":"int32"}}}},"QualityIssue":{"type":"object","properties":{"index":{"description":"Index of the referred finger.","type":"integer","format":"int32"},"quality":{"description":"Quality calculated for the template.","type":"integer","format":"int32"}}},"SequenceControlIssue":{"type":"object","properties":{"index":{"description":"Index of the problematic finger.","type":"integer","format":"int32"},"matches":{"description":"List of sequence control indexes that matched the given finger and its matching score.","type":"array","items":{"type":"object","properties":{"index":{"type":"integer","format":"int32"},"score":{"type":"integer","format":"int32"}}}}}},"Biometric":{"type":"object","oneOf":[{"$ref":"#/components/schemas/CONSOLIDATED_TEMPLATE"},{"$ref":"#/components/schemas/TEMPLATE"},{"$ref":"#/components/schemas/ORIGINAL"}],"discriminator":{"propertyName":"source"}},"CONSOLIDATED_TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["CONSOLIDATED_TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"BiometricProperties":{"type":"object","properties":{"width":{"description":"Width, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"height":{"description":"Height, in pixels, of the image. If 0, GBDS will try to extract this information from the image header.","type":"integer","format":"int32"},"resolution":{"description":"Image or template resolution.","type":"integer","format":"int32"},"ratio":{"description":"Proportion of the image.","type":"number","format":"double"},"matcherId":{"description":"ID of the Biometric Matcher to be used in verification and identification operations.","type":"integer","format":"int32"},"extractorId":{"description":"ID of the extractor to be used on the image.","type":"integer","format":"int32"}}},"TEMPLATE":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["TEMPLATE"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"ORIGINAL":{"type":"object","properties":{"source":{"description":"How the biometric data was obtained.","type":"string","enum":["ORIGINAL"]},"type":{"description":"Type of the biometric data.","type":"string","enum":["FINGERPRINT","PALMPRINT","FOOTPRINT","FACE","IRIS","VOICE","SIGNATURE","SEQUENCE_CONTROL","NEWBORN_PALMPRINT","OTHER"]},"format":{"description":"Format of the biometric data.","type":"string","enum":["RAW","WSQ","JPEG","JPEG2000","PNG","TIFF","GIF","BMP","PCM","WAV","PRIVATE","ISO","ANSI","UNKNOWN","EBTS_TYPE9"]},"properties":{"$ref":"#/components/schemas/BiometricProperties"},"index":{"description":"Identifies which biometric, of the specified type, is being sent.","type":"integer","format":"int32"},"content":{"description":"Base64 encoded biometric data.","type":"string"},"quality":{"description":"Given the quality of the extracted biometric template. The quality is unbounded and starts at 0.","type":"integer","format":"int32"}}},"UpdateQualityAnalysisMeta":{"type":"object","properties":{"timeout":{"description":"Time, in milliseconds, waiting for the completion of the operation. If this value is -1, then the method is fully synchronous. If the timeout value is 0, then the method is fully asynchronous. If>0, the call expires after this time (in milliseconds).","type":"integer","format":"int32"}}},"UpdateQualityAnalysisResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"newTransactionGUID":{"description":"Transaction GUID for new enroll transaction generated.","type":"string"}}}}},"ValidationError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["VALIDATION_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["MISSING_PGUID","MISSING_PERSON","MISSING_BIOMETRIC","INVALID_PARAMETER_COMBINATION","MISSING_REQUIRED_QUERY_PARAMETER","MISSING_REQUIRED_ENTITY_ATTRIBUTE","UNKNOWN_ENTITY_ATTRIBUTE","QUERY_PARAMETER_OUT_OF_RANGE","PARAMETER_OUT_OF_RANGE","PGUID_IS_EMPTY","FORBIDDEN_ATTRIBUTE_SET","INVALID_TOKEN_GRANT_SPEC","INVALID_ENUM_VALUE","MALFORMED_JSON","INVALID_JSON_ATTRIBUTE_VALUE","INVALID_URL_ATTRIBUTE_VALUE","UNKNOWN_REQUEST_READ_ERROR","PAGE_NOT_FOUND","UNSUPPORTED_HTTP_METHOD"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## unassignPendingEnroll

> This method removes the assignment of a user to quality analysis.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/{tguid}/qualityAnalysis/users":{"delete":{"description":"This method removes the assignment of a user to quality analysis.","tags":["quality"],"operationId":"unassignPendingEnroll","summary":"unassignPendingEnroll","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Enrollment transaction does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Enrollment is not pending, enrollment is already unassigned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```

## assignPendingEnroll

> This method assigns a quality analysis operation to a given user.

```json
{"openapi":"3.0.1","info":{"title":"GBDS API","version":"4.7.0"},"servers":[{"url":"http://<ip>:8085/gbds/v2"}],"paths":{"/people/transactions/{tguid}/qualityAnalysis/users/{userName}":{"put":{"description":"This method assigns a quality analysis operation to a given user.","tags":["quality"],"operationId":"assignPendingEnroll","summary":"assignPendingEnroll","parameters":[{"name":"tguid","description":"Global unique ID of the transaction.","in":"path","required":true,"schema":{"type":"string"}},{"name":"userName","description":"ID of the user.","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Enrollment transaction does not exist","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"422":{"description":"Enrollment is not pending, enrollment is already assigned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessingError"}}}},"500":{"description":"Internal Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalError"}}}}}}}},"components":{"schemas":{"ProcessingError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["PROCESSING_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["ENTITY_DOES_NOT_EXIST","ENTITY_ALREADY_EXISTS","POOR_BIOMETRIC_QUALITY","DUPLICATED_BIOMETRIC","BIOMETRIC_OUT_OF_SEQUENCE","BIOMETRIC_ERROR","INSUFFICIENT_TEMPLATE_COUNT","UNEXTRACTABLE_BIOMETRIC","PERSON_DOES_NOT_EXIST","PERSON_NOT_ACTIVE","PERSON_DOES_NOT_HAVE_BIOMETRIC","PENDING_EXCEPTIONS","ENROLL_TRANSACTION_DOES_NOT_EXIST","ENROLL_PERSON_NOT_FOUND","INVALID_TRANSACTION_STATE","EXCEPTION_DOES_NOT_EXIST","TREAT_EXCEPTION_TRANSACTION_DOES_NOT_EXIST","USER_NOT_AUTHORIZED_TO_TREAT_EXCEPTION","UL_IS_ALREADY_SOLVED","INVALID_PARAMETER_COMBINATION","CAN_NOT_DISABLE_ONLY_ENROLL_TRANSACTION","PERSON_DOES_NOT_OWN_TRANSACTION","TRANSACTION_IS_ALREADY_DISABLED","CAN_NOT_DISABLE_TRANSACTION_OF_UNSUPPORTED_TYPE","INVALID_EBTS_TYPE9_CONTENT","EXTERNAL_ID_DOES_NOT_EXIST","EXCEPTION_IS_ALREADY_TREATED","INVALID_TREATMENT_FOR_EXCEPTION","ENROLL_IS_ALREADY_ASSIGNED","ENROLL_IS_ALREADY_UNASSIGNED","ENROLL_IS_NOT_PENDING","ENROLL_IS_NOT_ASSIGNED","ENROLL_HAS_DIFFERENT_ASSIGNED_USER","NO_PGUID_FOUND_FOR_KEY","NO_SEARCHABLE_BIOMETRIC"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}},"InternalError":{"type":"object","properties":{"type":{"description":"Type of the Error","type":"string","enum":["INTERNAL_ERROR"]},"code":{"description":"Internal error code.","type":"string","enum":["DRIVER_OFFLINE","CREDENTIAL_SERVER_CONNECTION_ERROR","CLIENT_NOT_INITIALIZE","TRUSTED_ENROLL_WITH_PENDING_STATUS","SUBJECT_NOT_SET","UNKNOWN"]},"message":{"description":"Message detailing the nature of the Error","type":"string"},"meta":{"description":"Contains extra information about the API call.","type":"object"}}}}}}
```




---

[Next Page](/llms-full.txt/1)

