Pular para o conteúdo principal

Enviando um documento

Enviando um Documento para uma análise padrão​

Para iniciar a análise de um documento, envie uma requisição POST para o endpoint /document utilizando o formato multipart/form-data.

Endpoint: https://api.caas.qitech.app/document_analysis/document

Formato da Requisição

A requisição deve ser enviada como multipart/form-data e incluir campos de dados e um campo de arquivo. Os campos obrigatórios para uma análise são id, document_analysis_type, document_bytes.

Exemplo de requisição:

curl -X POST "https://api.caas.qitech.app/document_analysis/document" \
-H "Authorization: SUA_CHAVE_API" \
-H "Content-Type: multipart/form-data" \
-F "id=solicitacao-abc-12345" \
-F "document_analysis_type=proof_of_address_default" \
-F "document_bytes=@/caminho/para/seu/comprovante.pdf"

Descrição dos Atributos de Envio​

AtributoDescrição
id (obrigatório)Um identificador único para a requisição, fornecido por você. Este ID pode ser usado posteriormente para recuperar os resultados da análise.
document_analysis_type (obrigatório)Uma string que especifica o tipo de análise a ser realizada no documento. Veja a tabela abaixo para os tipos suportados.
document_bytes (obrigatório)O arquivo do documento a ser analisado. Deve ser enviado como um arquivo no corpo da requisição multipart. Atenção: Não envie este campo como uma string codificada em base64.
async (opcional, default=false)Um booleano (true ou false) que define o modo de processamento.
- false (síncrono): A API tentará processar o documento e retornar o resultado na mesma requisição.
- true (assíncrono): A API confirmará o recebimento e processará em segundo plano. O resultado será enviado via webhook para um url configurado previamente (veja mais na sessão sobre webhooks).
Atenção

O campo async deve ser utilizado para indicar uma requisição assíncrona. As requisições síncronas devem ser feitas apenas para documentos pequenos e análises rápidas em que uma resposta imediata é crucial. Caso a análise não termine dentro do tempo limite da requisição síncrona, o status de retorno será 202 Accepted e o resultado deve ser recuperado por uma requisição GET, conforme descrito abaixo. Nesse caso nenhum webhook é enviado: o webhook é exclusivo das análises assíncronas.

Tipos de Análise Suportadas​

O campo document_analysis_type determina qual modelo de extração de dados será aplicado ao seu documento. Abaixo estão os tipos atualmente suportados.

Tipo de AnáliseTipo de DocumentoDescrição
proof_of_address_defaultComprovantes de residência (contas de luz, gás, internet, cartas do governo, declarações)Extrai e valida nome, endereço estruturado, endereço bruto, data de emissão e tipo de documento.
company_statute_defaultContrato ou estatuto socialExtração e validação básica: dados da empresa, capital social, órgão de registro e quadro societário.
company_statute_credit_right_assignmentContrato ou estatuto socialExtração avançada com validação de poderes para assinar cessão de direitos creditórios: grupos de assinantes, limites financeiros e necessidade de revisão.
power_of_attorney_defaultProcuraçãoExtrai outorgantes, outorgados, poderes concedidos, escopo, validade, irrevogabilidade e dados do tabelionato.
invoice_defaultNotas fiscais e DANFEsExtrai emissor, tomador, tipo e tributação da nota, número, datas, itens e valores.
bankslip_defaultBoletos bancáriosExtrai beneficiário, CNPJ do beneficiário, código de barras, valor e data de vencimento.
ccb_defaultCédulas de Crédito Bancário (CCB)Extrai número do contrato, dados do emissor, garantias, valor financiado, taxa de juros, parcelas e vencimentos.
portability_retention_evidence_analysisEvidências de retenção de portabilidadeValida a evidência: número do contrato, documento e telefone do emissor, número da portabilidade, presença de assinatura e se é uma confirmação válida.

Expanda cada tipo abaixo para ver os campos que a análise devolve em analysis_result, com o tipo e o significado de cada um. Campos aninhados aparecem com o caminho completo (address.street) e listas são marcadas com [].

