> ## 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 justificatif de domicile : vérification POA et OCR

> Didit vérifie les justificatifs de domicile via POST /v3/poa/ : OCR de l'adresse, contrôle d'authenticité, tarif à l'usage, sans engagement.



## OpenAPI

````yaml fr/openapi-25.json POST /v3/poa/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de vérification d'identité. Authentifiez-vous avec l'en-tête x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/poa/:
    post:
      tags:
        - Standalone APIs
      summary: Justificatif de domicile (OCR de document + contrôles d'adresse)
      description: "Extrayez et validez un justificatif de domicile — factures de services publics, relevés bancaires et documents officiels — en un seul appel. Renvoie l'émetteur, les dates d'émission/d'expiration, le nom du titulaire, l'adresse brute et analysée/géocodée, un `status` `Approved`/`Declined`, ainsi qu'une liste `warnings` expliquant chaque problème détecté.\n\n**Latence.** L'extraction est basée sur des LLM\_: les appels typiques prennent **5–15\_secondes**, et les PDF de plusieurs pages jusqu'à **~30\_secondes**. Configurez un délai d'expiration client d'**au moins 45\_secondes** et ne réessayez pas avant la fin de l'appel.\n\n**Fonctionnement.** Le document (image ou PDF, jusqu'à 15\_Mo\_; les PDF chiffrés nécessitent `document_password`) est classé selon un type et un sous-type de document (par exemple `UTILITY_BILL` / `WATER_BILL`), puis l'émetteur, les dates, le nom du titulaire et l'adresse sont extraits grâce à une extraction basée sur des LLM. L'adresse est analysée et géocodée dans `poa_parsed_address`. L'analyse médico-légale PDF/EXIF recherche les altérations — modification après signature numérique, éditeurs PDF connus, manipulation de texte superposé, réexportations suspectes — faisant remonter `SUSPECTED_DOCUMENT_MANIPULATION` ou `DOCUMENT_METADATA_MISMATCH`. Un champ de texte qui a été effacé puis réécrit avec une autre police, lorsque le fichier lui-même ne contient aucune preuve de la modification de son contenu, fait remonter `POA_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT`. L'ancienneté du document est validée par rapport à `poa_document_age_months`, et la langue par rapport à `poa_languages_allowed`. Si vous transmettez `expected_address`, `expected_country` ou `expected_first_name`/`expected_last_name`, les valeurs extraites font l'objet d'une vérification croisée et les non-correspondances sont signalées.\n\n**Logique de décision.** `status` est `Approved` à moins qu'au moins un avertissement n'entraîne un refus. Les échecs critiques entraînent toujours un refus\_: `MISSING_ADDRESS_INFORMATION`, `POA_DOCUMENT_EXPIRED`, `INVALID_DOCUMENT_TYPE`, `UNABLE_TO_VALIDATE_DOCUMENT_AGE`, ainsi que `UNABLE_TO_EXTRACT_ISSUE_DATE` et `POA_NAME_NOT_DETECTED` (non configurables sur cet endpoint). Cinq groupes de risques sont configurables par requête via les options `poa_*_action` (`DECLINE` ou `NO_ACTION`, ayant toutes `DECLINE` par défaut). `POA_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION` et `UNPARSABLE_OR_INVALID_ADDRESS` sont informatifs sur cet endpoint et n'entraînent jamais de refus. Un document qui ne peut pas du tout être traité renvoie `400`\_; un document lisible mais problématique renvoie `200` avec `status: \"Declined\"` — examinez toujours `poa.status` et `poa.warnings`, pas seulement le code HTTP.\n\n**Facturation.** Chaque réponse `200` consomme un crédit d'API Justificatif de domicile (déduit du crédit de votre forfait ou de votre solde de recharge). Lorsque le solde de l'organisation ne peut pas couvrir l'appel, l'endpoint renvoie `403` avec l'erreur indiquant que les crédits sont insuffisants avant tout traitement de document.\n\n**Persistance de session (`save_api_request`, valeur par défaut `true`).** Lorsque la valeur est `true`, l'appel est conservé sous forme de session de type API\_: il apparaît dans la Business Console, le document importé est stocké, le `request_id` renvoyé est un véritable identifiant de session que vous pouvez transmettre à `GET /v3/session/{sessionId}/decision/` (la décision expose en outre `document_file` et les données médico-légales de `document_metadata`, que cette réponse omet), et un webhook `status.updated` est émis. Lorsque la valeur est `false`, rien n'est stocké et `request_id` est un UUID de corrélation à usage unique qui ne pourra pas être consulté ultérieurement.\n\n**Sandbox.** Les clés API de sandbox ignorent tout traitement et toute facturation\_: après la validation de la requête (une entrée malformée renvoie toujours `400`), l'endpoint renvoie un payload fictif statique `Approved` (une facture d'électricité fictive «\_Sandbox Power Co.\_»), aucune session n'est conservée et aucun crédit n'est consommé.\n\n**Authentification.** Envoyez la clé API de votre application dans l'en-tête `x-api-key`. Des identifiants manquants ou invalides renvoient `403` (`{\"detail\": \"You do not have permission to perform this action.\"}`) — cette API ne renvoie jamais `401`.\n\n**Limite de débit.** Budget d'écriture partagé de 300\_requêtes/min par clé API sur l'ensemble des endpoints POST/PATCH/DELETE\_; tout dépassement renvoie `429`.\n\nRemarque\_: `FUTURE_ISSUE_DATE` et `POOR_DOCUMENT_QUALITY` existent dans les sessions de workflow, mais ne sont jamais générés par cet endpoint autonome — un document avec une date future n'est pas automatiquement refusé ici."
      operationId: post_v3poa
      parameters: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - document
              properties:
                document:
                  type: string
                  format: binary
                  description: >-
                    Le justificatif de domicile. Extensions autorisées : `tiff`,
                    `jpg`, `jpeg`, `png`, `pdf`, `webp`. Taille maximale de
                    téléversement : **15 MB** (les fichiers plus volumineux sont
                    rejetés avec un code `400`). Les fichiers PDF multipages
                    sont pris en charge (attendez-vous à une latence plus
                    élevée) ; les PDF chiffrés nécessitent `document_password`.
                    Les images sont automatiquement compressées avant le
                    traitement.
                document_password:
                  type: string
                  description: >-
                    Mot de passe pour déchiffrer `document` lorsqu'il s'agit
                    d'un PDF chiffré. L'envoi d'un PDF chiffré sans mot de passe
                    (ou avec un mot de passe incorrect) renvoie `400`.
                  writeOnly: true
                expected_address:
                  type: string
                  description: >-
                    Adresse à vérifier par rapport au document. Elle est
                    géocodée et comparée à l'adresse extraite ; une discordance
                    (ou une adresse attendue qui ne peut être géocodée/vérifiée)
                    ajoute `ADDRESS_MISMATCH_WITH_PROVIDED`, selon
                    `poa_address_mismatch_action`. La forme géocodée est
                    renvoyée dans `expected_details_formatted_address` /
                    `expected_details_parsed_address`.
                  example: Av. Monseñor Tavella 1291, Salta, Argentina
                expected_country:
                  type: string
                  description: >-
                    Pays à vérifier par rapport au document (code ISO 3166-1,
                    par ex. `ARG` ou `AR`). Une discordance avec le pays du
                    document ajoute `POA_COUNTRY_MISMATCH_WITH_PROVIDED`, régi
                    par `poa_address_mismatch_action`.
                  example: ARG
                expected_first_name:
                  type: string
                  description: >-
                    Prénom à vérifier par rapport à `name_on_document`
                    (recherche floue, tenant compte de la translittération). Un
                    score inférieur au seuil de correspondance ajoute
                    `NAME_MISMATCH_WITH_PROVIDED`, régi par
                    `poa_address_mismatch_action`.
                  example: Sophia
                expected_last_name:
                  type: string
                  description: >-
                    Nom de famille à vérifier par rapport à `name_on_document`,
                    combiné avec `expected_first_name` pour le score de
                    correspondance.
                  example: Martinez
                poa_languages_allowed:
                  type: string
                  description: >-
                    Liste séparée par des virgules des langues acceptées pour le
                    document sous forme de codes ISO 639-1 (par ex. `en,es,fr`).
                    En cas d'omission ou si elle est vide, **l'ensemble des 51
                    langues prises en charge** est accepté. Un document dans une
                    langue hors de cette liste ajoute
                    `UNSUPPORTED_DOCUMENT_LANGUAGE` (régi par
                    `poa_unsupported_language_action`) ; un code inconnu dans la
                    liste renvoie `400` avec l'ensemble complet des codes pris
                    en charge.
                  example: en,es
                poa_document_age_months:
                  type: string
                  description: >-
                    Paires `key:value` séparées par des virgules définissant
                    l'âge maximal du document en mois par type de document —
                    clés : `utility_bill`, `bank_statement`,
                    `government_issued_document`, `other_poa_document` ; valeurs
                    : `1`–`120`, ou `-1` pour illimité (pas de vérification
                    d'âge). Valeurs par défaut en cas d'omission :
                    `utility_bill:3,bank_statement:3,government_issued_document:12,other_poa_document:12`.
                    Un document plus ancien que sa limite entraîne un refus avec
                    `POA_DOCUMENT_EXPIRED`. **Attention :** lorsque vous
                    fournissez ce champ, listez *chaque* type accepté — les
                    types omis sont traités comme non acceptés
                    (`POA_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION` d'ordre
                    informatif) et leur vérification d'âge est ignorée.
                  example: utility_bill:3,bank_statement:6
                poa_name_mismatch_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    Accepté mais **actuellement non appliqué** — les
                    avertissements de non-concordance de nom
                    (`NAME_MISMATCH_WITH_PROVIDED`) suivent
                    `poa_address_mismatch_action` à la place. Définissez
                    `poa_address_mismatch_action` pour contrôler à la fois le
                    comportement de non-concordance de nom et d'adresse.
                poa_document_issues_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    Ce qu'il faut faire en cas de problème d'intégrité de
                    fichier — en pratique, seul `DOCUMENT_METADATA_MISMATCH` est
                    produit par cet endpoint.
                poa_document_authenticity_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    Ce qu'il faut faire lorsqu'une manipulation de document est
                    suspectée (`SUSPECTED_DOCUMENT_MANIPULATION`) — par exemple
                    si le PDF a été modifié après signature numérique, traité
                    par un éditeur PDF connu, présente une manipulation de texte
                    superposé ou des dates EXIF incohérentes. Régit également
                    `POA_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT` (un champ de texte
                    retapé dont le fichier ne peut prouver la modification ou
                    l'absence de modification) : `DECLINE` le refuse également,
                    `NO_ACTION` le conserve comme un avertissement.
                poa_unsupported_language_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    Que faire lorsque la langue du document n'appartient pas à
                    `poa_languages_allowed` (`UNSUPPORTED_DOCUMENT_LANGUAGE`).
                poa_address_mismatch_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    Que faire lorsque les détails extraits ne correspondent pas
                    aux champs `expected_*` : `ADDRESS_MISMATCH_WITH_PROVIDED`,
                    `NAME_MISMATCH_WITH_PROVIDED` et
                    `POA_COUNTRY_MISMATCH_WITH_PROVIDED` suivent tous cette
                    action.
                poa_issuer_not_identified_action:
                  type: string
                  enum:
                    - DECLINE
                    - NO_ACTION
                  default: DECLINE
                  description: >-
                    Ce qu'il faut faire lorsqu'aucune entreprise ou organisation
                    émettrice ne peut être identifiée sur le document
                    (`ISSUER_NOT_IDENTIFIED`).
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    Lorsque la valeur est `true` (par défaut), conserve l'appel
                    sous la forme d'une session de type API — visible dans la
                    Business Console, récupérable via `GET
                    /v3/session/{sessionId}/decision/` à l'aide du `request_id`
                    renvoyé, notifiée via un webhook `status.updated`, et avec
                    le document importé stocké. Lorsque la valeur est `false`,
                    rien n'est stocké et `request_id` est un UUID éphémère
                    servant uniquement à la corrélation des réponses.
                  example: true
                vendor_data:
                  type: string
                  description: >-
                    Chaîne opaque optionnelle (votre identifiant d'utilisateur
                    interne, e-mail, UUID…) stockée sur la session persistée et
                    renvoyée dans la réponse. Utilisez-la pour corréler les
                    appels d'API avec vos propres enregistrements et pour
                    filtrer les sessions ultérieurement.
                  example: user-123
                metadata:
                  type: object
                  additionalProperties: true
                  description: >-
                    Objet JSON optionnel stocké avec la session (lorsque
                    `save_api_request=true`) et renvoyé dans la réponse. Dans
                    les requêtes multipart, envoyez-le sous forme de champ
                    textuel encodé en JSON (par ex.
                    `metadata={"flow":"onboarding"}`) — il est analysé sous
                    forme d'objet.
                  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: >-
            Document traité. `poa.status` est `Approved` ou `Declined` ; chaque
            problème détecté est détaillé dans `poa.warnings`. Un document
            expiré, non concordant ou suspect renvoie tout de même `200` avec
            `status: "Declined"` — inspectez le corps de la réponse, pas
            seulement le code HTTP. Lorsque `save_api_request=true`,
            `request_id` est l'identifiant de la session enregistrée.
          content:
            application/json:
              examples:
                Approved:
                  summary: >-
                    Facture de services publics lue clairement, aucune
                    vérification des détails attendus
                  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: >-
                    Date de délivrance antérieure à l'ancienneté autorisée par
                    `poa_document_age_months`
                  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` ne correspondent
                    pas à `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: "Identifiant de session persistante lorsque `save_api_request=true` (utilisable avec `GET /v3/session/{sessionId}/decision/`)\_; sinon un UUID de corrélation temporaire."
                  poa:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - Declined
                        description: >-
                          `Approved` lorsqu'aucun avertissement n'aboutit à un
                          refus ; `Declined` dans le cas contraire — la liste
                          `warnings` en explique la raison.
                      issuing_state:
                        type: string
                        nullable: true
                        description: >-
                          Pays dans lequel le document a été délivré, tel
                          qu'extrait du document — généralement ISO 3166-1
                          alpha-3 (par ex. `ARG`).
                        example: ARG
                      document_type:
                        type: string
                        enum:
                          - UTILITY_BILL
                          - BANK_STATEMENT
                          - GOVERNMENT_ISSUED_DOCUMENT
                          - OTHER_POA_DOCUMENT
                          - UNKNOWN
                        description: >-
                          Catégorie de document détectée. `UNKNOWN` signifie que
                          le document n'a pas pu être classé comme un
                          Justificatif de domicile acceptable et entraîne un
                          refus automatique avec `INVALID_DOCUMENT_TYPE`. Jamais
                          null — les échecs de classification basculent sur
                          `UNKNOWN`.
                      document_subtype:
                        type: string
                        description: >-
                          Classification plus détaillée au sein de
                          `document_type` — par ex. `ELECTRICITY_BILL`,
                          `WATER_BILL`, `GAS_BILL`, `INTERNET_BILL`,
                          `PHONE_BILL` (factures de services publics) ;
                          `ACCOUNT_STATEMENT`, `CREDIT_CARD_STATEMENT` (relevés
                          bancaires) ; `TAX_ASSESSMENT`, `RESIDENCY_CERTIFICATE`
                          (documents gouvernementaux). `UNKNOWN` lorsqu'aucun
                          sous-type n'a pu être déterminé. Jamais null — les
                          échecs de classification se rabattent sur `UNKNOWN`.
                        example: WATER_BILL
                      document_language:
                        type: string
                        nullable: true
                        description: Langue du document détectée (ISO 639-1).
                        example: es
                      issuer:
                        type: string
                        nullable: true
                        description: >-
                          Entreprise ou organisation ayant émis le document.
                          `null` ajoute `ISSUER_NOT_IDENTIFIED`.
                        example: Aguas del Norte
                      issue_date:
                        type: string
                        format: date
                        nullable: true
                        description: >-
                          Date de délivrance du document (`YYYY-MM-DD`). `null`
                          lorsqu'elle n'a pas pu être extraite — cela entraîne
                          un refus avec `UNABLE_TO_EXTRACT_ISSUE_DATE` sur cet
                          endpoint.
                        example: '2021-02-10'
                      expiration_date:
                        type: string
                        format: date
                        nullable: true
                        description: >-
                          Date d'expiration/de validité explicite imprimée sur
                          le document, le cas échéant. Indépendante de la
                          vérification de l'ancienneté
                          `poa_document_age_months`.
                      poa_address:
                        type: string
                        nullable: true
                        description: >-
                          Adresse exactement telle qu'elle est imprimée sur le
                          document. `null` entraîne un refus automatique avec
                          `MISSING_ADDRESS_INFORMATION`.
                      poa_formatted_address:
                        type: string
                        nullable: true
                        description: Version géocodée et normalisée de `poa_address`.
                        example: Av. Monseñor Tavella 1291 b, A4400 Salta, Argentina
                      poa_parsed_address:
                        type: object
                        nullable: true
                        description: >-
                          Détail structuré et géocodé de l'adresse du document.
                          `null` si l'adresse n'a pas pu être analysée.
                        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: Code pays 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: >-
                              Coordonnées géocodées de l'adresse figurant sur le
                              document.
                      expected_details_address:
                        type: string
                        nullable: true
                        description: >-
                          Écho de l'`expected_address` que vous avez envoyée, ou
                          `null`.
                      expected_details_formatted_address:
                        type: string
                        nullable: true
                        description: >-
                          Version géocodée et normalisée de `expected_address` ;
                          `null` lorsqu'elle n'est pas fournie ou n'est pas
                          géocodable.
                      expected_details_parsed_address:
                        type: object
                        nullable: true
                        additionalProperties: true
                        description: >-
                          Résultat complet de géocodage pour `expected_address`
                          (rue/ville/région/pays/code postal plus la sortie
                          brute du géocodeur et un indicateur `is_verified`).
                          `null` lorsque `expected_address` n'a pas été fourni.
                      name_on_document:
                        type: string
                        nullable: true
                        description: >-
                          Nom du titulaire principal extrait du document ;
                          comparé à `expected_first_name`/`expected_last_name`
                          lorsqu'ils sont fournis. `null` refuse avec
                          `POA_NAME_NOT_DETECTED` sur cet endpoint.
                        example: OESTE EMBOTELLADORA S.A.
                      extra_fields:
                        type: object
                        description: "Champs supplémentaires spécifiques au document. Les champs bancaires sont renseignés pour les relevés bancaires lorsqu'ils figurent sur le document\_; `null` dans le cas contraire."
                        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: >-
                              Numéro de téléphone de contact imprimé sur le
                              document.
                          additional_names:
                            type: array
                            items:
                              type: string
                            description: >-
                              Autres noms de titulaires trouvés sur le document
                              (par ex. cotitulaires de compte, anciens noms de
                              compte).
                      warnings:
                        type: array
                        description: >-
                          Vide en cas d'approbation sans réserve. Chaque entrée
                          explique un risque détecté ; les entrées avec
                          `log_type: "error"` définissent `status` sur
                          `Declined`.
                        items:
                          type: object
                          properties:
                            risk:
                              type: string
                              description: >-
                                Code de risque lisible par machine. Entraînant
                                toujours un refus :
                                `MISSING_ADDRESS_INFORMATION`,
                                `POA_DOCUMENT_EXPIRED`, `INVALID_DOCUMENT_TYPE`,
                                `UNABLE_TO_VALIDATE_DOCUMENT_AGE`, ainsi que
                                `UNABLE_TO_EXTRACT_ISSUE_DATE` et
                                `POA_NAME_NOT_DETECTED` (configurés de façon
                                fixe pour refuser sur cet endpoint). Régis par
                                les options de requête :
                                `NAME_MISMATCH_WITH_PROVIDED` /
                                `ADDRESS_MISMATCH_WITH_PROVIDED` /
                                `POA_COUNTRY_MISMATCH_WITH_PROVIDED`
                                (`poa_address_mismatch_action`),
                                `POOR_DOCUMENT_QUALITY` (jamais généré par cet
                                endpoint) / `DOCUMENT_METADATA_MISMATCH`
                                (`poa_document_issues_action`),
                                `SUSPECTED_DOCUMENT_MANIPULATION` et
                                `POA_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT`
                                (`poa_document_authenticity_action`),
                                `UNSUPPORTED_DOCUMENT_LANGUAGE`
                                (`poa_unsupported_language_action`),
                                `ISSUER_NOT_IDENTIFIED`
                                (`poa_issuer_not_identified_action`).
                                Informatifs sur cet endpoint :
                                `POA_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION`,
                                `UNPARSABLE_OR_INVALID_ADDRESS`.
                              example: POA_DOCUMENT_EXPIRED
                            feature:
                              type: string
                              enum:
                                - PROOF_OF_ADDRESS
                              description: >-
                                Fonctionnalité ayant émis l'avertissement.
                                Toujours `PROOF_OF_ADDRESS` sur cet endpoint.
                            additional_data:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: >-
                                Contexte supplémentaire pour certains risques —
                                par ex. `POA_DOCUMENT_EXPIRED` inclut
                                `expiration_reason` (`printed_expiration` ou
                                `age_window`), `document_type`,
                                `document_subtype` et `issue_date`, ainsi que
                                `expiration_date` pour le chemin
                                `printed_expiration` ou `max_age_months` pour le
                                chemin `age_window` ;
                                `SUSPECTED_DOCUMENT_MANIPULATION` inclut
                                `reason` et `detection_method` ;
                                `POA_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT` inclut
                                `reason`, `detection_method`
                                (`unproven_text_replacement`), `replaced_text`,
                                `manipulated_regions` et `manipulated_blocks`.
                                `null` pour la plupart des risques.
                            log_type:
                              type: string
                              enum:
                                - error
                                - information
                              description: >-
                                Gravité. Les avertissements `error` font passer
                                `status` à `Declined` ; les entrées
                                `information` sont indicatives et ne refusent
                                jamais d'elles-mêmes. (`warning` n'est pas
                                produit par cet endpoint — ses options acceptent
                                uniquement `DECLINE` ou `NO_ACTION`.)
                            short_description:
                              type: string
                              description: >-
                                Résumé du risque en une ligne, lisible par
                                l'utilisateur.
                            long_description:
                              type: string
                              description: Explication lisible par l'humain du risque.
                      detected_codes:
                        type: array
                        description: >-
                          Codes QR et codes-barres détectés sur chaque page
                          traitée du document. Vide si aucun n'est trouvé. Un
                          code QR localisé mais indécodable a `parsed_payload:
                          null`.
                        items:
                          $ref: '#/components/schemas/DocumentAIDetectedCode'
                  vendor_data:
                    type: string
                    nullable: true
                    description: Écho des `vendor_data` que vous avez envoyées, ou `null`.
                  metadata:
                    type: object
                    nullable: true
                    additionalProperties: true
                    description: >-
                      Écho de l'objet `metadata` que vous avez envoyé, ou
                      `null`.
                  created_at:
                    type: string
                    format: date-time
                    description: >-
                      Horodatage ISO 8601 (UTC) du moment où la réponse a été
                      générée.
        '400':
          description: >-
            Erreur de validation ou de traitement. Les problèmes au niveau des
            champs renvoient l'enveloppe standard de DRF (un tableau de messages
            par champ concerné). Les problèmes de PDF chiffré renvoient
            `{"detail": ...}`. Un document que le pipeline d'extraction ne peut
            pas traiter renvoie `{"error": ["Error extracting POA
            information"]}`.
          content:
            application/json:
              examples:
                Missing document:
                  summary: '`document` n''est pas inclus dans les données du formulaire'
                  value:
                    document:
                      - No file was submitted.
                Unsupported file extension:
                  summary: Extension de fichier autre que 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: Le téléversement dépasse la limite de 15 MB
                  value:
                    document:
                      - File size should not exceed 15 MB
                Encrypted PDF:
                  summary: PDF téléversé sans le mot de passe requis
                  value:
                    detail: >-
                      The PDF is encrypted. Please upload a decrypted PDF or a
                      photo instead.
                Wrong PDF password:
                  summary: '`document_password` ne déchiffre pas le PDF'
                  value:
                    detail: >-
                      The PDF password is incorrect. Please provide the correct
                      password.
                Invalid language code:
                  summary: '`poa_languages_allowed` contient un code non pris en charge'
                  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: >-
                    valeur de `poa_document_age_months` en dehors de la plage
                    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: >-
                    Le document n'a pas pu être traité par le pipeline
                    d'extraction
                  value:
                    error:
                      - Error extracting POA information
        '403':
          description: "Permission refusée. Renvoyé lorsque l'en-tête `x-api-key` est manquant, ainsi que lorsque le solde de l'organisation appelante ne permet pas de couvrir l'appel\_; une clé incorrecte, révoquée ou expirée renvoie `401`. Une clé manquante renvoie `403` avec `{\"detail\": ...}`\_; une clé incorrecte, révoquée ou expirée renvoie `401`. Les crédits insuffisants renvoient `403` avec `{\"error\": ...}` avant tout traitement de document."
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: Aucun en-tête `x-api-key`, ou la clé est non valide/révoquée
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: Le solde de l'organisation ne peut pas couvrir l'appel
                  value:
                    error: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '429':
          description: >-
            Limite de débit dépassée. Les endpoints POST/PATCH/DELETE partagent
            un budget de 300 requêtes d'écriture par minute par clé API (la
            création de transactions et l'ingestion d'événements ont un budget
            distinct de 600). La réponse comporte les en-têtes
            `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` et
            `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: >-
                    Plus de 300 requêtes d'écriture au cours de la minute
                    actuelle
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
        '503':
          $ref: '#/components/responses/DocumentProcessingBusy'
      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: >-
            Symbologie détectée, par exemple `QR_CODE`, `CODE_128`, `EAN_13`,
            `DATA_MATRIX` ou `PDF_417`.
        page_number:
          type: integer
          minimum: 1
          description: Numéro de page (à partir de 1).
        position:
          type: array
          nullable: true
          description: >-
            Polygone détecté en coordonnées de pixels de la page rendue. `null`
            lorsqu'aucun emplacement fiable n'est disponible.
          items:
            type: array
            minItems: 2
            maxItems: 2
            items:
              type: integer
        x:
          type: integer
          nullable: true
          description: Bord gauche de la boîte englobante en pixels de la page rendue.
        'y':
          type: integer
          nullable: true
          description: Bord supérieur de la boîte englobante en pixels de la page rendue.
        width:
          type: integer
          nullable: true
          description: Largeur de la boîte englobante en pixels de la page rendue.
        height:
          type: integer
          nullable: true
          description: Hauteur de la boîte englobante en pixels de la page rendue.
        page_width:
          type: integer
          description: Largeur de la page générée en pixels.
        page_height:
          type: integer
          description: Hauteur de la page générée en pixels.
        raw_payload:
          type: string
          description: >-
            Payload brut du décodeur sous forme de chaîne base64 lorsqu'il est
            disponible ; sinon chaîne vide.
        parsed_payload:
          nullable: true
          description: >-
            Chaîne décodée ou valeur structurée. `null` lorsque le code a été
            localisé mais n'a pas pu être décodé.
  responses:
    DocumentProcessingBusy:
      description: >-
        Un nombre trop important de documents est actuellement en cours de
        traitement, cet envoi n'a donc pas été traité : rien n'a été stocké et
        aucune tentative n'a été utilisée. Renvoyez le même fichier après le
        nombre de secondes indiqué dans `Retry-After`. Effectuez le branchement
        en fonction de `code`, et non du texte du message.
      headers:
        Retry-After:
          description: >-
            Nombre de secondes à attendre avant d'envoyer à nouveau la même
            requête.
          schema:
            type: integer
            example: 10
      content:
        application/json:
          schema:
            type: object
            required:
              - detail
              - code
            properties:
              detail:
                type: string
              code:
                type: string
                enum:
                  - document_processing_busy
          example:
            detail: We are busy processing documents. Please try again in a moment.
            code: document_processing_busy
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clé API de votre application, issue de Développeurs -> Clés API dans
        la Business Console. La clé principale dispose d'un accès complet. Une
        clé nommée peut être restreinte : aucun, lecture ou écriture par
        ressource, limitée à certains workflows ou aux sessions approuvées, à
        une liste d'adresses IP et à une date d'expiration. 401 signifie que la
        clé est incorrecte, révoquée ou expirée ; 403 signifie qu'aucune clé n'a
        été envoyée, que la clé n'a pas accès à cette ressource ou action, ou
        que la requête provient d'une adresse hors de sa liste d'IP ; 404 sur
        une route de session signifie que la session est hors des workflows ou
        des statuts de la clé. Une clé sans accès aux médias reçoit les URL
        d'images, de vidéos et de PDF à null, et une clé sans accès en écriture
        aux sessions reçoit les liens et tokens de session à null. Voir
        https://docs.didit.me/console/api-keys.

````

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