> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# API de comprovante de endereço: verificação POA e OCR

> POST /v3/poa/ da Didit verifica contas de consumo, extratos e contratos de aluguel: OCR de endereço, autenticidade e pagamento por uso, sem contrato.



## OpenAPI

````yaml pt-br/openapi-25.json POST /v3/poa/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificação de identidade. Autentique-se com o cabeçalho x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/poa/:
    post:
      tags:
        - Standalone APIs
      summary: Comprovante de endereço (OCR do documento + verificações de endereço)
      description: >-
        Extraia e valide um documento de Comprovante de endereço (contas de
        consumo, extratos bancários e documentos emitidos pelo governo) em uma
        única chamada. Retorna o emissor, as datas de emissão e validade, o nome
        do titular, o endereço bruto e o endereço estruturado/geocodificado, um
        `status` `Approved`/`Declined` e uma lista `warnings` que explica cada
        problema encontrado.


        **Latência.** A extração é baseada em LLM: chamadas típicas levam **5–15
        segundos**, e PDFs com várias páginas até **~30 segundos**. Configure um
        tempo limite no cliente de **pelo menos 45 segundos** e não tente
        novamente antes de a chamada terminar.


        **Como funciona.** O documento (imagem ou PDF, até 15 MB; PDFs
        criptografados exigem `document_password`) é classificado em um tipo e
        um subtipo de documento (por exemplo, `UTILITY_BILL` / `WATER_BILL`), e
        o emissor, as datas, o nome do titular e o endereço são extraídos por
        meio de extração baseada em LLM. O endereço é estruturado e
        geocodificado em `poa_parsed_address`. A análise forense de PDF/EXIF
        procura sinais de adulteração (modificação após a assinatura digital,
        editores de PDF conhecidos, manipulação com sobreposição de texto,
        reexportações suspeitas) e sinaliza `SUSPECTED_DOCUMENT_MANIPULATION` ou
        `DOCUMENT_METADATA_MISMATCH`. A idade do documento é validada em relação
        a `poa_document_age_months`, e o idioma em relação a
        `poa_languages_allowed`. Se você enviar `expected_address`,
        `expected_country` ou `expected_first_name`/`expected_last_name`, os
        valores extraídos são comparados e as divergências são sinalizadas.


        **Lógica de decisão.** O `status` é `Approved`, a menos que pelo menos
        um aviso resulte em recusa. Falhas graves sempre resultam em recusa:
        `MISSING_ADDRESS_INFORMATION`, `POA_DOCUMENT_EXPIRED`,
        `INVALID_DOCUMENT_TYPE`, `UNABLE_TO_VALIDATE_DOCUMENT_AGE`, além de
        `UNABLE_TO_EXTRACT_ISSUE_DATE` e `POA_NAME_NOT_DETECTED` (não
        configuráveis neste endpoint). Cinco grupos de risco são configuráveis
        por requisição por meio das opções `poa_*_action` (`DECLINE` ou
        `NO_ACTION`, todas com padrão `DECLINE`).
        `POA_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION` e
        `UNPARSABLE_OR_INVALID_ADDRESS` são informativos neste endpoint e nunca
        resultam em recusa. Um documento que não pode ser processado retorna
        `400`; um documento legível, mas com problemas, retorna `200` com
        `status: "Declined"`. Sempre verifique `poa.status` e `poa.warnings`, e
        não apenas o código HTTP.


        **Faturamento.** Cada resposta `200` consome um crédito da API de
        Comprovante de endereço (pago com o crédito do seu plano ou com o saldo
        recarregado). Quando o saldo da organização não cobre a chamada, o
        endpoint retorna `403` com o erro de créditos insuficientes antes de
        qualquer processamento do documento.


        **Persistência da sessão (`save_api_request`, padrão `true`).** Quando
        `true`, a chamada é persistida como uma sessão do tipo API: ela aparece
        no Business Console, o documento enviado é armazenado, o `request_id`
        retornado é um ID de sessão real que você pode passar para `GET
        /v3/session/{sessionId}/decision/` (a decisão também expõe
        `document_file` e a análise forense `document_metadata`, que esta
        resposta omite) e um webhook `status.updated` é emitido. Quando `false`,
        nada é armazenado e `request_id` é um UUID de correlação avulso que não
        pode ser consultado depois.


        **Sandbox.** As chaves de API de sandbox ignoram todo o processamento e
        o faturamento: após a validação da requisição (entradas malformadas
        ainda retornam `400`), o endpoint retorna um payload simulado estático
        `Approved` (uma conta de energia fictícia da "Sandbox Power Co."),
        nenhuma sessão é persistida e nenhum crédito é consumido.


        **Autenticação.** Envie a chave de API da sua aplicação no cabeçalho
        `x-api-key`. Credenciais ausentes ou inválidas retornam `403`
        (`{"detail": "You do not have permission to perform this action."}`);
        esta API nunca retorna `401`.


        **Limite de requisições.** Cota de escrita compartilhada de 300
        requisições/min por chave de API entre todos os endpoints
        POST/PATCH/DELETE; ao excedê-la, a API retorna `429`.


        Observação: `FUTURE_ISSUE_DATE` e `POOR_DOCUMENT_QUALITY` existem em
        sessões de fluxo de verificação (workflow), mas nunca são gerados por
        este endpoint independente; um documento com data futura não é recusado
        automaticamente aqui.
      operationId: post_v3poa
      parameters: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - document
              properties:
                document:
                  type: string
                  format: binary
                  description: >-
                    O documento de Comprovante de endereço. Extensões
                    permitidas: `tiff`, `jpg`, `jpeg`, `png`, `pdf`, `webp`.
                    Tamanho máximo de upload: **15 MB** (arquivos maiores são
                    rejeitados com `400`). PDFs com várias páginas são aceitos
                    (espere uma latência maior); PDFs criptografados exigem
                    `document_password`. As imagens são compactadas
                    automaticamente antes do processamento.
                document_password:
                  type: string
                  description: >-
                    Senha para descriptografar `document` quando for um PDF
                    criptografado. Enviar um PDF criptografado sem senha (ou com
                    uma senha errada) retorna `400`.
                  writeOnly: true
                expected_address:
                  type: string
                  description: >-
                    Endereço a ser verificado em relação ao documento. Ele é
                    geocodificado e comparado com o endereço extraído; uma
                    divergência (ou um endereço esperado que não pode ser
                    geocodificado/verificado) adiciona
                    `ADDRESS_MISMATCH_WITH_PROVIDED`, regido por
                    `poa_address_mismatch_action`. A forma geocodificada é
                    retornada em `expected_details_formatted_address` /
                    `expected_details_parsed_address`.
                  example: Av. Monseñor Tavella 1291, Salta, Argentina
                expected_country:
                  type: string
                  description: >-
                    País a ser verificado em relação ao documento (código ISO
                    3166-1, por exemplo, `ARG` ou `AR`). Uma divergência com o
                    país do documento adiciona
                    `POA_COUNTRY_MISMATCH_WITH_PROVIDED`, controlado por
                    `poa_address_mismatch_action`.
                  example: ARG
                expected_first_name:
                  type: string
                  description: >-
                    Primeiro nome a ser verificado em relação a
                    `name_on_document` (correspondência aproximada, considerando
                    transliteração). Uma pontuação abaixo do limiar de
                    correspondência adiciona `NAME_MISMATCH_WITH_PROVIDED`,
                    controlado por `poa_address_mismatch_action`.
                  example: Sophia
                expected_last_name:
                  type: string
                  description: >-
                    Sobrenome a ser verificado em relação a `name_on_document`,
                    combinado com `expected_first_name` para a pontuação de
                    correspondência.
                  example: Martinez
                poa_languages_allowed:
                  type: string
                  description: >-
                    Lista separada por vírgula dos idiomas de documento aceitos,
                    como códigos ISO 639-1 (por exemplo, `en,es,fr`). Quando
                    omitida ou vazia, **todos os 51 idiomas compatíveis** são
                    aceitos. Um documento em um idioma fora da lista adiciona
                    `UNSUPPORTED_DOCUMENT_LANGUAGE` (controlado por
                    `poa_unsupported_language_action`); um código desconhecido
                    na lista retorna `400` com o conjunto completo de códigos
                    compatíveis.
                  example: en,es
                poa_document_age_months:
                  type: string
                  description: >-
                    Pares `key:value` separados por vírgula que definem a idade
                    máxima do documento, em meses, por tipo de documento.
                    Chaves: `utility_bill`, `bank_statement`,
                    `government_issued_document`, `other_poa_document`; valores:
                    `1`–`120`, ou `-1` para ilimitado (sem verificação de
                    idade). Padrões quando omitido:
                    `utility_bill:3,bank_statement:3,government_issued_document:12,other_poa_document:12`.
                    Um documento mais antigo que o limite é recusado com
                    `POA_DOCUMENT_EXPIRED`. **Atenção:** ao informar este campo,
                    liste *todos* os tipos que você aceita; os tipos omitidos
                    são tratados como não aceitos (informativo
                    `POA_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION`) e a
                    verificação de idade deles é ignorada.
                  example: utility_bill:3,bank_statement:6
                poa_name_mismatch_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    Aceito, mas **atualmente não aplicado** — os avisos de
                    divergência de nome (`NAME_MISMATCH_WITH_PROVIDED`) seguem
                    `poa_address_mismatch_action`. Defina
                    `poa_address_mismatch_action` para controlar o comportamento
                    de divergência tanto de nome quanto de endereço.
                poa_document_issues_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    O que fazer em problemas de integridade do arquivo — na
                    prática, este endpoint só gera `DOCUMENT_METADATA_MISMATCH`.
                poa_document_authenticity_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    O que fazer quando há suspeita de manipulação do documento
                    (`SUSPECTED_DOCUMENT_MANIPULATION`) — por exemplo, o PDF foi
                    modificado após a assinatura digital, processado por um
                    editor de PDF conhecido, apresenta manipulação por
                    sobreposição de texto ou tem datas EXIF inconsistentes.
                poa_unsupported_language_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    O que fazer quando o idioma do documento está fora de
                    `poa_languages_allowed` (`UNSUPPORTED_DOCUMENT_LANGUAGE`).
                poa_address_mismatch_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    O que fazer quando os dados extraídos divergem dos campos
                    `expected_*`: `ADDRESS_MISMATCH_WITH_PROVIDED`,
                    `NAME_MISMATCH_WITH_PROVIDED` e
                    `POA_COUNTRY_MISMATCH_WITH_PROVIDED` seguem todos esta ação.
                poa_issuer_not_identified_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    O que fazer quando nenhuma empresa ou organização emissora
                    pode ser identificada no documento
                    (`ISSUER_NOT_IDENTIFIED`).
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    Quando `true` (padrão), persiste a chamada como uma sessão
                    do tipo API: visível no Business Console, recuperável via
                    `GET /v3/session/{sessionId}/decision/` usando o
                    `request_id` retornado, anunciada por meio de um webhook
                    `status.updated` e com o documento enviado armazenado.
                    Quando `false`, nada é armazenado e `request_id` é um UUID
                    transitório usado apenas para correlacionar a resposta.
                  example: true
                vendor_data:
                  type: string
                  description: >-
                    String opaca opcional (seu ID interno de usuário, e-mail,
                    UUID…) armazenada na sessão persistida e devolvida na
                    resposta. Use-a para correlacionar chamadas de API com seus
                    próprios registros e para filtrar sessões posteriormente.
                  example: user-123
                metadata:
                  type: object
                  additionalProperties: true
                  description: >-
                    Objeto JSON opcional armazenado com a sessão (quando
                    `save_api_request=true`) e devolvido na resposta. Em
                    requisições multipart, envie-o como um campo de string
                    codificada em JSON (por exemplo,
                    `metadata={"flow":"onboarding"}`), que é convertido em um
                    objeto.
                  example:
                    flow: onboarding
            example:
              document: (binary JPEG/PNG/PDF of the utility bill or bank statement)
              expected_address: Av. Monseñor Tavella 1291, Salta, Argentina
              expected_country: ARG
              expected_first_name: Sophia
              expected_last_name: Martinez
              poa_languages_allowed: en,es
              save_api_request: true
              vendor_data: user-123
      responses:
        '200':
          description: >-
            Documento processado. `poa.status` é `Approved` ou `Declined`; cada
            problema detectado é detalhado em `poa.warnings`. Um documento
            expirado, divergente ou suspeito ainda retorna `200` com `status:
            "Declined"`: inspecione o corpo, não apenas o código HTTP. Quando
            `save_api_request=true`, `request_id` é o id da sessão persistida.
          content:
            application/json:
              examples:
                Approved:
                  summary: >-
                    Conta de consumo lida sem problemas, sem verificações de
                    dados esperados
                  value:
                    request_id: 4b523a8d-ed32-45e4-8aa8-a89eda459d88
                    poa:
                      issuing_state: ARG
                      document_type: UTILITY_BILL
                      document_subtype: WATER_BILL
                      document_language: es
                      issuer: Aguas del Norte
                      issue_date: '2026-04-10'
                      expiration_date: null
                      poa_address: >-
                        AVDA. MONSEÑOR TAVELLA N° 1291, B° VILLA LAVALLE CP:
                        4400, CAPITAL - SALTA
                      poa_formatted_address: Av. Monseñor Tavella 1291 b, A4400 Salta, Argentina
                      poa_parsed_address:
                        street_1: Avenida Monseñor Tavella 1291
                        street_2: b
                        city: Salta
                        region: Salta
                        country: AR
                        postal_code: A4400
                        document_location:
                          latitude: -24.8208682
                          longitude: -65.4130954
                      expected_details_address: null
                      expected_details_formatted_address: null
                      expected_details_parsed_address: null
                      name_on_document: OESTE EMBOTELLADORA S.A.
                      extra_fields:
                        bank_account_number: null
                        bank_iban: null
                        bank_sort_code: null
                        bank_routing_number: null
                        bank_swift_bic: null
                        bank_branch_name: null
                        bank_branch_address: null
                        document_phone_number: null
                        additional_names:
                          - LA EMBOTELLADORA DEL NORTE SA
                      detected_codes:
                        - type: QR_CODE
                          page_number: 1
                          position:
                            - - 820
                              - 1120
                            - - 1002
                              - 1120
                            - - 1002
                              - 1302
                            - - 820
                              - 1302
                          x: 820
                          'y': 1120
                          width: 182
                          height: 182
                          page_width: 1190
                          page_height: 1684
                          raw_payload: >-
                            aHR0cHM6Ly9hZ3Vhc2RlbG5vcnRlLmNvbS9mYWN0dXJhLzk5ODgxMQ==
                          parsed_payload: https://aguasdelnorte.com/factura/998811
                        - type: CODE_128
                          page_number: 1
                          position:
                            - - 112
                              - 1480
                            - - 560
                              - 1480
                            - - 560
                              - 1540
                            - - 112
                              - 1540
                          x: 112
                          'y': 1480
                          width: 448
                          height: 60
                          page_width: 1190
                          page_height: 1684
                          raw_payload: MDA5OTg4MTEwMDA0Mg==
                          parsed_payload: '0099881100042'
                      status: Approved
                      warnings: []
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T02:29:02.439655+00:00'
                Declined - document too old:
                  summary: >-
                    Data de emissão mais antiga que o `poa_document_age_months`
                    permitido
                  value:
                    request_id: f61681b8-9422-4378-ac3e-04c6a247fb45
                    poa:
                      issuing_state: ARG
                      document_type: UTILITY_BILL
                      document_subtype: WATER_BILL
                      document_language: es
                      issuer: Aguas del Norte
                      issue_date: '2021-02-10'
                      expiration_date: null
                      poa_address: >-
                        AVDA. MONSEÑOR TAVELLA N° 1291, B° VILLA LAVALLE CP:
                        4400, CAPITAL - SALTA
                      poa_formatted_address: Av. Monseñor Tavella 1291 b, A4400 Salta, Argentina
                      poa_parsed_address:
                        street_1: Avenida Monseñor Tavella 1291
                        street_2: b
                        city: Salta
                        region: Salta
                        country: AR
                        postal_code: A4400
                        document_location:
                          latitude: -24.8208682
                          longitude: -65.4130954
                      expected_details_address: null
                      expected_details_formatted_address: null
                      expected_details_parsed_address: null
                      name_on_document: OESTE EMBOTELLADORA S.A.
                      extra_fields:
                        bank_account_number: null
                        bank_iban: null
                        bank_sort_code: null
                        bank_routing_number: null
                        bank_swift_bic: null
                        bank_branch_name: null
                        bank_branch_address: null
                        document_phone_number: null
                        additional_names:
                          - LA EMBOTELLADORA DEL NORTE SA
                      status: Declined
                      warnings:
                        - risk: POA_DOCUMENT_EXPIRED
                          feature: PROOF_OF_ADDRESS
                          additional_data:
                            expiration_reason: age_window
                            max_age_months: 3
                            document_subtype: WATER_BILL
                            document_type: UTILITY_BILL
                            issue_date: '2021-02-10'
                          log_type: error
                          short_description: Document expired
                          long_description: >-
                            The submitted document is older than the maximum
                            accepted age of 3 months from its issue date, which
                            exceeds the acceptable time period for validity.
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T02:23:02.165493+00:00'
                Declined - name mismatch:
                  summary: >-
                    `expected_first_name`/`expected_last_name` não correspondem
                    a `name_on_document`
                  value:
                    request_id: 0a7f2f9c-58f1-4b8e-b1e3-2f6f9d4f7a21
                    poa:
                      issuing_state: ARG
                      document_type: UTILITY_BILL
                      document_subtype: WATER_BILL
                      document_language: es
                      issuer: Aguas del Norte
                      issue_date: '2021-02-10'
                      expiration_date: null
                      poa_address: >-
                        AVDA. MONSEÑOR TAVELLA N° 1291, B° VILLA LAVALLE CP:
                        4400, CAPITAL - SALTA
                      poa_formatted_address: Av. Monseñor Tavella 1291 b, A4400 Salta, Argentina
                      poa_parsed_address:
                        street_1: Avenida Monseñor Tavella 1291
                        street_2: b
                        city: Salta
                        region: Salta
                        country: AR
                        postal_code: A4400
                        document_location:
                          latitude: -24.8208682
                          longitude: -65.4130954
                      expected_details_address: null
                      expected_details_formatted_address: null
                      expected_details_parsed_address: null
                      name_on_document: OESTE EMBOTELLADORA S.A.
                      extra_fields:
                        bank_account_number: null
                        bank_iban: null
                        bank_sort_code: null
                        bank_routing_number: null
                        bank_swift_bic: null
                        bank_branch_name: null
                        bank_branch_address: null
                        document_phone_number: null
                        additional_names:
                          - LA EMBOTELLADORA DEL NORTE SA
                      status: Declined
                      warnings:
                        - risk: NAME_MISMATCH_WITH_PROVIDED
                          feature: PROOF_OF_ADDRESS
                          additional_data: null
                          log_type: error
                          short_description: Name mismatch with provided information
                          long_description: >-
                            The full name on the document does not match the
                            name from the user's verified identity documents, or
                            the full name sent by API.
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T02:27:21.330172+00:00'
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                    format: uuid
                    description: >-
                      ID da sessão persistida quando `save_api_request=true`
                      (utilizável com `GET /v3/session/{sessionId}/decision/`);
                      caso contrário, um UUID de correlação transitório.
                  poa:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - Declined
                        description: >-
                          `Approved` quando nenhum aviso resulta em recusa;
                          `Declined` caso contrário. A lista `warnings` explica
                          o motivo.
                      issuing_state:
                        type: string
                        nullable: true
                        description: >-
                          País em que o documento foi emitido, conforme extraído
                          do documento — geralmente ISO 3166-1 alpha-3 (por
                          exemplo, `ARG`).
                        example: ARG
                      document_type:
                        type: string
                        enum:
                          - UTILITY_BILL
                          - BANK_STATEMENT
                          - GOVERNMENT_ISSUED_DOCUMENT
                          - OTHER_POA_DOCUMENT
                          - UNKNOWN
                        description: >-
                          Categoria de documento detectada. `UNKNOWN` significa
                          que o documento não pôde ser classificado como um
                          Comprovante de endereço aceitável e é recusado
                          automaticamente com `INVALID_DOCUMENT_TYPE`. Nunca é
                          nulo: falhas de classificação retornam `UNKNOWN`.
                      document_subtype:
                        type: string
                        description: >-
                          Classificação mais detalhada dentro de
                          `document_type`, por exemplo `ELECTRICITY_BILL`,
                          `WATER_BILL`, `GAS_BILL`, `INTERNET_BILL`,
                          `PHONE_BILL` (contas de serviços públicos);
                          `ACCOUNT_STATEMENT`, `CREDIT_CARD_STATEMENT` (extratos
                          bancários); `TAX_ASSESSMENT`, `RESIDENCY_CERTIFICATE`
                          (documentos governamentais). `UNKNOWN` quando não foi
                          possível determinar nenhum subtipo. Nunca é nulo:
                          falhas de classificação retornam `UNKNOWN`.
                        example: WATER_BILL
                      document_language:
                        type: string
                        nullable: true
                        description: Idioma do documento detectado (ISO 639-1).
                        example: es
                      issuer:
                        type: string
                        nullable: true
                        description: >-
                          Empresa ou organização que emitiu o documento. `null`
                          adiciona `ISSUER_NOT_IDENTIFIED`.
                        example: Aguas del Norte
                      issue_date:
                        type: string
                        format: date
                        nullable: true
                        description: >-
                          Data de emissão do documento (`YYYY-MM-DD`). `null`
                          quando não foi possível extraí-la, o que resulta em
                          recusa com `UNABLE_TO_EXTRACT_ISSUE_DATE` neste
                          endpoint.
                        example: '2021-02-10'
                      expiration_date:
                        type: string
                        format: date
                        nullable: true
                        description: >-
                          Data explícita de validade impressa no documento,
                          quando houver. Independente da verificação de idade
                          `poa_document_age_months`.
                      poa_address:
                        type: string
                        nullable: true
                        description: >-
                          Endereço exatamente como impresso no documento. `null`
                          resulta em recusa automática com
                          `MISSING_ADDRESS_INFORMATION`.
                      poa_formatted_address:
                        type: string
                        nullable: true
                        description: Versão geocodificada e normalizada de `poa_address`.
                        example: Av. Monseñor Tavella 1291 b, A4400 Salta, Argentina
                      poa_parsed_address:
                        type: object
                        nullable: true
                        description: >-
                          Detalhamento estruturado e geocodificado do endereço
                          do documento. `null` quando o endereço não pôde ser
                          interpretado.
                        properties:
                          street_1:
                            type: string
                            nullable: true
                            example: Avenida Monseñor Tavella 1291
                          street_2:
                            type: string
                            nullable: true
                          city:
                            type: string
                            nullable: true
                            example: Salta
                          region:
                            type: string
                            nullable: true
                            example: Salta
                          country:
                            type: string
                            nullable: true
                            description: Código de país ISO 3166-1 alpha-2.
                            example: AR
                          postal_code:
                            type: string
                            nullable: true
                            example: A4400
                          document_location:
                            type: object
                            nullable: true
                            properties:
                              latitude:
                                type: number
                              longitude:
                                type: number
                            description: >-
                              Coordenadas geocodificadas do endereço do
                              documento.
                      expected_details_address:
                        type: string
                        nullable: true
                        description: Eco do `expected_address` que você enviou, ou `null`.
                      expected_details_formatted_address:
                        type: string
                        nullable: true
                        description: >-
                          Versão geocodificada e normalizada de
                          `expected_address`; `null` quando não fornecido ou não
                          geocodificável.
                      expected_details_parsed_address:
                        type: object
                        nullable: true
                        additionalProperties: true
                        description: >-
                          Resultado completo da geocodificação de
                          `expected_address` (rua/cidade/região/país/código
                          postal, além da saída bruta do geocodificador e de um
                          indicador `is_verified`). `null` quando
                          `expected_address` não foi informado.
                      name_on_document:
                        type: string
                        nullable: true
                        description: >-
                          Nome do titular principal extraído do documento;
                          comparado com
                          `expected_first_name`/`expected_last_name` quando
                          informados. `null` resulta em recusa com
                          `POA_NAME_NOT_DETECTED` neste endpoint.
                        example: OESTE EMBOTELLADORA S.A.
                      extra_fields:
                        type: object
                        description: >-
                          Dados extras específicos do documento. Os campos
                          bancários são preenchidos para extratos bancários
                          quando estão impressos no documento; caso contrário,
                          `null`.
                        properties:
                          bank_account_number:
                            type: string
                            nullable: true
                          bank_iban:
                            type: string
                            nullable: true
                          bank_sort_code:
                            type: string
                            nullable: true
                          bank_routing_number:
                            type: string
                            nullable: true
                          bank_swift_bic:
                            type: string
                            nullable: true
                          bank_branch_name:
                            type: string
                            nullable: true
                          bank_branch_address:
                            type: string
                            nullable: true
                          document_phone_number:
                            type: string
                            nullable: true
                            description: >-
                              Número de telefone de contato impresso no
                              documento.
                          additional_names:
                            type: array
                            items:
                              type: string
                            description: >-
                              Outros nomes de titulares encontrados no documento
                              (por exemplo, cotitulares da conta, nomes
                              anteriores da conta).
                      warnings:
                        type: array
                        description: >-
                          Vazio em uma aprovação sem ressalvas. Cada entrada
                          explica um risco detectado; entradas com `log_type:
                          "error"` definem `status` como `Declined`.
                        items:
                          type: object
                          properties:
                            risk:
                              type: string
                              description: >-
                                Código de risco legível por máquina. Sempre
                                resultam em recusa:
                                `MISSING_ADDRESS_INFORMATION`,
                                `POA_DOCUMENT_EXPIRED`, `INVALID_DOCUMENT_TYPE`,
                                `UNABLE_TO_VALIDATE_DOCUMENT_AGE`, além de
                                `UNABLE_TO_EXTRACT_ISSUE_DATE` e
                                `POA_NAME_NOT_DETECTED` (fixados como recusa
                                neste endpoint). Controlados por opções da
                                requisição: `NAME_MISMATCH_WITH_PROVIDED` /
                                `ADDRESS_MISMATCH_WITH_PROVIDED` /
                                `POA_COUNTRY_MISMATCH_WITH_PROVIDED`
                                (`poa_address_mismatch_action`),
                                `POOR_DOCUMENT_QUALITY` (nunca gerado por este
                                endpoint) / `DOCUMENT_METADATA_MISMATCH`
                                (`poa_document_issues_action`),
                                `SUSPECTED_DOCUMENT_MANIPULATION`
                                (`poa_document_authenticity_action`),
                                `UNSUPPORTED_DOCUMENT_LANGUAGE`
                                (`poa_unsupported_language_action`),
                                `ISSUER_NOT_IDENTIFIED`
                                (`poa_issuer_not_identified_action`).
                                Informativos neste endpoint:
                                `POA_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION`,
                                `UNPARSABLE_OR_INVALID_ADDRESS`.
                              example: POA_DOCUMENT_EXPIRED
                            feature:
                              type: string
                              enum:
                                - PROOF_OF_ADDRESS
                              description: >-
                                Recurso que emitiu o aviso. Sempre
                                `PROOF_OF_ADDRESS` neste endpoint.
                            additional_data:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: >-
                                Contexto adicional para alguns riscos. Por
                                exemplo, `POA_DOCUMENT_EXPIRED` inclui
                                `expiration_reason` (`printed_expiration` ou
                                `age_window`), `document_type`,
                                `document_subtype` e `issue_date`, além de
                                `expiration_date` no caso `printed_expiration`
                                ou `max_age_months` no caso `age_window`;
                                `SUSPECTED_DOCUMENT_MANIPULATION` inclui
                                `reason` e `detection_method`. `null` para a
                                maioria dos riscos.
                            log_type:
                              type: string
                              enum:
                                - error
                                - information
                              description: >-
                                Severidade. Avisos `error` levam `status` a
                                `Declined`; entradas `information` são apenas
                                informativas e nunca recusam por si só.
                                (`warning` não é produzido por este endpoint:
                                suas opções aceitam apenas `DECLINE` ou
                                `NO_ACTION`.)
                            short_description:
                              type: string
                              description: Resumo legível do risco em uma linha.
                            long_description:
                              type: string
                              description: Explicação legível do risco.
                      detected_codes:
                        type: array
                        description: >-
                          QR codes e códigos de barras detectados em todas as
                          páginas processadas do documento. Vazio quando nenhum
                          é encontrado. Um QR code localizado, mas que não pôde
                          ser decodificado, tem `parsed_payload: null`.
                        items:
                          $ref: '#/components/schemas/DocumentAIDetectedCode'
                  vendor_data:
                    type: string
                    nullable: true
                    description: Eco do `vendor_data` que você enviou, ou `null`.
                  metadata:
                    type: object
                    nullable: true
                    additionalProperties: true
                    description: Eco do objeto `metadata` que você enviou, ou `null`.
                  created_at:
                    type: string
                    format: date-time
                    description: >-
                      Timestamp ISO 8601 (UTC) do momento em que a resposta foi
                      gerada.
        '400':
          description: >-
            Erro de validação ou de processamento. Problemas em nível de campo
            retornam o envelope padrão do DRF (um array de mensagens para cada
            campo com problema). Problemas com PDFs criptografados retornam
            `{"detail": ...}`. Um documento que o pipeline de extração não
            consegue processar retorna `{"error": ["Error extracting POA
            information"]}`.
          content:
            application/json:
              examples:
                Missing document:
                  summary: '`document` não incluído nos dados do formulário'
                  value:
                    document:
                      - No file was submitted.
                Unsupported file extension:
                  summary: Extensão de arquivo fora de tiff/jpg/jpeg/png/pdf/webp
                  value:
                    document:
                      - >-
                        File extension “txt” is not allowed. Allowed extensions
                        are: tiff, jpg, jpeg, png, pdf, webp.
                File too large:
                  summary: O upload excede o limite de 15 MB
                  value:
                    document:
                      - File size should not exceed 15 MB
                Encrypted PDF:
                  summary: PDF enviado sem a senha exigida
                  value:
                    detail: >-
                      The PDF is encrypted. Please upload a decrypted PDF or a
                      photo instead.
                Wrong PDF password:
                  summary: '`document_password` não descriptografa o PDF'
                  value:
                    detail: >-
                      The PDF password is incorrect. Please provide the correct
                      password.
                Invalid language code:
                  summary: '`poa_languages_allowed` contém um código não suportado'
                  value:
                    poa_languages_allowed:
                      - >-
                        Invalid language code: 'xx'. Must be one of the
                        supported languages: ['ar', 'bn', 'hy', 'bg', 'bs',
                        'ca', 'cnr', 'sq', 'zh', 'hr', 'cs', 'da', 'nl', 'en',
                        'et', 'fi', 'fr', 'ka', 'kk', 'de', 'el', 'he', 'hi',
                        'hu', 'id', 'it', 'ja', 'ko', 'ky', 'lv', 'lt', 'mk',
                        'mn', 'ms', 'no', 'fa', 'pl', 'pt', 'ro', 'ru', 'sr',
                        'sk', 'sl', 'so', 'es', 'sv', 'th', 'tr', 'uk', 'uz',
                        'vi'].
                Invalid document age value:
                  summary: Valor de `poa_document_age_months` fora de 1–120 / -1
                  value:
                    poa_document_age_months:
                      - >-
                        Invalid integer value for 'utility_bill': '999'. Must be
                        -1 (unlimited) or a positive integer between 1 and 120.
                Extraction failure:
                  summary: >-
                    O documento não pôde ser processado pelo pipeline de
                    extração
                  value:
                    error:
                      - Error extracting POA information
        '403':
          description: >-
            Permissão negada. Retornado quando o cabeçalho `x-api-key` está
            ausente e também quando o saldo da organização que faz a chamada não
            cobre a chamada; uma chave incorreta, revogada ou expirada retorna
            `401`. Uma chave ausente retorna `403` com `{"detail": ...}`; uma
            chave incorreta, revogada ou expirada retorna `401`. Créditos
            insuficientes retornam `403` com `{"error": ...}` antes de qualquer
            processamento do documento.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: Nenhum cabeçalho `x-api-key`, ou a chave é inválida/revogada
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: O saldo da organização não cobre a chamada
                  value:
                    error: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '429':
          description: >-
            Limite de requisições excedido. Todos os endpoints POST/PATCH/DELETE
            compartilham uma cota de 300 requisições de escrita por minuto por
            chave de API. A resposta inclui os cabeçalhos `X-RateLimit-Limit`,
            `X-RateLimit-Remaining`, `X-RateLimit-Reset` e `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Mais de 300 requisições de escrita no minuto atual
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl -X POST 'https://verification.didit.me/v3/poa/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -F 'document=@./utility-bill.pdf' \
              -F 'expected_address=Av. Monseñor Tavella 1291, Salta, Argentina' \
              -F 'expected_country=ARG' \
              -F 'expected_first_name=Sophia' \
              -F 'expected_last_name=Martinez' \
              -F 'poa_languages_allowed=en,es' \
              -F 'vendor_data=user-123' \
              --max-time 45
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.proof_of_address.verify(
                document=open("document.pdf", "rb"),
                expected_address="Av. Monseñor Tavella 1291, Salta, Argentina",
                expected_country="ARG",
                expected_first_name="Sophia",
                expected_last_name="Martinez",
                poa_languages_allowed="en,es",
                save_api_request=True,
                vendor_data="user-123",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit, { fileFromPath } from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.proofOfAddress.verify({
              document: await fileFromPath("document.pdf"),
              expected_address: "Av. Monseñor Tavella 1291, Salta, Argentina",
              expected_country: "ARG",
              expected_first_name: "Sophia",
              expected_last_name: "Martinez",
              poa_languages_allowed: "en,es",
              save_api_request: true,
              vendor_data: "user-123",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.ProofOfAddress.Verify(ctx, didit.ProofOfAddressVerifyParams{\n\tDocument:            didit.FileFromPath(\"document.pdf\"),\n\tExpectedAddress:     didit.String(\"Av. Monseñor Tavella 1291, Salta, Argentina\"),\n\tExpectedCountry:     didit.String(\"ARG\"),\n\tExpectedFirstName:   didit.String(\"Sophia\"),\n\tExpectedLastName:    didit.String(\"Martinez\"),\n\tPOALanguagesAllowed: didit.String(\"en,es\"),\n\tSaveAPIRequest:      didit.Bool(true),\n\tVendorData:          didit.String(\"user-123\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.nio.file.Path;

            import me.didit.Didit;

            import me.didit.types.ProofOfAddressVerifyParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.proofOfAddress().verify(ProofOfAddressVerifyParams.builder()
                    .document(Path.of("document.pdf"))
                    .expectedAddress("Av. Monseñor Tavella 1291, Salta, Argentina")
                    .expectedCountry("ARG")
                    .expectedFirstName("Sophia")
                    .expectedLastName("Martinez")
                    .poaLanguagesAllowed("en,es")
                    .saveApiRequest(true)
                    .vendorData("user-123")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;
            use Didit\File;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->proofOfAddress->verify([
                'document' => File::fromPath('document.pdf'),
                'expected_address' => 'Av. Monseñor Tavella 1291, Salta, Argentina',
                'expected_country' => 'ARG',
                'expected_first_name' => 'Sophia',
                'expected_last_name' => 'Martinez',
                'poa_languages_allowed' => 'en,es',
                'save_api_request' => true,
                'vendor_data' => 'user-123',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.proof_of_address.verify(
              document: Pathname("document.pdf"),
              expected_address: "Av. Monseñor Tavella 1291, Salta, Argentina",
              expected_country: "ARG",
              expected_first_name: "Sophia",
              expected_last_name: "Martinez",
              poa_languages_allowed: "en,es",
              save_api_request: true,
              vendor_data: "user-123"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.ProofOfAddress.VerifyAsync(new
            ProofOfAddressVerifyParams

            {
                Document = FileUpload.FromPath("document.pdf"),
                ExpectedAddress = "Av. Monseñor Tavella 1291, Salta, Argentina",
                ExpectedCountry = "ARG",
                ExpectedFirstName = "Sophia",
                ExpectedLastName = "Martinez",
                PoaLanguagesAllowed = "en,es",
                SaveApiRequest = true,
                VendorData = "user-123",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    DocumentAIDetectedCode:
      type: object
      required:
        - type
        - page_number
        - position
        - x
        - 'y'
        - width
        - height
        - page_width
        - page_height
        - raw_payload
        - parsed_payload
      properties:
        type:
          type: string
          description: >-
            Simbologia detectada, por exemplo `QR_CODE`, `CODE_128`, `EAN_13`,
            `DATA_MATRIX` ou `PDF_417`.
        page_number:
          type: integer
          minimum: 1
          description: Número da página, começando em 1.
        position:
          type: array
          nullable: true
          description: >-
            Polígono detectado em coordenadas de pixels da página renderizada. É
            `null` quando não há uma localização confiável disponível.
          items:
            type: array
            minItems: 2
            maxItems: 2
            items:
              type: integer
        x:
          type: integer
          nullable: true
          description: >-
            Borda esquerda da caixa delimitadora, em pixels da página
            renderizada.
        'y':
          type: integer
          nullable: true
          description: >-
            Borda superior da caixa delimitadora, em pixels da página
            renderizada.
        width:
          type: integer
          nullable: true
          description: Largura da caixa delimitadora em pixels da página renderizada.
        height:
          type: integer
          nullable: true
          description: Altura da caixa delimitadora em pixels da página renderizada.
        page_width:
          type: integer
          description: Largura da página renderizada, em pixels.
        page_height:
          type: integer
          description: Altura da página renderizada, em pixels.
        raw_payload:
          type: string
          description: >-
            Payload bruto do decodificador como string base64, quando
            disponível; caso contrário, uma string vazia.
        parsed_payload:
          nullable: true
          description: >-
            String decodificada ou valor estruturado. `null` quando o código foi
            localizado, mas não pôde ser decodificado.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Chave de API da sua aplicação, em Developers -> API keys no Business
        Console. A chave principal tem acesso total. Uma chave nomeada pode ter
        escopo restrito: nenhum acesso, leitura ou escrita por recurso, limitada
        a alguns fluxos ou a sessões aprovadas, a uma lista de endereços IP e a
        uma data de validade. 401 significa que a chave está errada, revogada ou
        expirada; 403 significa que nenhuma chave foi enviada, que a chave não
        tem acesso a este recurso ou ação, ou que a requisição veio de um
        endereço fora da sua lista de IPs; 404 em uma rota de sessão significa
        que a sessão está fora dos fluxos ou status da chave. Uma chave sem
        acesso a mídia recebe URLs de imagem, vídeo e PDF como null, e uma chave
        sem permissão de escrita em sessões recebe links e tokens de sessão como
        null. Consulte https://docs.didit.me/console/api-keys.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.