proof_of_address_default — campos retornados em analysis_result
CampoTipoDescrição
namestringNome completo do titular, conforme extraído do documento
addressobjectEndereço residencial estruturado. Informação não encontrada vem como string vazia
address.streetstringNome da rua
address.numberstringNúmero do imóvel
address.complementstringComplemento, como apartamento, sala ou andar, quando houver
address.neighborhoodstringBairro
address.citystringCidade
address.statestringEstado ou Distrito Federal
address.cepstringCEP
raw_addressstringEndereço residencial completo, em texto corrido
issue_datestringData de emissão do documento no formato AAAA-MM-DD
document_typeenum: utility_bill, bank_statement, address_declaration, rental_agreement, government_letter …Tipo de documento enviado (ex.: 'utility_bill', 'address_declaration')
company_statute_default — campos retornados em analysis_result
CampoTipoDescrição
company_name_officialstringRazão social completa da empresa
company_name_tradestringNome fantasia
cnpjstringCNPJ no formato XX.XXX.XXX/XXXX-XX
nirestringNIRE — Número de Identificação do Registro de Empresas
headquarters_address_fullstringEndereço completo da sede
incorporation_datestringData de constituição da empresa
last_consolidated_amendment_datestringData da última alteração consolidada
corporate_purpose_summarystringObjeto social principal
share_capital_valuenumberValor TOTAL do capital social
share_capital_currencystringMoeda do capital social (ex.: 'BRL')
registration_office_namestringNome do órgão de registro (ex.: JUCESP)
registration_office_numberstringNúmero de registro no órgão competente
registration_office_datestringData do registro ou arquivamento no órgão competente
requires_power_of_attorney_checkbooleanVerdadeiro quando os poderes de assinatura não estão claros ou há menção a procuração, indicando necessidade de verificar um documento adicional
partners_data[]objectDados de um único sócio extraídos do contrato social
partners_data[].namestringNome completo do sócio
partners_data[].cpfstringCPF do sócio no formato XXX.XXX.XXX-XX
partners_data[].is_administratorbooleanVerdadeiro quando o sócio é nomeado administrador de forma explícita
partners_data[].role_powersstringCargo ou poderes, APENAS quando o sócio é administrador
partners_data[].share_quantityintegerQuantidade de ações ou quotas detidas pelo sócio
partners_data[].share_valuenumberValor total em BRL das ações ou quotas
partners_data[].participation_percentagenumberPercentual de participação do sócio na empresa
clauses_of_interestobjectCláusulas de interesse extraídas do documento
clauses_of_interest.administration_clause_summarystringResumo da cláusula que define quem representa e assina pela empresa
company_statute_credit_right_assignment — campos retornados em analysis_result
CampoTipoDescrição
requires_reviewbooleanIndica se o documento é complexo, se inclui muitas cláusulas ou subcláusulas sobre a administração ou se requer outros documentos em conjunto (como atlas de assembleia ou de eleição).
company_dataobjectDados cadastrais e societários completos da entidade analisada.
company_data.company_name_officialstringNome Oficial Completo da Empresa
company_data.company_name_tradestringNome Fantasia
company_data.cnpjstringCNPJ (CNPJ/MF) no formato XX.XXX.XXX/XXXX-XX
company_data.nirestringNúmero de Identificação do Registro de Empresas
company_data.headquarters_address_fullstringEndereço completo da sede
company_data.incorporation_datestringData de constituição/formação da empresa
company_data.last_consolidated_amendment_datestringData deste contrato social ou alteração
company_data.corporate_purpose_summarystringObjeto social principal
company_data.share_capital_valuenumberValor TOTAL do Capital Social
company_data.share_capital_currencystringMoeda do capital social (ex: 'BRL')
company_data.registration_office_namestringNome do órgão de registro (ex: JUCESP)
company_data.partners_data[]objectModelo que representa os dados de um único sócio extraídos do Contrato Social.
company_data.partners_data[].namestringNome completo do sócio
company_data.partners_data[].cpfstringCPF do sócio no formato XXX.XXX.XXX-XX
company_data.partners_data[].cnpjstringCNPJ (CNPJ/MF) da empresa sócio (caso sócio seja uma pessoa jurídica) no formato XX.XXX.XXX/XXXX-XX
company_data.partners_data[].is_representativebooleanVerdadeiro se o sócio pode representar a empresa.
company_data.partners_data[].role_powersenum: president, partner, administrator, director, manager …Cargo ou poderes. Use 'other' caso se refira a uma empresa, organização ou similar.
company_data.partners_data[].share_quantityintegerNúmero de ações/quotas detidas pelo sócio
company_data.partners_data[].share_valuenumberValor total das ações/quotas
company_data.partners_data[].participation_percentagenumberPercentual de participação do sócio na empresa
analyzed_operationstringO ato ou negócio jurídico específico cuja representação está sendo analisada.
source_documents[]stringLista de documentos societários que fundamentam a análise (ex: 'Estatuto Social', 'Ata de Eleição').
allows_proxiesbooleanIndica se o estatuto da entidade permite a representação por meio de procuradores.
signer_groups[]objectDefine os diferentes grupos e regras de assinatura válidos para a entidade.
signer_groups[].group_idintegerUm identificador numérico único para o grupo de assinatura.
signer_groups[].descriptionstringUm resumo claro da regra de negócio que este grupo representa.
signer_groups[].source_clausestringO texto completo da cláusula ou artigo que estabelece esta regra.
signer_groups[].representation_typeenum: Conjunta, Individual, Conforme MandatoDescreve se a representação é feita de forma conjunta ou individual. Caso ambas sejam permitidas, use individual.
signer_groups[].minimum_signersintegerO número mínimo de membros deste grupo que devem assinar. Se a assinatura for conjunta, esse valor deve ser maior que 1
signer_groups[].limitationsobjectDefine as condições e restrições aplicáveis a esta regra de assinatura.
signer_groups[].limitations.financial_limitobjectDefine a alçada financeira da regra de forma estruturada.
signer_groups[].limitations.financial_limit.operatorenum: MENOR_IGUAL, MAIOR_QUE, MAIOR, MENOR, IGUAL …O operador de comparação para o limite financeiro.
signer_groups[].limitations.financial_limit.valuenumberO valor monetário da alçada.
signer_groups[].limitations.financial_limit.currencystringO código da moeda do valor (ex: BRL, USD).
signer_groups[].limitations.observationsstringNotas ou comentários adicionais sobre a interpretação ou aplicação da regra.
signer_groups[].members[]objectDefine os cargos que podem compor o grupo de assinatura.
signer_groups[].members[].positionenum: president, partner, administrator, director, manager …Cargo ou poderes. Use 'other' caso se refira a uma empresa, organização ou similar.
signer_groups[].members[].full_namestringO nome completo do indivíduo que ocupa o cargo, se identificado.
signer_groups[].members[].cpfstringO CPF do indivíduo (Cadastro de Pessoa Física), se disponível.
signer_groups[].members[].mandate_end_datestringA data de expiração do mandato (ex: 'AAAA-MM-DD').
signer_groups[].members[].is_qualifiedbooleanIndica se a pessoa que ocupa o cargo está identificada no documento.
signer_groups[].members[].is_requiredbooleanIndica se a presença deste membro é obrigatória.
power_of_attorney_default — campos retornados em analysis_result
CampoTipoDescrição
grantors[]objectLista de outorgantes — ao menos um é obrigatório
grantors[].namestringNome completo do outorgante
grantors[].cpfstringCPF do outorgante no formato XXX.XXX.XXX-XX (pessoa física)
grantors[].cnpjstringCNPJ do outorgante no formato XX.XXX.XXX/XXXX-XX (pessoa jurídica)
grantees[]objectLista de outorgados — ao menos um é obrigatório
grantees[].namestringNome completo do outorgado
grantees[].cpfstringCPF do outorgado no formato XXX.XXX.XXX-XX (pessoa física)
grantees[].cnpjstringCNPJ do outorgado no formato XX.XXX.XXX/XXXX-XX (pessoa jurídica)
powers_grantedstringDescrição dos poderes concedidos pela procuração
power_scopestringEscopo ou limitações dos poderes concedidos, quando especificados
expiration_datestringData em que os poderes expiram; nulo indica validade indeterminada
is_irrevocablebooleanVerdadeiro quando a procuração é declarada irrevogável de forma explícita
revocation_clausestringTexto da cláusula de revogação, quando presente
notary_namestringNome do cartório onde o documento foi registrado
notary_registration_numberstringNúmero de registro ou livro no cartório
notary_datestringData do reconhecimento em cartório
document_datestringData de assinatura da procuração
purposestringFinalidade declarada da procuração (ex.: representar em juízo, movimentar contas bancárias)
invoice_default — campos retornados em analysis_result
CampoTipoDescrição
company_namestringRazão social da empresa
cnpjstringCNPJ da empresa
invoice_typeenum: Documento fiscal eletrônico de serviços, Documento fiscal eletrônico de produtoTipo de nota fiscal — produto ou serviço
taxation_typestringTipo de tributação
invoice_issue_datestringData de emissão da nota
invoice_numberstringNúmero da nota fiscal
contracting_companystringEmpresa contratante
invoice_descriptionstringDescrição da nota fiscal
invoice_valuenumberValor da nota fiscal
items[]objectLista de itens da nota fiscal
items[].codestringCódigo do item (NCM/SH)
items[].descriptionstringDescrição do item
items[].quantityintegerQuantidade do item
items[].valuenumberValor do item
rps_codestringCódigo do RPS — Recibo Provisório de Serviços
access_keystringChave de acesso, para notas fiscais de produto
bankslip_default — campos retornados em analysis_result
CampoTipoDescrição
beneficiary_cnpjstringCNPJ do beneficiário
beneficiary_company_namestringRazão social do beneficiário
boleto_barcodestringCódigo de barras do boleto
due_datestringData de vencimento
valuenumberValor do boleto
ccb_default — campos retornados em analysis_result
CampoTipoDescrição
contract_numberstringNúmero da CCB
issuer_documentstringCPF ou CNPJ do emitente da CCB
issuer_cepstringCEP do emitente
guarantee_chassisstringChassi do veículo dado em garantia, se aplicável
invoice_total_valuenumberValor total da nota fiscal, se aplicável
annual_interest_ratenumberTaxa de juros anual prefixada, em percentual
financed_amountnumberValor total financiado na CCB
total_installmentsintegerQuantidade total de prestações
first_due_datestringVencimento da primeira parcela
last_due_datestringVencimento da última parcela (ver a fluxo de pagamento)
has_signaturebooleanIndica se o documento possui assinatura válida (física ou digital)
is_valid_contractbooleanIndica se o documento enviado é uma cédula de crédito bancária
portability_retention_evidence_analysis — campos retornados em analysis_result
CampoTipoDescrição
contract_numberstringNúmero do contrato
issuer_document_numberstringCPF do tomador de crédito
issuer_phone_numberstringNúmero de telefone do tomador
portability_numbernumberNúmero da portabilidade
has_signaturebooleanIndica se o documento (especialmente se for uma CCB) contém elementos de assinatura eletrônica, como um hash, código de verificação, QR Code ou uma página de autenticação.
is_valid_evidencebooleanIndica se o documento é um tipo de evidência aceitável, como uma conversa de texto ou uma Cédula de Crédito Bancário (CCB).
is_confirmationbooleanIndica se a evidência confirma o cancelamento da portabilidade. Deve ser TRUE se o cliente declarar explicitamente o cancelamento ou não reconhecimento do pedido de portabilidade OU se a evidência for uma CCB com assinatura (has_signature: true). Deve ser FALSE caso não seja uma conversa OU a conversa não indique um cancelamente ou não reconhecimento. As opções aqui devem sempre ser TRUE ou FALSE.

