> ## 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 AML: sanciones, PEP y listas de vigilancia

> Screening AML de Didit en tiempo real con 1,300+ listas: sanciones, PEP y medios adversos. Dos puntuaciones de riesgo, $0.20/consulta, sin mínimos.



## OpenAPI

````yaml es/openapi-25.json POST /v3/aml/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/aml/:
    post:
      tags:
        - Standalone APIs
      summary: Análisis AML (independiente)
      description: >-
        Analiza a una persona o empresa frente a bases de datos de PEP,
        sanciones, advertencias/listas de vigilancia y medios adversos en una
        sola llamada.


        **Modelo de dos puntuaciones.** Cada coincidencia incluye un
        `match_score` (0–100, confianza en la identidad) y un `risk_score`
        (0–100, riesgo de la entidad). Las coincidencias cuyo `match_score` es
        inferior a `aml_match_score_threshold` (por defecto **93**) se etiquetan
        con `review_status: "False Positive"` y no se tienen en cuenta para el
        riesgo. El `risk_score` más alto entre las coincidencias restantes pasa
        a ser `aml.score`. El `aml.status` final depende de tus umbrales:
        `score` > `aml_score_review_threshold` (por defecto **100**) →
        `Declined`; `score` > `aml_score_approve_threshold` (por defecto **80**)
        → `In Review`; en caso contrario, `Approved`. Siempre que `score` no sea
        cero y sea ≥ el umbral de aprobación, se añade una advertencia
        `POSSIBLE_MATCH_FOUND` (una puntuación de exactamente 0 nunca genera
        advertencia).


        **Pesos de la puntuación de coincidencia.** `aml_name_weight` +
        `aml_dob_weight` + `aml_country_weight` deben sumar exactamente 100 (por
        defecto 60/25/15). Los componentes que faltan en la solicitud se
        excluyen y los pesos restantes se renormalizan. Un `document_number`
        coincidente actúa como clave maestra y fija `match_score` en 100.


        **Latencia.** Los análisis simples suelen completarse en pocos segundos.
        Con `include_adverse_media=true`, la API espera el enriquecimiento de
        medios adversos (una pausa inicial de ~5 s más hasta ~25 s de sondeo),
        así que configura un tiempo de espera del cliente de **al menos 60
        segundos**.


        **Persistencia.** `save_api_request` es **true** por defecto: el
        análisis se guarda como una sesión (`request_id` funciona con `GET
        /v3/session/{sessionId}/decision/`), aparece en la consola, se dispara
        un webhook `status.updated` y los estados de revisión de las
        coincidencias pueden actualizarse más adelante. Con
        `save_api_request=false` no se guarda nada y `request_id` es un id de
        correlación temporal. `include_ongoing_monitoring=true` vuelve a
        analizar el perfil de forma continua y requiere `save_api_request=true`
        (si no, la API devuelve un `400`).


        **Idempotencia.** Envía un encabezado `Idempotency-Key` al reintentar
        tras un tiempo de espera agotado o un error transitorio. La clave se
        aplica a tu aplicación y al cuerpo exacto de la solicitud. La primera
        solicitud completada almacena su respuesta, y los reintentos idénticos
        posteriores devuelven esa misma respuesta sin ejecutar ni facturar otro
        análisis AML. Si la solicitud original sigue en curso, vuelve a
        intentarlo más tarde con la misma clave. Si se reutiliza la misma clave
        con un cuerpo diferente, la API devuelve `409`.


        **Facturación.** Se cobra un crédito de API de AML tras el primer
        análisis correcto. Las respuestas idempotentes repetidas no se vuelven a
        cobrar. Si el saldo es insuficiente, la API devuelve `403` antes de
        realizar ningún análisis nuevo.


        **Sandbox.** Las claves de aplicaciones de sandbox omiten por completo
        el análisis y la facturación y devuelven un resultado simulado:
        `Approved` sin coincidencias, salvo que envíes `sandbox_scenario`.
        `save_api_request` funciona igual que con las claves de producción, así
        que puedes recuperar un análisis de sandbox guardado mediante `GET
        /v3/session/{sessionId}/decision/` y `GET
        /v3/session/{sessionId}/generate-pdf/`.
      operationId: post_v3aml
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          description: >-
            Clave opcional para reintentar de forma segura, de hasta 255
            caracteres. Si reutilizas la misma clave con el mismo cuerpo de
            solicitud, se devuelve la respuesta original sin ejecutar ni
            facturar un segundo análisis. Si reutilizas la clave con un cuerpo
            distinto, se devuelve `409`.
          schema:
            type: string
            maxLength: 255
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - full_name
              properties:
                full_name:
                  type: string
                  minLength: 2
                  description: >-
                    Nombre completo de la persona o empresa que se va a
                    analizar. Mínimo **2 caracteres**, el mínimo que exige el
                    propio proveedor de análisis. Un nombre más corto o vacío
                    devuelve `400` en este campo antes de que se ejecute ningún
                    análisis, por lo que no se factura nada.
                  example: Antonio Ejemplo Modelo
                entity_type:
                  type: string
                  enum:
                    - person
                    - company
                  default: person
                  description: >-
                    Tipo de entidad que se va a analizar. El valor
                    predeterminado es `person`.
                date_of_birth:
                  type: string
                  format: date
                  description: >-
                    Fecha de nacimiento (personas) o fecha de constitución
                    (empresas), `YYYY-MM-DD`. Mejora la precisión de la
                    coincidencia mediante el peso de la fecha de nacimiento.
                  example: '1972-02-29'
                nationality:
                  type: string
                  description: >-
                    Código de país ISO 3166-1 **alfa-2** (p. ej. `ES`). Los
                    códigos no válidos devuelven `400`. Mejora la precisión de
                    la coincidencia mediante el peso del país.
                  example: ES
                document_number:
                  type: string
                  description: >-
                    Número del documento de identidad. No tiene ponderación;
                    actúa como clave maestra: una coincidencia exacta eleva a
                    100 el `match_score` del resultado y una discrepancia clara
                    lo penaliza. Se envía al proveedor de análisis como filtro
                    de búsqueda solo cuando tiene **entre 2 y 50 caracteres**;
                    un valor fuera de ese rango se acepta y se almacena, y el
                    análisis se ejecuta y se factura igualmente, solo que sin
                    acotarlo por número de documento.
                aml_score_approve_threshold:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 80
                  description: >-
                    Umbral de puntuación de riesgo igual o por debajo del cual
                    el resultado es `Approved`. Debe ser ≤
                    `aml_score_review_threshold` (de lo contrario, `400`).
                aml_score_review_threshold:
                  type: number
                  minimum: 0
                  maximum: 100
                  default: 100
                  description: >-
                    Umbral de puntuación de riesgo por encima del cual el
                    resultado es `Declined`. Las puntuaciones entre los dos
                    umbrales dan como resultado `In Review`.
                aml_name_weight:
                  type: integer
                  minimum: 0
                  maximum: 100
                  default: 60
                  description: >-
                    Peso de la similitud del nombre en la puntuación de
                    coincidencia de cada resultado. Los tres pesos deben sumar
                    exactamente 100 (de lo contrario, `400`).
                aml_dob_weight:
                  type: integer
                  minimum: 0
                  maximum: 100
                  default: 25
                  description: >-
                    Peso de la fecha de nacimiento en la puntuación de
                    coincidencia de cada resultado.
                aml_country_weight:
                  type: integer
                  minimum: 0
                  maximum: 100
                  default: 15
                  description: >-
                    Peso del país o la nacionalidad en la puntuación de
                    coincidencia de cada resultado.
                aml_match_score_threshold:
                  type: integer
                  minimum: 0
                  maximum: 100
                  default: 93
                  description: >-
                    Umbral por coincidencia: las coincidencias con `match_score`
                    inferior a este valor son `False Positive` (se excluyen de
                    la evaluación de riesgo); las que lo igualan o superan son
                    posibles coincidencias `Unreviewed`.
                include_adverse_media:
                  type: boolean
                  default: false
                  description: >-
                    Busca también cobertura negativa en medios de comunicación.
                    Añade hasta ~30 s de latencia mientras se recopilan los
                    resultados: usa un tiempo de espera del cliente de ≥60 s.
                include_ongoing_monitoring:
                  type: boolean
                  default: false
                  description: >-
                    Sigue volviendo a analizar este perfil y envía los cambios
                    mediante webhook. Requiere `save_api_request=true` (de lo
                    contrario, `400`).
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    Guarda el análisis como una sesión (visible en la consola,
                    con endpoint de decisión, webhooks y revisión de
                    coincidencias). Establécelo en `false` para una comprobación
                    sin estado.
                vendor_data:
                  type: string
                  description: >-
                    Tu identificador del usuario analizado; se devuelve en la
                    respuesta y se almacena con la sesión.
                metadata:
                  type: object
                  nullable: true
                  description: >-
                    JSON libre que se guarda con la solicitud y se devuelve en
                    la respuesta.
                sandbox_scenario:
                  type: string
                  description: >-
                    Slug de escenario exclusivo de sandbox. Solo se acepta
                    cuando la clave de API pertenece a una aplicación en modo
                    sandbox; se rechaza en aplicaciones en producción. Un
                    análisis independiente no tiene una sesión que preparar, así
                    que el slug va en la propia solicitud de análisis:
                    `decline_aml_hit` devuelve una coincidencia con la misma
                    estructura que en producción y cierra el análisis como
                    `Declined`, `review_aml_possible_match` lo cierra como `In
                    Review`, y un escenario que no prepara ningún resultado AML
                    deja el análisis limpio. Consulta el catálogo de escenarios
                    en GET /v1/sandbox/scenarios/ o [Sandbox y datos de
                    prueba](/es/integration/sandbox-testing).
                  example: decline_aml_hit
            example:
              full_name: Antonio Ejemplo Modelo
              entity_type: person
              date_of_birth: '1972-02-29'
              nationality: ES
              include_adverse_media: false
              vendor_data: user-1234
      responses:
        '200':
          description: >-
            Análisis completado. `aml.status` refleja tus umbrales. Cada
            coincidencia igual o superior al umbral mínimo interno de inclusión
            aparece en `aml.hits` con su `match_score` de identidad, su
            `risk_score` de entidad y un `score_breakdown` que explica la
            coincidencia.
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                    format: uuid
                    description: >-
                      ID de la sesión guardada cuando `save_api_request=true`
                      (se puede usar con `GET
                      /v3/session/{sessionId}/decision/`); en caso contrario, un
                      UUID de correlación temporal.
                  aml:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - In Review
                          - Declined
                        description: >-
                          `Declined` cuando `score` >
                          `aml_score_review_threshold`; `In Review` cuando
                          `score` > `aml_score_approve_threshold`; `Approved` en
                          caso contrario (también cuando no hay ninguna
                          puntuación disponible).
                      total_hits:
                        type: integer
                        description: Número de entradas en `hits`.
                      entity_type:
                        type: string
                        enum:
                          - person
                          - company
                        description: Devuelve el tipo de entidad analizada.
                      hits:
                        type: array
                        items:
                          type: object
                          description: >-
                            Una coincidencia del análisis. `match_score` (0–100)
                            mide la confianza en la identidad: las coincidencias
                            por debajo de `aml_match_score_threshold` se
                            etiquetan con `review_status: "False Positive"` y se
                            excluyen de la evaluación de riesgo; las que están
                            en ese umbral o por encima son posibles
                            coincidencias `"Unreviewed"`. `risk_score` (0–100)
                            mide el nivel de riesgo de la entidad coincidente y
                            determina el `aml.score` de nivel superior.
                          properties:
                            id:
                              type: string
                              nullable: true
                              description: >-
                                Identificador estable de Didit para la
                                coincidencia: `hit_` seguido de 24 caracteres
                                hexadecimales. La misma entidad coincidente
                                conserva el mismo `id` cuando el sujeto se
                                vuelve a analizar. Pásalo como `hit_id` a los
                                endpoints de revisión de coincidencias AML.
                            url:
                              type: string
                              nullable: true
                              description: >-
                                URL de origen de la entidad coincidente, cuando
                                está disponible.
                            match:
                              type: boolean
                              nullable: true
                              description: >-
                                Indicador heredado de coincidencia exacta. Es
                                preferible usar `match_score` + `review_status`.
                            score:
                              type: number
                              nullable: true
                              description: >-
                                OBSOLETO. Puntuación de coincidencia ponderada
                                en el rango 0–1. Usa `match_score` en su lugar.
                            match_score:
                              type: number
                              nullable: true
                              description: >-
                                Confianza de identidad (0–100). Se compara con
                                `aml_match_score_threshold` para separar los
                                falsos positivos de las posibles coincidencias.
                            risk_score:
                              type: number
                              nullable: true
                              description: >-
                                Puntuación de riesgo de la entidad (0–100). El
                                `risk_score` más alto entre las coincidencias
                                que no son falsos positivos pasa a ser el
                                `aml.score` de nivel superior.
                            target:
                              type: boolean
                              nullable: true
                            caption:
                              type: string
                              nullable: true
                              description: Nombre visible de la entidad coincidente.
                            datasets:
                              type: array
                              nullable: true
                              items:
                                type: string
                                enum:
                                  - PEP
                                  - PEP Level 1
                                  - PEP Level 2
                                  - PEP Level 3
                                  - PEP Level 4
                                  - Sanctions
                                  - Adverse Media
                                  - Warnings and Regulatory Enforcement
                                  - Fitness and Probity
                                  - SIP
                                  - SIE
                                  - Insolvency
                                  - Other Lists
                              description: >-
                                Categorías de riesgo en las que figura la
                                entidad: `PEP` (con su nivel, de `PEP Level 1` a
                                `PEP Level 4`), `Sanctions`, `Adverse Media`,
                                `Warnings and Regulatory Enforcement`, `Fitness
                                and Probity`, `SIP`, `SIE` o `Insolvency`.
                                `Other Lists` cuando la fuente de la entidad no
                                indica ninguna de estas categorías.
                            features:
                              type: object
                              nullable: true
                            properties:
                              type: object
                              nullable: true
                              description: >-
                                Perfil de la entidad: `name`, `alias`, `notes`,
                                `gender`, `birthDate`, `birthPlace`,
                                `nationality`, `position` y otros arrays
                                biográficos (cada uno puede ser nulo).
                            rca_name:
                              type: string
                              nullable: true
                              description: >-
                                Nombre del allegado cercano relacionado a través
                                del cual coincidió la entidad, cuando la
                                coincidencia es un RCA.
                            pep_matches:
                              type: array
                              description: >-
                                Entradas de listas PEP que respaldan esta
                                coincidencia.
                              items:
                                type: object
                                properties:
                                  list_name:
                                    type: string
                                  publisher:
                                    type: string
                                  source_url:
                                    type: string
                                  description:
                                    type: string
                                  matched_name:
                                    type: string
                                  pep_position:
                                    type: string
                                  date_of_birth:
                                    type: string
                                  place_of_birth:
                                    type: string
                                  aliases:
                                    type: array
                                    items:
                                      type: string
                                  education:
                                    type: array
                                    items:
                                      type: string
                                  other_sources:
                                    type: array
                                    items:
                                      type: string
                            sanction_matches:
                              type: array
                              items:
                                type: object
                              description: >-
                                Entradas de listas de sanciones que respaldan
                                esta coincidencia (misma estructura de lista de
                                respaldo que `pep_matches`, más campos
                                específicos de sanciones).
                            warning_matches:
                              type: array
                              items:
                                type: object
                              description: >-
                                Entradas de advertencias o listas de vigilancia
                                que respaldan esta coincidencia.
                            adverse_media_matches:
                              type: array
                              description: >-
                                Artículos de medios adversos. Solo se rellena
                                cuando `include_adverse_media=true`.
                              items:
                                type: object
                                properties:
                                  headline:
                                    type: string
                                  summary:
                                    type: string
                                  sentiment:
                                    type: string
                                  sentiment_score:
                                    type: number
                                  source_url:
                                    type: string
                                  thumbnail:
                                    type: string
                                    nullable: true
                                  country:
                                    type: string
                                    nullable: true
                                  author_name:
                                    type: string
                                    nullable: true
                                  publication_date:
                                    type: string
                                    nullable: true
                                  adverse_keywords:
                                    type: array
                                    items:
                                      type: string
                                  other_sources:
                                    type: array
                                    items:
                                      type: string
                            adverse_media_details:
                              type: object
                              nullable: true
                              description: >-
                                Sentimiento agregado de medios adversos para la
                                entidad (`sentiment`, `sentiment_score` y el
                                mapa de frecuencias `adverse_keywords`). Solo se
                                rellena cuando `include_adverse_media=true`.
                            first_seen:
                              type: string
                              format: date-time
                              nullable: true
                              description: >-
                                Cuándo apareció la entidad por primera vez en
                                los conjuntos de datos.
                            last_seen:
                              type: string
                              format: date-time
                              nullable: true
                              description: >-
                                Actualización más reciente del conjunto de datos
                                que incluyó a la entidad.
                            linked_entities:
                              type: array
                              description: >-
                                Relaciones conocidas de la entidad coincidente
                                (familia, asociados, empresas).
                              items:
                                type: object
                                properties:
                                  name:
                                    type: array
                                    items:
                                      type: string
                                  active:
                                    type: array
                                    items:
                                      type: string
                                  status:
                                    type: array
                                    items:
                                      type: string
                                  details:
                                    type: array
                                    items:
                                      type: string
                                  relation:
                                    type: array
                                    items:
                                      type: string
                            risk_view:
                              type: object
                              nullable: true
                              description: >-
                                Desglose del riesgo por dimensión (`crimes`,
                                `countries`, `categories`, `custom_list`), cada
                                una con `score`, `weightage`, `risk_level` y un
                                mapa `risk_scores`.
                            additional_information:
                              type: object
                              nullable: true
                              description: >-
                                Contexto adicional libre, p. ej., un array
                                `flag_summary` que explica por qué se ha marcado
                                la entidad.
                            review_status:
                              type: string
                              nullable: true
                              enum:
                                - False Positive
                                - Unreviewed
                                - Confirmed Match
                                - Inconclusive
                              description: >-
                                `False Positive`: `match_score` inferior a
                                `aml_match_score_threshold`, excluido de la
                                evaluación de riesgo. `Unreviewed`: posible
                                coincidencia pendiente de revisión. `Confirmed
                                Match` / `Inconclusive`: los establece
                                manualmente un revisor (desde la Business
                                Console) en sesiones guardadas; esa función de
                                revisión no forma parte de esta especificación.
                            score_breakdown:
                              type: object
                              nullable: true
                              description: >-
                                Cómo se calculó `match_score`. El nombre, la
                                fecha de nacimiento y el país aportan cada uno
                                `<component>_score` ×
                                `<component>_weight_normalized` puntos; los
                                pesos se vuelven a normalizar cuando falta un
                                componente en los datos analizados. El número de
                                documento no se pondera: actúa como una 'llave
                                maestra': `MATCH` fija la puntuación en 100,
                                `NEUTRAL` la deja sin cambios y `HARD_MISMATCH`
                                aplica una penalización.
                              properties:
                                name_score:
                                  type: integer
                                  nullable: true
                                  description: Similitud de nombre sin procesar (0–100).
                                name_weight:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Peso configurado del nombre
                                    (`aml_name_weight`).
                                name_weight_normalized:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Peso del nombre tras la renormalización
                                    (0–100).
                                name_contribution:
                                  type: number
                                  nullable: true
                                  description: Puntos que el nombre aportó a `total_score`.
                                dob_score:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Puntuación de la fecha de nacimiento como
                                    porcentaje de su peso (−100 a 100).
                                dob_weight:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Peso configurado de la fecha de nacimiento
                                    (`aml_dob_weight`).
                                dob_weight_normalized:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Peso de la fecha de nacimiento tras la
                                    renormalización (0–100).
                                dob_contribution:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Puntos que la fecha de nacimiento aportó a
                                    `total_score`.
                                country_score:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Puntuación del país como porcentaje de su
                                    peso (de −100 a 100).
                                country_weight:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Peso configurado del país
                                    (`aml_country_weight`).
                                country_weight_normalized:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Peso del país tras la renormalización
                                    (0–100).
                                country_contribution:
                                  type: number
                                  nullable: true
                                  description: Puntos que el país aportó a `total_score`.
                                document_number_match_type:
                                  type: string
                                  nullable: true
                                  enum:
                                    - MATCH
                                    - NEUTRAL
                                    - HARD_MISMATCH
                                  description: >-
                                    Resultado de clave dorada (golden key) de la
                                    comparación del número de documento.
                                document_number_effect:
                                  type: string
                                  nullable: true
                                  description: >-
                                    Descripción legible del efecto del número de
                                    documento.
                                total_score:
                                  type: integer
                                  nullable: true
                                  description: >-
                                    Puntuación de coincidencia ponderada final
                                    (0–100); refleja `match_score`.
                      score:
                        type: number
                        nullable: true
                        description: >-
                          Puntuación de riesgo AML global (0–100): el
                          `risk_score` más alto entre las coincidencias que no
                          son falsos positivos. Determina `status` mediante los
                          dos umbrales.
                      screened_data:
                        type: object
                        description: >-
                          Devuelve lo que se analizó: `full_name`,
                          `date_of_birth`, `nationality`, `document_number` (los
                          campos ausentes son `null`).
                        properties:
                          full_name:
                            type: string
                          date_of_birth:
                            type: string
                            nullable: true
                          nationality:
                            type: string
                            nullable: true
                          document_number:
                            type: string
                            nullable: true
                      warnings:
                        type: array
                        items:
                          type: object
                          properties:
                            feature:
                              type: string
                              description: Función que emitió la advertencia.
                            risk:
                              type: string
                              description: Identificador de riesgo legible por máquina.
                            additional_data:
                              type: object
                              nullable: true
                              description: >-
                                Contexto adicional de la advertencia, cuando
                                está disponible.
                            log_type:
                              type: string
                              description: >-
                                `warning`, `information` o `error`: cómo afectó
                                el riesgo al resultado.
                            short_description:
                              type: string
                              description: Resumen de una línea legible para personas.
                            long_description:
                              type: string
                              description: Explicación completa y legible para personas.
                        description: >-
                          Contiene una advertencia `POSSIBLE_MATCH_FOUND`
                          siempre que `score` sea distinto de cero y ≥
                          `aml_score_approve_threshold` (una puntuación de
                          exactamente 0 nunca genera advertencia); en caso
                          contrario, está vacío.
                  vendor_data:
                    type: string
                    nullable: true
                    description: Devuelve el `vendor_data` que enviaste.
                  metadata:
                    type: object
                    nullable: true
                    description: Devuelve el `metadata` que enviaste.
                  created_at:
                    type: string
                    format: date-time
              examples:
                No hits (Approved):
                  summary: 'Análisis limpio: cero coincidencias'
                  value:
                    request_id: d27c5509-7a66-45a9-b05e-d69d9f4c336a
                    aml:
                      status: Approved
                      total_hits: 0
                      entity_type: person
                      hits: []
                      score: 0
                      screened_data:
                        full_name: Maximilian Mustermann-Doe
                        date_of_birth: '1992-03-14'
                        nationality: DE
                        document_number: null
                      warnings: []
                    vendor_data: user-1234
                    metadata:
                      internal_ref: abc-123
                    created_at: '2026-06-11T10:21:07.013938+00:00'
                PEP hit (Approved — risk below approve threshold):
                  summary: >-
                    Una posible coincidencia PEP; la puntuación de riesgo 73
                    queda por debajo del umbral de aprobación predeterminado de
                    80
                  value:
                    request_id: 0b7e7a3e-65a1-4f3d-9c7a-1de2f9a40111
                    aml:
                      status: Approved
                      total_hits: 1
                      entity_type: person
                      hits:
                        - id: hit_7c1e9a40b2d35f86e0a4c912
                          url: https://news.example.org/articles/sample
                          match: false
                          score: 0.93
                          match_score: 93
                          risk_score: 73
                          target: null
                          caption: Antonio Ejemplo Modelo
                          datasets:
                            - PEP Level 1
                            - PEP
                          features: null
                          rca_name: ''
                          first_seen: '2026-01-07T00:00:00'
                          last_seen: '2026-01-07T00:00:00'
                          review_status: Unreviewed
                          properties:
                            name:
                              - Antonio Ejemplo Modelo
                              - Antonio Ejemplo
                            alias:
                              - Antonio Ejemplo Modelo
                              - Ejemplo Modelo, Pedro
                            notes:
                              - Prime Minister of Spain
                            gender:
                              - male
                            birthDate:
                              - '1972-02-29'
                            birthPlace:
                              - Madrid, Spain
                            nationality: null
                            position: null
                          risk_view:
                            crimes:
                              score: 0
                              weightage: 20
                              risk_level: Low
                              risk_scores: {}
                            countries:
                              score: 9.64
                              weightage: 30
                              risk_level: Low
                              risk_scores:
                                Spain: 25.71
                            categories:
                              score: 62.5
                              weightage: 50
                              risk_level: High
                              risk_scores:
                                PEP: 100
                                PEP Level 1: 100
                            custom_list: {}
                          score_breakdown:
                            name_score: 89
                            name_weight: 60
                            name_weight_normalized: 60
                            name_contribution: 53.4
                            dob_score: 100
                            dob_weight: 25
                            dob_weight_normalized: 25
                            dob_contribution: 25
                            country_score: 100
                            country_weight: 15
                            country_weight_normalized: 15
                            country_contribution: 15
                            document_number_match_type: NEUTRAL
                            document_number_effect: No document number provided for screening
                            total_score: 93
                          pep_matches:
                            - aliases: []
                              education: []
                              list_name: Presidency of the Government of Spain
                              publisher: Presidency of the Government of Spain
                              source_url: https://news.example.org/articles/sample
                              description: >-
                                The Presidency of the Government is the central
                                institutional body in Spain that supports the
                                Prime Minister and coordinates the general
                                action of the central government.
                              matched_name: Antonio Ejemplo Modelo
                              pep_position: ''
                              date_of_birth: '1972-02-29'
                              other_sources: []
                              place_of_birth: Madrid, Spain
                          sanction_matches: []
                          warning_matches: []
                          adverse_media_matches: []
                          adverse_media_details: null
                          linked_entities:
                            - name:
                                - Maria Begona Gomez Fernandez
                              active: []
                              status: []
                              details: []
                              relation:
                                - spouse
                          additional_information:
                            flag_summary:
                              - >-
                                Antonio Ejemplo Modelo has been flagged as a
                                Level 1 Politically Exposed Person (PEP) from
                                Spain, serving as the President of the
                                Government of Spain.
                      score: 73
                      screened_data:
                        full_name: Pedro Sanchez Perez-Castejon
                        date_of_birth: '1972-02-29'
                        nationality: ES
                        document_number: null
                      warnings: []
                    vendor_data: null
                    metadata: null
                    created_at: '2026-06-11T10:23:44.812000+00:00'
        '400':
          description: >-
            Error de validación. Los problemas a nivel de campo devuelven el
            envoltorio estándar de DRF (un array de mensajes por cada campo
            incorrecto); las reglas entre campos (suma de pesos, orden de
            umbrales, monitorización sin guardar) devuelven `{"error": [...]}`.
          content:
            application/json:
              examples:
                Missing full_name:
                  summary: '`full_name` es el único campo obligatorio'
                  value:
                    full_name:
                      - This field is required.
                Short full_name:
                  summary: '`full_name` debe tener al menos 2 caracteres'
                  value:
                    full_name:
                      - Ensure this field has at least 2 characters.
                Invalid nationality:
                  summary: '`nationality` debe ser ISO 3166-1 alpha-2'
                  value:
                    nationality:
                      - Invalid ISO 3166-1 alpha-2 country code.
                Weights do not sum to 100:
                  summary: >-
                    `aml_name_weight` + `aml_dob_weight` + `aml_country_weight`
                    ≠ 100
                  value:
                    error:
                      - >-
                        AML weights must sum to 100. Current sum: 90 (name: 50,
                        dob: 25, country: 15)
                Thresholds out of order:
                  summary: Umbral de aprobación superior al umbral de revisión
                  value:
                    error:
                      - >-
                        Approve threshold (90.0) cannot be greater than review
                        threshold (80.0)
                Monitoring without saving:
                  summary: >-
                    `include_ongoing_monitoring=true` con
                    `save_api_request=false`
                  value:
                    error:
                      - >-
                        Ongoing monitoring can only be enabled when the API
                        request is saved.
        '403':
          description: >-
            Permiso denegado. Se devuelve cuando falta el encabezado `x-api-key`
            y también cuando el saldo de la organización que realiza la llamada
            no la cubre; una clave incorrecta, revocada o expirada devuelve
            `401`. Si falta la clave, se devuelve `403` con `{"detail": ...}`;
            una clave incorrecta, revocada o expirada devuelve `401`. La falta
            de créditos devuelve `403` con `{"error": ...}` antes de que se
            realice cualquier análisis o llamada a un proveedor.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Falta el encabezado `x-api-key`, o la clave no es válida o
                    está revocada
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: El saldo de la organización no cubre la llamada
                  value:
                    error: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '429':
          description: >-
            Límite de solicitudes superado. Todos los endpoints
            POST/PATCH/DELETE comparten un presupuesto de 300 solicitudes de
            escritura por minuto por clave de API. La respuesta incluye los
            encabezados `X-RateLimit-Limit`, `X-RateLimit-Remaining`,
            `X-RateLimit-Reset` y `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Más de 300 solicitudes de escritura en el minuto actual
                  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/aml/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -H 'Idempotency-Key: aml-user-1234-2026-08-20' \
              -d '{
                "full_name": "Antonio Ejemplo Modelo",
                "entity_type": "person",
                "date_of_birth": "1972-02-29",
                "nationality": "ES",
                "include_adverse_media": false,
                "vendor_data": "user-1234"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.aml.screen(
                full_name="Antonio Ejemplo Modelo",
                entity_type="person",
                date_of_birth="1972-02-29",
                nationality="ES",
                include_adverse_media=False,
                vendor_data="user-1234",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

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

            const result = await didit.aml.screen({
              full_name: "Antonio Ejemplo Modelo",
              entity_type: "person",
              date_of_birth: "1972-02-29",
              nationality: "ES",
              include_adverse_media: false,
              vendor_data: "user-1234",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.AML.Screen(ctx, didit.AMLScreenParams{\n\tFullName:            \"Antonio Ejemplo Modelo\",\n\tEntityType:          didit.Some(didit.AMLScreenParamsEntityType(\"person\")),\n\tDateOfBirth:         didit.String(\"1972-02-29\"),\n\tNationality:         didit.String(\"ES\"),\n\tIncludeAdverseMedia: didit.Bool(false),\n\tVendorData:          didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: |-
            import java.time.LocalDate;
            import me.didit.Didit;
            import me.didit.types.AmlScreenParams;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.aml().screen(AmlScreenParams.builder()
                    .fullName("Antonio Ejemplo Modelo")
                    .entityType(AmlScreenParams.EntityType.of("person"))
                    .dateOfBirth(LocalDate.parse("1972-02-29"))
                    .nationality("ES")
                    .includeAdverseMedia(false)
                    .vendorData("user-1234")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

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

            $result = $didit->aml->screen([
                'full_name' => 'Antonio Ejemplo Modelo',
                'entity_type' => 'person',
                'date_of_birth' => '1972-02-29',
                'nationality' => 'ES',
                'include_adverse_media' => false,
                'vendor_data' => 'user-1234',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.aml.screen(
              full_name: "Antonio Ejemplo Modelo",
              entity_type: "person",
              date_of_birth: "1972-02-29",
              nationality: "ES",
              include_adverse_media: false,
              vendor_data: "user-1234"
            )
            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.Aml.ScreenAsync(new AmlScreenParams
            {
                FullName = "Antonio Ejemplo Modelo",
                EntityType = new AmlScreenParamsEntityType("person"),
                DateOfBirth = "1972-02-29",
                Nationality = "ES",
                IncludeAdverseMedia = false,
                VendorData = "user-1234",
            });
            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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