> ## 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 d'estat de funcionalitats: aprovar o rebutjar un pas

> Aprova, rebutja o mou un sol pas de verificació (OCR, Liveness, Face Match, AML, POA, Phone…) a revisió, ara o quan la persona acabi el flux. Didit.



Indicació per actualitzar l'estat de la funcionalitat
        Copia el prompt al porta-retalls



      
      

\<pre>

\`Approve, decline, or move a SINGLE verification step (feature) of a Didit session to review, now or once the person finishes the flow.

Endpoint:
PATCH https://verification.didit.me/v3/session/{session_id}/features/{node_id}/update-status/

Authentication:
x-api-key (client API key) or a user-auth token. Privilege: write:sessions.

Path parameters:
\- session_id (UUID) — KYC or KYB; Didit resolves it against both session types.
\- node_id — the workflow graph node ID of the step (e.g. feature_ocr_1, feature_liveness_1, feature_aml_1). Use the literal "default" for non-graph (single-step) workflows where the step has no node ID.

Request body:
\- new_status (string, required): one of "Approved", "Declined", "In Review". Must differ from the step's current status.
\- comment (string, optional): your reason, saved in the session's activity and returned as the override's reason.
\- feature_type (string, optional): which kind of step to target, for example "LIVENESS", "AML", "FACE_MATCH", "ID_VERIFICATION". Needed when node_id is "default" (non-graph workflows, where steps have no node ID). An unknown value returns 400 { "feature_type": ["Unknown feature_type '...'."] }.
\- defer_until_flow_finishes (boolean, optional, default false): while the person is still in the flow, wait and apply the override when the flow finishes instead of at once.

When the override applies:
\- Omitted or false: it applies at once. If the person is still in the flow it is recorded as forced=true.
\- true while the person is still in the flow (session Not Started, In Progress or Resubmitted, and not finished): it is stored as "pending_until_flow_finishes" and applies when the flow finishes, after the flow reaches its own decision.
\- true after the flow ended: it applies at once.
\- A waiting override is cancelled instead when the person redoes the step before finishing, a newer override on the same step replaces it, the session leaves the flow unfinished (abandoned, expired, decided mid-flow), or you cancel it with POST /v3/session/{session_id}/features/overrides/{override_id}/cancel/.

Which steps this works on:
Every per-step feature record: OCR/ID, Liveness, Face Match, NFC, AML, Proof of Address (POA), Phone, Email, Database Validation, Questionnaire, and the KYB registry / documents / key-people checks.

Difference vs update-status:
\- update-status changes the OVERALL session decision (Approved/Declined/Resubmitted).
\- THIS endpoint changes ONE step's status. A session that already has a decision keeps it. If the session has no decision yet and its workflow is waiting on exactly this step, applying the override completes the step: the workflow moves on and a status node can set the session decision (and fire status.updated).

Not allowed:
\- Standalone API sessions (session_type = API) return 400.

curl example — approve the ID/OCR step:
curl -X PATCH https://verification.didit.me/v3/session/<SESSION_ID>/features/feature_ocr_1/update-status/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{ "new_status": "Approved", "comment": "Document manually verified" }'

Response: { session_id, node_id, feature_type, new_status, override }.
\- node_id is the step's workflow node, or null for a step without a node ("default" in a non-graph workflow).
\- new_status is the step's stored status: the requested one once the override applied, the unchanged one while it waits.
\- override: { id, node_id, feature_type, feature_model, previous_status, new_status, state ("applied" | "pending_until_flow_finishes" | "cancelled"), forced, reason, requested_by { email, name, type }, requested_at, applied_at, cancelled_at, cancel_reason }.

Side effects:
\- Fires a data.updated webhook when the override applies (at once, or when the flow finishes). Nothing is sent while it waits or when it is cancelled.
\- Records the override in the session's activity as FEATURE_OVERRIDE_PENDING, FEATURE_OVERRIDE_APPLIED or FEATURE_OVERRIDE_CANCELLED, with who made it; the request's entry carries your comment. In the decision's reviews array these entries appear with new_status null, and the request's entry has your reason in comment.

Failure modes:
\- 400: new_status invalid or unchanged, unknown feature_type, or the session is a standalone API session.
\- 401: the scoped API key has expired.
\- 403: missing credentials (a wrong, revoked or expired key gets 401), or the caller lacks write:sessions (a scoped key needs decisions write).
\- 404: session not found, or no feature has the given node_id.

Related: list overrides with GET /v3/session/{session_id}/features/overrides/ (see /sessions-api/list-feature-overrides); cancel a waiting one with POST /v3/session/{session_id}/features/overrides/{override_id}/cancel/ (see /sessions-api/cancel-feature-override).

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

Enganxa a

## Què faUna sessió de verificació està formada per funcionalitats (passos) individuals: ID/OCR, Prova de vida, Coincidència facial, AML, Comprovant de domicili, Telèfon, etc.
Aquest endpoint et permet establir l'estat d'**un** d'aquests passos a `Approved`, `Declined` o `In Review`.Fes servir [update-status](https://docs.didit.me/ca/sessions-api/update-status.md) quan vulguis aprovar, rebutjar o reobrir la sessió completa.
Fes servir **aquest** endpoint quan només vulguis registrar una decisió sobre un sol pas, per exemple per marcar el pas de Coincidència facial com a `Declined` en el teu propi flux de revisió.Una sessió que ja té una decisió la conserva: només canvia el pas.
Si la sessió encara no té cap decisió i el seu flux de treball està esperant precisament aquest pas, aplicar la substitució completa el pas, igual que si s'acabés de manera normal.
El flux de treball continua, s'executen els passos següents, i un node d'estat pot establir la decisió de la sessió i disparar un webhook `status.updated`.## Dirigir-se a un pas amb `node_id`En els fluxos de treball basats en graf, cada pas té un `node_id` (per exemple `feature_ocr_1`, `feature_liveness_1`, `feature_aml_1`). Pots trobar-los a la [decisió de la sessió](https://docs.didit.me/ca/sessions-api/retrieve-session.md): cada funcionalitat d'una decisió V3 porta el seu `node_id`.Per als fluxos de treball sense graf (d'un sol pas), la funcionalitat subjacent no té identificador de node. Passa el valor literal `default` com a `nodeId` per dirigir-te-hi.
Com que cap pas d'aquest tipus de flux de treball té identificador de node, passa també `feature_type` (per exemple `LIVENESS`, `AML` o `FACE_MATCH`) per indicar quin pas vols.
Un `feature_type` desconegut retorna `400`.## Esperar que la persona acabi el fluxPer defecte, la substitució s'aplica de seguida.
Si la persona encara està passant pel flux, això canvia un pas d'un flux que encara està en curs; la substitució es registra aleshores amb `forced: true`.Posa `defer_until_flow_finishes: true` per esperar.
Mentre la sessió estigui `Not Started`, `In Progress` o `Resubmitted` i la persona no hagi acabat, la substitució s'emmagatzema com a `pending_until_flow_finishes`.
S'aplica quan la persona acaba el flux, després que el flux arribi a la seva pròpia decisió.
En una sessió el flux de la qual ja ha acabat, s'aplica de seguida en tots dos casos.Una substitució en espera es cancel·la en lloc d'aplicar-se quan:- la persona refà el pas abans d'acabar (`check_changed`),
- una substitució més nova sobre el mateix pas la reemplaça (`replaced`),
- la sessió surt del flux sense acabar-lo: abandonada, caducada o decidida a mig flux (`session_closed`),
- la cancel·les amb [Cancel Feature Override](https://docs.didit.me/ca/sessions-api/cancel-feature-override.md) (`cancelled_by_reviewer`).El camp `override` de la resposta indica què ha passat: `state` és `applied` o `pending_until_flow_finishes`, i `applied_at` s'omple quan s'ha aplicat.
El `new_status` de nivell superior és l'estat emmagatzemat del pas, de manera que no canvia mentre la substitució espera.
Fes servir [List Feature Overrides](https://docs.didit.me/ca/sessions-api/list-feature-overrides.md) per veure totes les substitucions d'una sessió i si la persona encara és dins del flux.## Suport de KYC i KYBFunciona igual per a sessions de **Verificació d'usuaris (KYC)** i de **Verificació d'empreses (KYB)**: Didit resol el `sessionId` en tots dos casos.
Els tipus de pas admesos inclouen ID/OCR, Prova de vida, Coincidència facial, NFC, AML, Comprovant de domicili, Telèfon, Correu electrònic, Validació en bases de dades, Qüestionaris, i les comprovacions del registre KYB, dels documents i de les persones clau.> [!NOTE]
>
> Les sessions API independents (les creades mitjançant les APIs de verificació independents, `session_type = API`) no poden tenir canviats els estats de funcionalitat individuals: l'endpoint retorna `400`.## Exemples> [tab] Aprovar un pas
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../features/feature_ocr_1/update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Approved",
>     "comment": "Document manually verified by compliance"
>   }'
> ```> [tab] Rebutjar el pas de Coincidència facial
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../features/feature_face_match/update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Declined"
>   }'
> ```> [tab] Flux de treball d'un sol pas (node per defecte)
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../features/default/update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "In Review",
>     "feature_type": "LIVENESS"
>   }'
> ```> [tab] Esperar que la persona acabi el flux
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../features/feature_liveness_1/update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Approved",
>     "comment": "Liveness retried with a reviewer present",
>     "defer_until_flow_finishes": true
>   }'
> ```## Què passa després d'una actualització- **Webhook**: s'envia un esdeveniment `data.updated` quan la substitució s'aplica, de seguida o quan acaba el flux. No s'envia res mentre espera ni quan es cancel·la.
- **Activitat**: cada substitució es registra a l'activitat de la sessió com a `FEATURE_OVERRIDE_PENDING`, `FEATURE_OVERRIDE_APPLIED` o `FEATURE_OVERRIDE_CANCELLED`, amb l'actor (clau d'API, usuari o el sistema quan s'aplica una substitució en espera). L'entrada de la sol·licitud porta el teu `comment` com a motiu. A l'array `reviews` de la [decisió de la sessió](https://docs.didit.me/ca/sessions-api/retrieve-session.md) aquestes entrades apareixen amb `new_status: null`, i l'entrada de la sol·licitud té el teu motiu a `comment`.
- **Decisió de la sessió**: una sessió que ja té decisió la conserva. Per canviar la decisió final, crida [update-status](https://docs.didit.me/ca/sessions-api/update-status.md) per separat.## PermísCal el privilegi `write:sessions`, amb una clau d'API de client (`x-api-key`) o una capçalera d'autorització d'usuari.
Una clau d'API amb àmbit limitat necessita accés d'escriptura a les decisions.## Relacionats- [Update session status](https://docs.didit.me/ca/sessions-api/update-status.md): canvia la decisió global de la sessió.
- [Update AML hit status](https://docs.didit.me/ca/sessions-api/update-aml-hit-status.md): revisa les coincidències AML individuals.
- [Retrieve session](https://docs.didit.me/ca/sessions-api/retrieve-session.md): obté la decisió (i el `node_id` de cada funcionalitat).
- [Webhooks](https://docs.didit.me/ca/integration/webhooks.md): subscriu-te a `data.updated`.
- [List Feature Overrides](https://docs.didit.me/ca/sessions-api/list-feature-overrides.md): totes les substitucions d'una sessió i el seu estat.
- [Cancel Feature Override](https://docs.didit.me/ca/sessions-api/cancel-feature-override.md): atura una substitució en espera perquè no s'apliqui.


## OpenAPI

````yaml ca/openapi-25.json PATCH /v3/session/{sessionId}/features/{nodeId}/update-status/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificació d'identitat. Autentica't amb la capçalera x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/features/{nodeId}/update-status/:
    patch:
      tags:
        - Sessions
      summary: Actualitzar l'estat d'una funcionalitat (pas) individual
      description: >-
        Estableix l'estat d'una funcionalitat de verificació (pas) individual
        dins d'una sessió. Selecciona la funcionalitat mitjançant el seu
        `nodeId` del graf del flux de treball. En els fluxos de treball sense
        graf, els passos dels quals no tenen node, utilitza `default` i passa
        també `feature_type` per indicar a quin pas et refereixes.


        Funciona tant per a sessions de Verificació d'usuaris (KYC) com de
        Verificació d'empreses (KYB) i per a cada tipus de pas: ID/OCR, Prova de
        vida, Coincidència facial, NFC, AML, Comprovant de domicili, Telèfon,
        Correu electrònic, Validació en bases de dades, Qüestionari i les
        comprovacions de registre mercantil / documents / persones clau de KYB.
        Aquest endpoint **no** està disponible per a sessions d'API independents
        (`session_type = API`).


        `new_status` ha de ser un d'entre `Approved`, `Declined` o `In Review`,
        i ha de ser diferent de l'estat actual de la funcionalitat.


        **Quan s'aplica la substitució.** Sense `defer_until_flow_finishes` (o
        amb `false`), la substitució s'aplica immediatament, com sempre; quan la
        persona encara està en el flux, es registra com a `forced`. Amb
        `defer_until_flow_finishes: true` mentre la persona encara és al flux
        (la sessió està en `Not Started`, `In Progress` o `Resubmitted` i no ha
        finalitzat), la substitució s'emmagatzema com a
        `pending_until_flow_finishes` i s'aplica quan el flux finalitza, després
        que el flux arribi a la seva pròpia decisió. En una sessió el flux de la
        qual ja ha finalitzat, s'aplica immediatament en ambdós casos. Una
        substitució en espera es cancel·la si la persona torna a fer el pas
        abans d'acabar, si una substitució més recent a la mateixa comprovació
        la reemplaça, si la sessió surt del flux sense finalitzar (abandonada,
        caducada o decidida a mig flux), o si la cancel·les amb `POST
        /v3/session/{sessionId}/features/overrides/{overrideId}/cancel/`.
        Consulta les substitucions d'una sessió amb `GET
        /v3/session/{sessionId}/features/overrides/`.


        **Efecte sobre la sessió.** Una sessió que ja té una decisió la manté:
        només canvia la comprovació. Quan la sessió encara no té cap decisió i
        el seu flux de treball està esperant exactament aquest pas, l'aplicació
        de la substitució completa el pas: el flux de treball avança, s'executen
        els passos posteriors i un node d'estat pot establir la decisió de la
        sessió i disparar `status.updated`.


        **Webhooks i activitat.** Es dispara un webhook `data.updated` quan
        s'aplica la substitució (immediatament o quan el flux finalitza), mai
        mentre està en espera o quan es cancel·la. Cada substitució es registra
        a l'activitat de la sessió com a `FEATURE_OVERRIDE_PENDING`,
        `FEATURE_OVERRIDE_APPLIED` o `FEATURE_OVERRIDE_CANCELLED`, juntament amb
        qui l'ha feta; l'entrada de la sol·licitud inclou el teu `comment`.


        Autentica't amb la teva clau d'API (`x-api-key`) o amb una capçalera
        d'autorització d'usuari que contingui el permís `write:sessions`; una
        clau d'API amb àmbit restringit necessita accés d'escriptura a les
        decisions.
      operationId: patch_v3_session_update_feature_status
      parameters:
        - in: path
          name: sessionId
          required: true
          description: >-
            UUID de la sessió de verificació. Accepta tant IDs de sessió
            d'usuari (KYC) com d'empresa (KYB); el servei resol l'ID entre tots
            dos tipus de sessió.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - in: path
          name: nodeId
          required: true
          description: >-
            ID del node del graf del flux de treball de la funcionalitat que cal
            actualitzar (per exemple `feature_ocr_1`). Utilitza el valor literal
            `default` per a fluxos de treball que no siguin de tipus graf (d'un
            sol pas) on la funcionalitat no tingui cap ID de node.
          schema:
            type: string
            example: feature_ocr_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - new_status
              properties:
                new_status:
                  type: string
                  description: >-
                    Estat de destinació per a aquesta funcionalitat. Ha de ser
                    diferent del valor actual.
                  enum:
                    - Approved
                    - Declined
                    - In Review
                  example: Approved
                comment:
                  type: string
                  description: >-
                    Nota opcional en text lliure registrada al registre de
                    revisió de la sessió per a aquest canvi de funcionalitat.
                  example: Document manually verified by compliance.
                feature_type:
                  type: string
                  enum:
                    - ID_VERIFICATION
                    - OCR
                    - OCR_BACK
                    - NFC
                    - LIVENESS
                    - FACE
                    - AGE_ESTIMATION
                    - AGE_VERIFICATION
                    - FACE_SEARCH
                    - FACE_MATCH
                    - IP_ANALYSIS
                    - AML
                    - PHONE
                    - PHONE_VERIFICATION
                    - EMAIL
                    - EMAIL_VERIFICATION
                    - POA
                    - PROOF_OF_ADDRESS
                    - DATABASE_VALIDATION
                    - DATA_VALIDATION
                    - QUESTIONNAIRE
                    - DOCUMENT_AI
                    - KYB_REGISTRY
                    - KYB_DOCUMENTS
                    - KYB_KEY_PEOPLE
                    - BANK_VERIFICATION
                    - GEOLOCATION
                  description: >-
                    A quin tipus de pas s'adreça. Necessari en fluxos de treball
                    que no són de graf (`nodeId` = `default`), on cap pas
                    comparteix node; opcional en cas contrari. Un valor
                    desconegut retorna `400`.
                  example: LIVENESS
                defer_until_flow_finishes:
                  type: boolean
                  default: false
                  description: >-
                    Mentre la persona encara estigui al flux, desa l'anul·lació
                    com a `pending_until_flow_finishes` i aplica-la quan
                    finalitzi el flux, en lloc de fer-ho immediatament. Si
                    s'omet o és `false`, l'anul·lació s'aplica immediatament. En
                    una sessió el flux de la qual ja ha acabat, s'aplica
                    immediatament en qualsevol dels dos casos.
                  example: false
            examples:
              Apply Now:
                summary: Aprova el pas de document d'identitat immediatament
                value:
                  new_status: Approved
                  comment: Document manually verified by compliance.
              Wait For The Flow:
                summary: >-
                  Aprova el pas de prova de vida un cop la persona finalitzi el
                  flux
                value:
                  new_status: Approved
                  comment: Liveness retried with a reviewer present.
                  defer_until_flow_finishes: true
              Non-graph Workflow:
                summary: >-
                  Apunta al pas de prova de vida d'un flux de treball sense
                  nodes (nodeId = default)
                value:
                  new_status: In Review
                  feature_type: LIVENESS
      responses:
        '200':
          description: >-
            La substitució s'ha registrat. `new_status` és l'estat de la
            comprovació tal com s'ha desat: el sol·licitat un cop aplicada la
            substitució, el no modificat mentre s'espera que acabi el flux.
            `override` indica què ha passat.
          content:
            application/json:
              schema:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                  node_id:
                    type: string
                    nullable: true
                    description: >-
                      El node del flux de treball del pas actualitzat, o `null`
                      per a un pas sense node (el camí `default` en un flux de
                      treball sense graf).
                    example: feature_ocr_1
                  feature_type:
                    type: string
                    description: >-
                      Nom del model de la funcionalitat actualitzada (p. ex.,
                      `KYC`, `Face`, `FaceMatch`, `AML`, `POA`).
                    example: KYC
                  new_status:
                    type: string
                    description: >-
                      L'estat emmagatzemat de la comprovació: el sol·licitat un
                      cop aplicada la sobreescriptura, o el que no ha canviat
                      mentre la sobreescriptura espera que acabi el flux.
                    example: Approved
                  override:
                    $ref: '#/components/schemas/FeatureStatusOverride'
                required:
                  - session_id
                  - node_id
                  - feature_type
                  - new_status
                  - override
              examples:
                Applied:
                  summary: La substitució s'ha aplicat immediatament
                  value:
                    session_id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                    node_id: feature_ocr_1
                    feature_type: KYC
                    new_status: Approved
                    override:
                      id: 7c9e6679-7425-40de-944b-e07fc1f90ae7
                      node_id: feature_ocr_1
                      feature_type: ''
                      feature_model: KYC
                      previous_status: In Review
                      new_status: Approved
                      state: applied
                      forced: false
                      reason: Document manually verified by compliance.
                      requested_by:
                        email: reviewer@example.com
                        name: Alex Reviewer
                        type: CONSOLE_USER
                      requested_at: '2026-10-13T09:15:00Z'
                      applied_at: '2026-10-13T09:15:00Z'
                      cancelled_at: null
                      cancel_reason: null
                Waiting For The Flow:
                  summary: >-
                    defer_until_flow_finishes mentre la persona encara és al
                    flux
                  value:
                    session_id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                    node_id: feature_liveness_1
                    feature_type: Face
                    new_status: Declined
                    override:
                      id: 9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3
                      node_id: feature_liveness_1
                      feature_type: ''
                      feature_model: Face
                      previous_status: Declined
                      new_status: Approved
                      state: pending_until_flow_finishes
                      forced: false
                      reason: Liveness retried with a reviewer present.
                      requested_by:
                        email: reviewer@example.com
                        name: Alex Reviewer
                        type: CONSOLE_USER
                      requested_at: '2026-10-13T09:15:00Z'
                      applied_at: null
                      cancelled_at: null
                      cancel_reason: null
        '400':
          description: >-
            Error de validació. Es retorna quan `new_status` no és vàlid o no ha
            canviat, quan `feature_type` és desconegut o quan la sessió és una
            sessió d'API autònoma.
          content:
            application/json:
              examples:
                Same Status:
                  summary: new_status és igual a l'estat actual
                  value:
                    new_status:
                      - The new status is the same as the current status.
                API Session:
                  summary: >-
                    L'estat de la funcionalitat no es pot canviar en sessions
                    d'API autònomes
                  value:
                    - Cannot change feature status for API sessions.
                Unknown feature_type:
                  summary: feature_type no és un tipus de pas conegut
                  value:
                    feature_type:
                      - Unknown feature_type 'SELFIE'.
        '401':
          description: La clau d'API amb abast ha caducat.
          content:
            application/json:
              examples:
                Expired API Key:
                  summary: Clau d'API amb abast que ha superat la data de caducitat
                  value:
                    detail: This API key has expired.
        '403':
          description: Falten les credencials o els permisos són insuficients.
          content:
            application/json:
              examples:
                Invalid Credentials:
                  summary: Falta l'x-api-key o no és vàlid
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Missing Privilege:
                  summary: La clau d'API no té write:sessions
                  value:
                    detail: You do not have permission to perform this action.
                Scoped Key Without Access:
                  summary: Clau d'API amb abast sense accés d'escriptura a decisions
                  value:
                    detail: This API key has no write access to decisions.
        '404':
          description: >-
            No s'ha trobat la sessió, o no té cap funcionalitat amb el `nodeId`
            indicat.
          content:
            application/json:
              examples:
                Session Not Found:
                  summary: session_id desconegut
                  value:
                    detail: Session not found.
                Feature Not Found:
                  summary: Cap funcionalitat per a aquest node_id
                  value:
                    detail: >-
                      No feature found with node_id 'feature_ocr_1' in this
                      session.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X PATCH \
              https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/features/feature_ocr_1/update-status/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "new_status": "Approved",
                "comment": "Document manually verified by compliance."
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.update_feature_status(
                "11111111-2222-3333-4444-555555555555",
                "feature_ocr_1",
                new_status="Approved",
                comment="Document manually verified by compliance.",
            )
            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.sessions.updateFeatureStatus(
              "11111111-2222-3333-4444-555555555555",
              "feature_ocr_1",
              {
                new_status: "Approved",
                comment: "Document manually verified by compliance.",
              },
            );
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateFeatureStatus(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_ocr_1\", didit.SessionsUpdateFeatureStatusParams{\n\tNewStatus: \"Approved\",\n\tComment:   didit.String(\"Document manually verified by compliance.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.SessionsUpdateFeatureStatusParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().updateFeatureStatus("11111111-2222-3333-4444-555555555555",
            "feature_ocr_1", SessionsUpdateFeatureStatusParams.builder()
                    .newStatus(SessionsUpdateFeatureStatusParams.NewStatus.of("Approved"))
                    .comment("Document manually verified by compliance.")
                    .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->sessions->updateFeatureStatus('11111111-2222-3333-4444-555555555555',
            'feature_ocr_1', [
                'new_status' => 'Approved',
                'comment' => 'Document manually verified by compliance.',
            ]);

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

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

            result = didit.sessions.update_feature_status(
              "11111111-2222-3333-4444-555555555555",
              "feature_ocr_1",
              new_status: "Approved",
              comment: "Document manually verified by compliance."
            )
            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.UpdateFeatureStatusAsync("11111111-2222-3333-4444-555555555555",
            "feature_ocr_1", new SessionsUpdateFeatureStatusParams

            {
                NewStatus = "Approved",
                Comment = "Document manually verified by compliance.",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    FeatureStatusOverride:
      type: object
      description: >-
        Una sobreescriptura de l'estat d'una comprovació (funcionalitat) feta
        amb `PATCH /v3/session/{sessionId}/features/{nodeId}/update-status/`:
        què canvia, si s'ha aplicat o encara espera que la persona finalitzi el
        flux, qui ho ha sol·licitat i per què.
      required:
        - id
        - node_id
        - feature_type
        - feature_model
        - previous_status
        - new_status
        - state
        - forced
        - reason
        - requested_by
        - requested_at
        - applied_at
        - cancelled_at
        - cancel_reason
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Identificador de la sobreescriptura. Transmet-lo a l'endpoint de
            cancel·lació.
          example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
        node_id:
          type: string
          description: >-
            El node del flux de treball indicat a la sol·licitud (`default` per
            a un pas sense node).
          example: feature_ocr_1
        feature_type:
          type: string
          description: >-
            El `feature_type` que ha passat la sol·licitud, o una cadena buida
            si no n'ha passat cap.
          example: ''
        feature_model:
          type: string
          description: >-
            El tipus de comprovació que s'ha anul·lat, per exemple `KYC`,
            `Face`, `AML` o `GeolocationCheck`.
          example: KYC
        previous_status:
          type: string
          enum:
            - Not Finished
            - Approved
            - Declined
            - In Review
            - Resub Requested
          description: L'estat de la comprovació quan es va sol·licitar la sobreescriptura.
          example: In Review
        new_status:
          type: string
          enum:
            - Approved
            - Declined
            - In Review
          description: L'estat que estableix l'anul·lació.
          example: Approved
        state:
          type: string
          enum:
            - applied
            - pending_until_flow_finishes
            - cancelled
          description: >-
            `applied`: la comprovació té el nou estat.
            `pending_until_flow_finishes`: la sobreescriptura espera i s'aplica
            quan la persona finalitza el flux. `cancelled`: ha esperat i no s'ha
            arribat a aplicar mai (consulta `cancel_reason`).
          example: applied
        forced:
          type: boolean
          description: >-
            `true` quan la sobreescriptura s'ha aplicat immediatament mentre la
            persona encara era al flux.
          example: false
        reason:
          type: string
          nullable: true
          description: El `comment` enviat amb la sol·licitud, o `null`.
          example: Document manually verified by compliance.
        requested_by:
          type: object
          nullable: true
          description: Qui ha sol·licitat la substitució, o `null` si no se sap.
          properties:
            email:
              type: string
              format: email
              nullable: true
              description: >-
                Correu electrònic de l'usuari de la consola, o `null` per a
                claus d'API i el sistema.
              example: reviewer@example.com
            name:
              type: string
              nullable: true
              description: Nom visible del sol·licitant, o `null`.
              example: Alex Reviewer
            type:
              type: string
              enum:
                - CONSOLE_USER
                - API_KEY
                - SYSTEM
              description: >-
                Qui ha fet la sol·licitud: un usuari de la consola, una clau
                d'API o el mateix Didit.
              example: CONSOLE_USER
        requested_at:
          type: string
          format: date-time
          description: Quan es va sol·licitar la sobreescriptura.
          example: '2026-10-13T09:15:00Z'
        applied_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Quan la comprovació va adoptar el nou estat, o `null` mentre està en
            espera o un cop cancel·lada.
          example: '2026-10-13T09:15:00Z'
        cancelled_at:
          type: string
          format: date-time
          nullable: true
          description: Quan es va cancel·lar una substitució en espera, o `null`.
          example: null
        cancel_reason:
          type: string
          nullable: true
          enum:
            - cancelled_by_reviewer
            - replaced
            - check_changed
            - session_closed
            - null
          description: >-
            Per què no es va aplicar mai una substitució en espera, o `null`.
            `cancelled_by_reviewer`: cancel·lada amb l'endpoint de cancel·lació.
            `replaced`: una substitució més recent en la mateixa comprovació la
            va substituir. `check_changed`: la persona ha tornat a fer la
            comprovació abans d'acabar el flux. `session_closed`: la sessió ha
            sortit del flux abans que la persona l'acabés (abandonada, caducada
            o decidida a mig flux).
          example: null
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clau d'API de la teva aplicació, des de Developers -> API keys a la
        Business Console. La clau primària té accés complet. Una clau amb nom
        pot tenir l'abast limitat: cap, lectura o escriptura per recurs,
        limitada a determinats fluxos de treball o a sessions aprovades, a una
        llista d'adreces IP i a una data de caducitat. 401 significa que la clau
        és incorrecta, revocada o caducada; 403 significa que no s'ha enviat cap
        clau, que la clau no té accés a aquest recurs o acció, o que la
        sol·licitud prové d'una adreça fora de la seva llista d'IP; 404 en una
        ruta de sessió significa que la sessió està fora dels fluxos de treball
        o estats de la clau. Una clau sense accés a fitxers multimèdia rep els
        URL d'imatge, vídeo i PDF com a null, i una clau sense permís
        d'escriptura de sessions rep els enllaços de sessió i els tokens com a
        null. Consulta https://docs.didit.me/console/api-keys.

````

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