Para tipos de análise não listados aqui, entre em contato com nossa equipe de suporte em suporte.caas@qitech.com.br para consultar sobre implementações personalizadas.

Formatos e Limites do Arquivo​

O campo document_bytes aceita os formatos abaixo. O tipo real do arquivo é verificado pelo conteúdo, não pela extensão nem pelo Content-Type declarado — enviar um .jpg rotulado como application/pdf resulta em DOC00202.

FormatoTamanho máximoObservações
PDF30 MBMáximo de 350 páginas (DOC00203). PDFs protegidos por senha são rejeitados (DOC00305).
JPEG30 MB
PNG10 MB

Respostas​

Resposta de Sucesso (200 OK)​

Em uma análise síncrona concluída com sucesso, a API retorna HTTP 200 OK com o corpo abaixo. Os campos do envelope são sempre os mesmos; o que varia por document_analysis_type é o conteúdo de analysis_result.

{
"id": "solicitacao-abc-12345",
"document_analysis_type": "proof_of_address_default",
"validation_status": "valid",
"file_metadata": { "file_type": "pdf" },
"analysis_result": { "...": "campos extraídos, variam por tipo de análise" },
"feedback_data": null
}
CampoDescrição
idO mesmo identificador que você enviou na requisição.
document_analysis_typeO tipo de análise aplicado.
validation_statusResultado da validação. Veja os valores possíveis abaixo.
file_metadataMetadados do arquivo recebido, como o tipo detectado.
analysis_resultOs dados extraídos. Vazio ({}) quando a análise não foi concluída.
feedback_dataFeedback que você tenha registrado para este documento, se houver.

