> ## 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.

# Añadir imágenes a una sesión con la API

> Con Didit, adjunta una imagen o PDF a la verificación de identidad o prueba de domicilio de una sesión KYC finalizada, como el reverso del documento.

Prompt de API para añadir imágenes a una sesión
Copiar el prompt al portapapeles

<pre>
  \`Attach an extra image or PDF to a finished Didit User Verification (KYC) session through the API.

  Endpoint:
  PATCH [https://verification.didit.me/v3/session/\{session\_id}/add-images/](https://verification.didit.me/v3/session/\{session_id}/add-images/)

  Authentication:
  Send my Didit API key in the x-api-key header. A scoped key needs sessions: write.

  Goal:

  * Add evidence collected outside the verification flow (for example the back of an ID document, or a supporting letter) to the session's ID verification or Proof of Address result, so reviewers see it with the rest of the session.

  Request (multipart/form-data):

  * file (required): JPG, JPEG, PNG, WEBP, TIFF or PDF, at most 15 MB as uploaded. Didit compresses it and rejects it if it is still over 2 MB (2,097,152 bytes) after compression.
  * model\_type (required): "kyc" for the ID verification, "poa" for the Proof of Address.
  * file\_password (optional): the password of an encrypted PDF.

  Behavior:

  * The session must be Approved, Declined, In Review or Kyc Expired, and must have the result named by model\_type. Business (KYB) sessions are not supported.
  * When the step ran more than once, the file goes to the most recent result.
  * Each call adds one file and keeps the existing ones.
  * The file then appears in extra\_files of id\_verifications\[] or poa\_verifications\[] in GET /v3/session/{session_id}/decision/.
  * A FILE\_ADDED entry is added to the session's activity log. No webhook is sent and the session status does not change.
  * Rate limit: 10 requests per minute per API key.

  Example call:
  curl -X PATCH "[https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/add-images/](https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/add-images/)" \
  -H "x-api-key: YOUR\_API\_KEY" \
  -F "file=@back-of-id.jpg" \
  -F "model\_type=kyc"

  What to read from the response:

  * extra\_files: short-lived presigned links to every extra file of that result, including the new one. A scoped key without media: read receives them as null.

  Failure modes:

  * 400: file or model\_type missing, unsupported format, file too large before or after compression, encrypted PDF without the right file\_password.
  * 401: the API key has expired.
  * 403: missing key (a wrong, revoked or expired key gets 401), a key of another application, a scoped key without sessions: write, or a request from outside the key's IP allowlist.
  * 404: the session does not exist, was deleted, is outside a scoped key's limits, is not in a reviewable status, or has no result of that model\_type.
  * 429: more than 10 calls in a minute. Wait for Retry-After seconds.

  Side effects: stores the file with the session and adds an activity entry.

  For the full integration shape, see /integration/integration-prompt.\`
</pre>

Pegar en

Los enlaces prefirmados de `extra_files` expiran. Cuando necesites los archivos más adelante, obtén enlaces nuevos de la [decisión de la sesión](https://docs.didit.me/es/sessions-api/retrieve-session.md). Si lo que quieres es corregir los datos extraídos de un documento, usa [Actualizar datos de la sesión](https://docs.didit.me/es/sessions-api/update-data.md).


## OpenAPI

````yaml es/openapi-25.json PATCH /v3/session/{sessionId}/add-images/
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/session/{sessionId}/add-images/:
    patch:
      tags:
        - Sessions
      summary: Añadir una imagen a una sesión
      description: >-
        Adjunta una imagen o un PDF adicional al resultado de Verificación de
        identidad (`model_type=kyc`) o de Prueba de domicilio (`model_type=poa`)
        de una sesión de Verificación de usuarios (KYC) finalizada, por ejemplo,
        evidencia recopilada fuera del flujo. La sesión debe estar en
        `Approved`, `Declined`, `In Review` o `Kyc Expired` y contener el
        resultado indicado por `model_type`. Las sesiones de Verificación de
        empresas (KYB) no son compatibles. Cada llamada añade un archivo (al
        resultado más reciente cuando el paso se ejecutó más de una vez),
        conserva los archivos existentes y registra una entrada `FILE_ADDED` en
        el registro de actividad de la sesión. La subida no envía ningún webhook
        y no cambia el estado de la sesión. El archivo se comprime al subirse y
        se devuelve en `extra_files` de la decisión de la sesión. Este endpoint
        está limitado a 10 solicitudes por minuto por clave de API. Una clave de
        API con alcance limitado necesita `sessions: write`, y sin `media: read`
        recibe los enlaces de `extra_files` como `null`.
      operationId: patch_v3_session_add_images
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID de la sesión de Verificación de usuarios (KYC) a la que se
            añade el archivo (el `session_id` que devuelve `POST /v3/session/`).
            Un ID de sesión de Verificación de empresas (KYB) devuelve `404`.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - file
                - model_type
              properties:
                file:
                  type: string
                  format: binary
                  description: >-
                    La imagen o el PDF. Extensiones permitidas: `jpg`, `jpeg`,
                    `png`, `webp`, `tiff`, `pdf`. Como máximo 15 MB al subirlo;
                    después, el archivo se comprime y se rechaza con `400` si
                    sigue superando los 2 MB (2,097,152 bytes). Los archivos
                    vacíos se rechazan.
                model_type:
                  type: string
                  enum:
                    - kyc
                    - poa
                  description: >-
                    `kyc` añade el archivo al resultado de la verificación de
                    identidad; `poa`, al resultado de la Prueba de domicilio.
                  example: kyc
                file_password:
                  type: string
                  description: >-
                    Contraseña de un PDF cifrado. Sin ella, o con una
                    incorrecta, un PDF cifrado devuelve `400`.
            example:
              file: (binary)
              model_type: kyc
      responses:
        '200':
          description: >-
            Archivo añadido. Devuelve todos los archivos adicionales de ese
            resultado, incluido el nuevo.
          content:
            application/json:
              schema:
                type: object
                required:
                  - extra_files
                properties:
                  extra_files:
                    type: array
                    description: >-
                      Enlaces prefirmados de corta duración a todos los archivos
                      adicionales del resultado indicado por `model_type`, del
                      más antiguo al más reciente. Cada enlace es `null` para
                      una clave de API con alcance limitado sin `media: read`.
                      Más adelante, obtén enlaces nuevos de la decisión de la
                      sesión.
                    items:
                      type: string
                      format: uri
                      nullable: true
              example:
                extra_files:
                  - >-
                    https://media.example.com/session/11111111-2222-3333-4444-555555555555/kyc-extra-files/66666666-7777-8888-9999-000000000000.jpg?expires=1789383731&signature=abc123
        '400':
          description: >-
            Error de validación. Los errores de campo llegan como `{"<field>":
            ["<message>"]}`; los errores de PDF cifrado, como `{"detail":
            "..."}`.
          content:
            application/json:
              examples:
                Missing file:
                  summary: No hay ninguna parte de archivo en el formulario
                  value:
                    file:
                      - No file was submitted.
                Missing model_type:
                  summary: Se omitió model_type
                  value:
                    model_type:
                      - This field is required.
                Invalid model_type:
                  summary: model_type no es kyc ni poa
                  value:
                    model_type:
                      - '"passport" is not a valid choice.'
                File too large:
                  summary: Archivo de más de 15 MB
                  value:
                    file:
                      - File size should not exceed 15 MB
                Too large after compression:
                  summary: Sigue superando los 2 MB tras la compresión
                  value:
                    file:
                      - File size is too big. Max allowed size is 2097152 bytes.
                Encrypted PDF:
                  summary: PDF cifrado sin file_password
                  value:
                    detail: >-
                      The PDF is encrypted. Please upload a decrypted PDF or a
                      photo instead.
                Wrong PDF password:
                  summary: file_password no abre el PDF
                  value:
                    detail: >-
                      The PDF password is incorrect. Please provide the correct
                      password.
        '401':
          description: >-
            La clave de API con alcance limitado ha expirado. Este es el único
            caso que devuelve `401`: una clave ausente, no válida o revocada
            devuelve `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              examples:
                Expired key:
                  summary: La fecha de caducidad de la clave ya pasó
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Fallo de autenticación o autorización. Si falta la clave, se
            devuelve `403`, al igual que con una clave de otra aplicación, una
            clave con alcance limitado sin el permiso que necesita este endpoint
            y una solicitud desde fuera de la lista de IP permitidas de la
            clave; una clave incorrecta, revocada o expirada devuelve `401`.
            Distínguelos por `detail`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              examples:
                Missing or invalid credentials:
                  summary: >-
                    Falta el encabezado x-api-key, o la clave no superó la
                    validación
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Other application:
                  summary: >-
                    Una clave válida que pertenece a una aplicación distinta de
                    la de la sesión
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without sessions write:
                  summary: 'A la clave con alcance limitado le falta sessions: write'
                  value:
                    detail: This API key has no write access to sessions.
                IP not allowed:
                  summary: >-
                    Solicitud desde fuera de la lista de IP permitidas de la
                    clave
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            La sesión no existe, se ha eliminado o está fuera de los límites de
            una clave con alcance restringido; es una sesión KYB o no está en
            `Approved`, `Declined`, `In Review` o `Kyc Expired`; o no tiene
            ningún resultado del `model_type` solicitado (se comprueba antes de
            validar el archivo). La búsqueda de la sesión se ejecuta antes de
            comprobar la credencial, por lo que un `sessionId` desconocido
            devuelve `404` incluso sin una clave válida.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              examples:
                Unknown session:
                  summary: No existe ninguna sesión con este ID, o se eliminó
                  value:
                    detail: Not found.
                Outside key limits:
                  summary: >-
                    La sesión está fuera de los límites de flujo o de solo
                    aprobadas de una clave con alcance restringido
                  value:
                    detail: Session not found.
                Not eligible:
                  summary: >-
                    La sesión aún no ha terminado, o se trata de un ID de sesión
                    KYB
                  value:
                    detail: No Session matches the given query.
                No ID verification:
                  summary: model_type=kyc en una sesión sin verificación de identidad
                  value:
                    detail: The session does not have KYC data.
                No Proof of Address:
                  summary: model_type=poa en una sesión sin prueba de domicilio
                  value:
                    detail: The session does not have POA data.
        '429':
          description: >-
            Límite de solicitudes superado: 10 solicitudes de añadir imágenes
            por minuto por clave de API (las solicitudes rechazadas también
            cuentan). También se aplica el presupuesto compartido de 300
            solicitudes de escritura por minuto. Espera los segundos indicados
            en `Retry-After` antes de reintentar; los encabezados
            `X-RateLimit-*` muestran el presupuesto.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              examples:
                Rate limited:
                  summary: Presupuesto del minuto actual agotado
                  value:
                    detail: >-
                      Session add-images rate limit exceeded. You can make up to
                      10 requests per minute.
          headers:
            Retry-After:
              description: Segundos que hay que esperar antes de reintentar.
              schema:
                type: integer
                minimum: 1
                example: 30
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X PATCH
            'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/add-images/'
            \
              -H 'x-api-key: YOUR_API_KEY' \
              -F 'file=@./back-of-id.jpg' \
              -F 'model_type=kyc'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.add_images(
                "11111111-2222-3333-4444-555555555555",
                file=open("image.jpg", "rb"),
                model_type="kyc",
            )
            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.sessions.addImages("11111111-2222-3333-4444-555555555555", {
              file: await fileFromPath("image.jpg"),
              model_type: "kyc",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.AddImages(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsAddImagesParams{\n\tFile:      didit.FileFromPath(\"image.jpg\"),\n\tModelType: \"kyc\",\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.SessionsAddImagesParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().addImages("11111111-2222-3333-4444-555555555555",
            SessionsAddImagesParams.builder()
                    .file(Path.of("image.jpg"))
                    .modelType(SessionsAddImagesParams.ModelType.of("kyc"))
                    .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->sessions->addImages('11111111-2222-3333-4444-555555555555',
            [
                'file' => File::fromPath('image.jpg'),
                'model_type' => 'kyc',
            ]);

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.sessions.add_images(
              "11111111-2222-3333-4444-555555555555",
              file: Pathname("image.jpg"),
              model_type: "kyc"
            )
            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.Sessions.AddImagesAsync("11111111-2222-3333-4444-555555555555",
            new SessionsAddImagesParams

            {
                File = FileUpload.FromPath("image.jpg"),
                ModelType = "kyc",
            });

            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.