Valores de validation_status​

ValorSignificado
validAnálise concluída com sucesso.
pendingAinda em processamento.
missing_informationO documento não possui informações obrigatórias.
bad_qualityQualidade do documento insuficiente para análise.
invalid_dataO documento contém dados inválidos ou inconsistentes.
incorrect_document_typeO conteúdo não corresponde ao tipo de análise solicitado.
parsing_errorO resultado da análise não pôde ser interpretado.
analysis_failedA análise não pôde ser concluída pelo modelo.

Resposta de Aceito (202 OK)​

Se o documento for processado de forma assíncrona, a API retornará um status HTTP 202 Accepted e a requisição será processada de maneira assíncrona. Depois de alguns instantes é possível recuperar a análise do documento usando uma requisição GET, conforme descrito abaixo.

Resposta de Erro (4xx)​

Se houver um problema com a requisição ou com o documento, a API retornará um código de status 4xx com um corpo JSON descrevendo o erro.

Referência de Códigos de Erro​

As tabelas a seguir listam todos os códigos de erro possíveis retornados pela API. Você pode usar esses códigos para implementar um tratamento de erros robusto em sua aplicação.

Categoria 1: Erros de Requisição (DOC001xx)​

CódigoTítuloDescrição
DOC00100Missing required fieldA requisição não contém um campo obrigatório no corpo multipart/form-data.
DOC00101Invalid field lengthO comprimento de um valor em um campo form-data é inválido.
DOC00102Invalid content type at requestO cabeçalho Content-Type da requisição não é multipart/form-data.
DOC00103Invalid field at requestA requisição contém um campo inesperado ou inválido no corpo form-data.

Categoria 2: Erros no Processamento do Arquivo (DOC002xx)​

Estes erros ocorrem quando o próprio arquivo enviado possui problemas que impedem seu processamento.

CódigoTítuloDescrição
DOC00200Invalid Document Analysis TypeO document_analysis_type não é válido para o documento enviado. (ex: uma análise company_statute_default apartir de uma conta de luz.)
DOC00201Invalid File SizeO tamanho do documento enviado excede o limite máximo permitido.
DOC00202Invalid File TypeO arquivo não pôde ser processado devido a inconsistências em seu tipo ou formato (ex: um arquivo .jpg foi enviado com o tipo application/pdf).
DOC00203PDF exceeds page limitO arquivo PDF fornecido contém mais páginas do que o limite máximo permitido para processamento (o limite atual é de 350 páginas).

Categoria 3: Erros na Análise do Documento (DOC003xx)​

Estes erros ocorrem durante a fase de extração e análise de dados, após o arquivo ter sido aberto com sucesso.

CódigoTítuloDescrição
DOC00300Missing InformationO documento não contém informações essenciais necessárias para que a análise seja concluída.
DOC00301Bad QualityA qualidade do documento (ex: resolução, legibilidade, nitidez) é muito baixa para ser analisada com precisão.
DOC00302Invalid DataO documento contém dados inconsistentes ou inválidos (ex: checksums incorretos, campos contraditórios).
DOC00303Incorrect Document TypeO conteúdo do documento não corresponde ao tipo de documento esperado para o document_analysis_type selecionado.
DOC00304Invalid PDF FileO arquivo fornecido não é um PDF válido ou bem-formado e não pôde ser aberto.
DOC00305Password Protected PDFO PDF enviado está criptografado com uma senha e não pode ser processado.
DOC00306Parsing ErrorA análise do documento não pôde ser processada.

Categoria 4: Falhas de Serviço (DOC005xx)​

Estes erros indicam uma falha do nosso lado, não do seu documento nem da sua requisição. São retornados com status HTTP 5xx e a ação recomendada é repetir a requisição.

CódigoTítuloStatus HTTPDescrição
DOC00500Analysis Failed503Não foi possível concluir a análise. Tente novamente; se o problema persistir, contate o suporte.

Recuperar a Análise de um documento

Você pode recuperar os resultados de uma análise de documento enviada anteriormente a qualquer momento, usando seu id exclusivo.

https://api.caas.qitech.app/document_analysis/document/{document_id}

Substitua document_id pelo mesmo valor que você usou para fazer a requisição POST.

Registrar feedback de uma análise

Você pode registrar um retorno sobre a qualidade de uma análise, o que nos ajuda a melhorar os modelos. Envie um POST para o endpoint abaixo usando o mesmo id da requisição original.

POST https://api.caas.qitech.app/document_analysis/document/{document_id}/feedback

curl -X POST "https://api.caas.qitech.app/document_analysis/document/solicitacao-abc-12345/feedback" \
-H "Authorization: SUA_CHAVE_API" \
-H "Content-Type: application/json" \
-d '{
"event_date": "2026-09-02T14:30:00",
"feedback_data": { "campo_incorreto": "issue_date", "valor_correto": "2026-07-20" }
}'
AtributoDescrição
event_date (obrigatório)Data e hora do feedback.
feedback_data (obrigatório)Objeto livre com o conteúdo do feedback.

O feedback registrado passa a ser retornado no campo feedback_data ao recuperar a análise. Também é possível consultá-lo com um GET no mesmo endpoint.