> ## 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 titulars reals KYB: Registre d'empreses

> Crida POST /v3/kyb/ubo/ amb un kyb_response_id de la cerca al registre per obtenir el perfil de l'empresa, els accionistes i els titulars reals de Didit.

Utilitza aquest endpoint després de `POST /v3/kyb/search/` quan et retorna empreses candidates i necessites els **titulars reals últims**: els accionistes, més les persones físiques i les empreses matrius que es resolen a través de la cadena de titularitat (`registry_data.ubo_resolution`).

Es factura al preu d'UBO del país ([preus per país](https://docs.didit.me/ca/getting-started/kyb-registry-pricing.md)). El nivell entregat és el més alt que el país i el registre poden oferir, i `registry_tier_delivered` indica el que es factura: `shareholders` quan l'informe no indica cap persona física com a titular real, `basic` quan no hi ha cap registre de titularitat, és a dir, `registry_ownership_status` és `unavailable`, o `not_held` quan la font de titularitat ha respost que no té aquesta empresa ([estat de la titularitat](https://docs.didit.me/ca/standalone-apis/kyb-registry.md#estat-de-la-titularitat)).

Quan l'informe encara s'està preparant, o la secció de titularitat encara no s'ha recuperat del registre, l'endpoint retorna `202 Accepted`, `kyb_registry.fetch_status: "pending"`, `kyb_registry.registry_ownership_status: "pending"` i `registry_tier_delivered: null`.
Guarda el `request_id` retornat i consulta `GET /v3/session/{request_id}/decision/` fins que `registry_checks[0].company.fetch_status` sigui `resolved`.
Didit completa l'informe pendent automàticament i factura el nivell entregat quan estigui llest.
No repeteixis la sol·licitud de compra mentre està pendent: cada nou POST crea una sol·licitud separada.

Disponible només a v3. `POST /v2/kyb/select/` i `POST /v3/kyb/select/` mantenen el seu contracte i el seu preu.


## OpenAPI

````yaml ca/openapi-25.json POST /v3/kyb/ubo/
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/kyb/ubo/:
    post:
      tags:
        - Standalone APIs
      summary: Empresa al registre mercantil per a KYB amb titulars reals (independent)
      description: >-
        Recupera el perfil Lite, els accionistes directes **i els titulars
        reals** resolts a través de la cadena de titularitat
        (`registry_data.ubo_resolution` inclou la cadena de la matriu
        corporativa) d'un candidat retornat per `POST /v3/kyb/search/`.


        **Associació amb la cerca.** Passa el `kyb_response_id` del candidat
        exactament com l'ha retornat una cerca de la mateixa aplicació. Cerca al
        nivell que tinguis intenció d'adquirir (`tier` a `POST
        /v3/kyb/search/`), perquè la cerca s'executa a la cadena de registres
        que dóna servei a aquest nivell i una cerca Lite buida no és prova que
        el registre no contingui l'empresa. Quan les dades de titularitat del
        país es troben en un altre registre, Didit torna a cercar l'empresa allà
        pel número de registre, sense cap cost addicional.


        **Facturació.** Es factura al preu d'UBO del país; consulta els [preus
        del registre de KYB](/ca/getting-started/kyb-registry-pricing). El
        nivell lliurat és el més alt que el país i el registre poden oferir:
        Shareholders quan l'informe resolt no identifica cap persona física com
        a titular real, Lite quan no hi ha cap registre de titularitat;
        `registry_tier_delivered` indica el que s'ha facturat. El saldo es
        comprova respecte al preu d'UBO abans de qualsevol crida al registre
        (`403` si és insuficient).


        **Disponibilitat.** Només v3. Cada crida crea una sessió d'empresa (el
        seu id és el `request_id`).


        **Informes pendents.** Quan un informe encara s'està preparant, o la
        secció de titularitat encara no s'ha recuperat del registre, l'endpoint
        retorna 202 Accepted, kyb_registry.fetch_status=pending,
        kyb_registry.registry_ownership_status=pending i
        registry_tier_delivered=null. Conserva request_id i consulta GET
        /v3/session/{request_id}/decision/ fins que
        registry_checks[0].company.fetch_status estigui resolt. Didit completa
        l'informe automàticament i cobra el nivell lliurat un cop estigui llest.
        No repeteixis la compra mentre estigui pendent; cada nou POST crea una
        sol·licitud independent.
      operationId: post_v3_kyb_ubo
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/KYBRegistryCandidateRequest'
            example:
              kyb_response_id: 69aeeb95febb0f1704042259
              vendor_data: company-1234
      responses:
        '200':
          description: >-
            Informe d'empresa retornat i facturat segons el nivell proporcionat.
            Els informes de titularitat que encara s'estan preparant poden
            retornar 202; conserva request_id per recuperar la seva decisió
            desada.
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                    format: uuid
                    description: >-
                      ID de la sessió de l'empresa creada per a aquesta
                      recuperació. El registre emmagatzemat (visible a la
                      consola) es continua actualitzant si la consulta al
                      registre mercantil es resol després de la resposta.
                  registry_tier_requested:
                    type: string
                    enum:
                      - basic
                      - shareholders
                      - ubo
                    description: >-
                      El nivell que ven aquest endpoint: `basic` (Lite) per a
                      select, `shareholders`, `ubo`.
                  registry_tier_delivered:
                    type: string
                    enum:
                      - basic
                      - shareholders
                      - ubo
                      - null
                    description: >-
                      El nivell realment lliurat i facturat. És inferior al
                      sol·licitat quan els registres del país no contenen dades
                      de titularitat, quan el registre no té cap registre de
                      titularitat per a aquesta empresa, o quan l'informe resolt
                      d'una sol·licitud `ubo` no designa cap persona física com
                      a titular real.
                    nullable: true
                  kyb_registry:
                    type: object
                    description: Perfil complet de l'empresa al registre.
                    properties:
                      uuid:
                        type: string
                        format: uuid
                        description: ID de Didit per a aquest registre d'empresa.
                      node_id:
                        type: string
                        example: feature_kyb_registry
                      status:
                        type: string
                        enum:
                          - Not Finished
                          - Approved
                          - Declined
                          - In Review
                        description: >-
                          Avaluació de Didit de la comprovació del registre (p.
                          ex., `In Review` quan l'empresa no està activa al
                          registre o no s'han pogut derivar les dades de
                          titularitat).
                      registry_status:
                        type: string
                        nullable: true
                        enum:
                          - active
                          - dissolved
                          - deregistered
                          - see full details
                          - authorised
                          - appointed representative
                          - unauthorised
                          - inactive
                          - no longer authorised
                          - closed
                          - struck off
                          - null
                        description: >-
                          Estat normalitzat de l'empresa tal com l'informa el
                          registre.
                      data_resolved:
                        type: boolean
                        description: >-
                          `true` un cop el registre ha retornat el perfil
                          complet. `false` quan el registre encara estava
                          processant després del sondeig; el registre
                          emmagatzemat es completa automàticament un cop el
                          registre es resol.
                      company_name:
                        type: string
                        example: Tesco PLC
                      registration_number:
                        type: string
                        nullable: true
                        example: '00445790'
                      country_code:
                        type: string
                        description: ISO 3166-1 alpha-2.
                        example: GB
                      region:
                        type: string
                        nullable: true
                        description: >-
                          Codi de subdivisió quan el registre és regional (p.
                          ex. `CA` per a `US-CA`); buit en cas contrari.
                      company_type:
                        type: string
                        nullable: true
                        example: Public Limited Company
                      incorporation_date:
                        type: string
                        format: date
                        nullable: true
                        example: '1947-11-27'
                      registered_address:
                        type: string
                        nullable: true
                        example: >-
                          Tesco House, Shire Park, Kestrel Way, Welwyn Garden
                          City, United Kingdom, AL7 1GA
                      tax_number:
                        type: string
                        nullable: true
                        example: GB412 8925 93
                      risk_level:
                        type: string
                        nullable: true
                        description: >-
                          Nivell de risc notificat pel registre, quan estigui
                          disponible.
                      verification_status:
                        type: string
                        enum:
                          - verified
                          - failed
                          - unknown
                        nullable: true
                        description: >-
                          Estat de verificació entre jurisdiccions: `verified`
                          quan l'estat del registre mercantil estableix vigència
                          (`active`), `failed` quan indica que l'empresa ja no
                          està vigent (per exemple `dissolved`), i altrament
                          `unknown`. `null` per a una empresa que no prové d'un
                          registre mercantil i mentre una selecció encara
                          estigui en `pending`.
                      is_from_registry:
                        type: boolean
                        description: >-
                          Sempre `true` per a aquest endpoint: el perfil s'ha
                          obtingut d'un registre oficial.
                      fetch_status:
                        type: string
                        enum:
                          - pending
                          - resolved
                        description: >-
                          Cicle de vida de l'obtenció del registre. Reflectit
                          per `data_resolved`.
                      alternative_names:
                        type: string
                        nullable: true
                        description: >-
                          Noms alternatius, comercials, anteriors o en l'idioma
                          original de l'empresa com a text, quan s'hagin
                          informat.
                      nature_of_business:
                        type: string
                        nullable: true
                        description: >-
                          Descripció de l'activitat o codi de classificació,
                          quan s'informa.
                      registered_capital:
                        type: string
                        nullable: true
                      registered_capital_amount:
                        type: string
                        nullable: true
                        description: >-
                          Quantitat decimal com a cadena de text, quan
                          s'informa.
                      registered_capital_currency:
                        type: string
                        nullable: true
                        description: Codi ISO 4217, quan es comunica.
                      website:
                        type: string
                        nullable: true
                        example: https://www.tesco.com/
                      email:
                        type: string
                        nullable: true
                        example: customer.service@tesco.co.uk
                      phone:
                        type: string
                        nullable: true
                        example: '03301231688'
                      legal_entity_identifier:
                        type: string
                        nullable: true
                        description: LEI, quan s'hagi informat.
                      location_of_registration:
                        type: string
                        nullable: true
                        description: >-
                          Registre/jurisdicció en què està registrada l'empresa,
                          quan s'hagi notificat.
                      vat_number:
                        type: string
                        nullable: true
                        description: >-
                          Número d'IVA de la UE, quan es recull durant el pas de
                          registre allotjat o s'edita posteriorment. En el
                          moment de la selecció, normalment encara no està
                          establert: la validació de l'IVA i de l'identificador
                          fiscal s'executa quan l'usuari final envia el pas de
                          registre al flux allotjat.
                      vat_validation_status:
                        type: string
                        enum:
                          - valid
                          - invalid
                          - format_valid
                          - invalid_format
                          - could_not_validate
                          - not_applicable
                        description: >-
                          Resultat de la validació del número d'IVA o, si no
                          n'hi ha, del `tax_number`, en enviar al registre.
                          `valid` / `invalid`: determinat pel registre oficial
                          del país (VIES de la UE, Noruega, Suïssa, Brasil,
                          Colòmbia, Costa Rica, Equador, Paraguai; Polònia també
                          pel seu registre intern d'IVA). `format_valid` /
                          `invalid_format`: determinat per les regles de format
                          i dígit de control del país on no es pot consultar cap
                          registre. `could_not_validate`: el registre no estava
                          disponible. `not_applicable`: sense número, un país
                          sense registre o regles, o una sessió de sandbox.
                      vat_validated_number:
                        type: string
                        nullable: true
                        description: >-
                          El número que s'ha comprovat, tal com el coneix la
                          font (per exemple, el número d'IVA derivat d'un SIREN
                          francès o d'un RSIN holandès). `null` quan no s'ha
                          executat cap comprovació.
                      vat_validation_source:
                        type: string
                        nullable: true
                        enum:
                          - eu_vies
                          - pl_vat_white_list
                          - no_brreg
                          - ch_uid_register
                          - br_receita_federal
                          - co_rues
                          - cr_hacienda
                          - ec_sri
                          - py_dnit
                          - format_rules
                          - null
                        description: >-
                          La font que ha determinat `vat_validation_status`: un
                          registre oficial o `format_rules`. `null` quan no s'ha
                          executat cap comprovació.
                      vat_validated_name:
                        type: string
                        nullable: true
                        description: >-
                          Nom registrat amb la font que ha validat el número,
                          quan en revela un. Només s'estableix quan l'estat és
                          `valid`.
                      vat_validated_address:
                        type: string
                        nullable: true
                        description: >-
                          Adreça registrada amb la font que ha validat el
                          número, quan en divulga una. Només s'estableix quan
                          l'estat és `valid`.
                      vat_checked_at:
                        type: string
                        format: date-time
                        nullable: true
                        description: >-
                          Marca de temps de la comprovació. `null` quan no s'ha
                          executat cap comprovació.
                      financial_summary:
                        type: object
                        nullable: true
                        description: >-
                          Detalls sobre accions/capital notificats pel registre
                          (moneda, accions totals, classes d'accions), quan
                          estiguin disponibles.
                      officers:
                        type: array
                        items:
                          type: object
                          properties:
                            uuid:
                              type: string
                              format: uuid
                            name:
                              type: string
                              example: MELISSA BETHELL
                            designation:
                              type: string
                              nullable: true
                              description: >-
                                Denominació en el registre en brut (p. ex.,
                                `Director`, `Secretary`).
                            role:
                              type: string
                              description: >-
                                Rol normalitzat derivat de la designació.
                                Conjunt complet de 17 valors del model;
                                l'anàlisi del registre mercantil en aquest
                                endpoint sol emetre director,
                                non_executive_director, secretary, chairman o
                                company_officer.
                              enum:
                                - director
                                - non_executive_director
                                - secretary
                                - chairman
                                - ubo
                                - shareholder
                                - representative
                                - founder
                                - legal_advisor
                                - authorized_signatory
                                - trustee
                                - beneficiary
                                - company_officer
                                - settlor
                                - protector
                                - investor
                                - other
                            nationality:
                              type: string
                              nullable: true
                            is_active:
                              type: boolean
                              description: >-
                                `false` quan el registre indica que
                                l'administrador ha dimitit.
                            kyc_status:
                              type: string
                              nullable: true
                              enum:
                                - Approved
                                - Declined
                                - Pending
                                - null
                              description: >-
                                Estat d'una sessió de KYC associada, quan se'n
                                va iniciar una per a aquest administrador.
                                `null` en cas contrari.
                            kyc_session_url:
                              type: string
                              nullable: true
                              description: >-
                                URL de verificació de la sessió de KYC
                                associada, quan n'existeix una.
                            first_name:
                              type: string
                              nullable: true
                              description: >-
                                Nom de pila quan el registre el reporta
                                explícitament; no deduït del nom complet.
                            last_name:
                              type: string
                              nullable: true
                              description: >-
                                Cognom quan el registre mercantil l'informa
                                explícitament.
                            address:
                              type: string
                              nullable: true
                              description: >-
                                Adreça de l'administrador notificada pel
                                registre mercantil.
                            appointment_date:
                              type: string
                              nullable: true
                              description: Data en què es va nomenar el directiu.
                              format: date
                            termination_date:
                              type: string
                              nullable: true
                              description: >-
                                Data en què va finalitzar el càrrec, quan s'ha
                                notificat.
                              format: date
                            date_of_birth:
                              type: string
                              nullable: true
                              description: >-
                                Data de naixement completa informada pel
                                registre. Null quan només es coneix l'any o el
                                mes de naixement.
                              format: date
                            date_of_birth_year:
                              type: integer
                              nullable: true
                              minimum: 1
                              maximum: 9999
                              description: >-
                                Any de naixement notificat pel registre, inclòs
                                quan la data completa no està disponible.
                            date_of_birth_month:
                              type: integer
                              nullable: true
                              minimum: 1
                              maximum: 12
                              description: >-
                                Mes de naixement notificat pel registre. Nul
                                quan només es coneix l'any.
                        description: >-
                          Administradors, secretaris i altres càrrecs extrets
                          del registre.
                      beneficial_owners:
                        type: array
                        items:
                          type: object
                          properties:
                            uuid:
                              type: string
                              format: uuid
                            name:
                              type: string
                            first_name:
                              type: string
                              nullable: true
                            last_name:
                              type: string
                              nullable: true
                            entity_type:
                              type: string
                              enum:
                                - person
                                - company
                              description: >-
                                Si el titular és una persona física o una
                                persona jurídica.
                            roles:
                              type: array
                              items:
                                type: string
                              description: Rols normalitzats (p. ex. `ubo`, `shareholder`).
                            ownership_min_shares:
                              type: string
                              nullable: true
                              description: >-
                                Límit inferior del tram de titularitat comunicat
                                pel registre (p. ex., `25%`).
                            ownership_max_shares:
                              type: string
                              nullable: true
                              description: >-
                                Límit superior de la franja de titularitat
                                informada pel registre mercantil.
                            is_active:
                              type: boolean
                            kyc_status:
                              type: string
                              nullable: true
                              enum:
                                - Approved
                                - Declined
                                - Pending
                                - null
                            kyc_session_url:
                              type: string
                              nullable: true
                            effective_ownership_percent:
                              type: number
                              nullable: true
                              description: >-
                                Percentatge de titularitat analitzat (límit
                                màxim, amb alternativa al límit mínim).
                            company_name:
                              type: string
                              nullable: true
                            registration_number:
                              type: string
                              nullable: true
                            country_of_birth:
                              type: string
                              nullable: true
                            email:
                              type: string
                              nullable: true
                            nationality:
                              type: string
                              nullable: true
                            designation:
                              type: string
                              nullable: true
                            voting_min_shares:
                              type: string
                              nullable: true
                            voting_max_shares:
                              type: string
                              nullable: true
                            date_of_birth:
                              type: string
                              nullable: true
                              description: Data de naixement completa quan s'ha informat.
                              format: date
                            appointment_date:
                              type: string
                              nullable: true
                              description: Data de nomenament quan s'ha informat.
                              format: date
                            shareholding:
                              $ref: '#/components/schemas/KYBRegistryShareholding'
                        description: >-
                          Titulars reals / persones amb control significatiu
                          extrets del registre. Pot estar buit quan el registre
                          no exposa la titularitat.
                      addresses:
                        type: array
                        nullable: true
                        description: >-
                          Totes les adreces que indica el registre, en un format
                          canònic. Null si no n'indica cap.
                        items:
                          $ref: '#/components/schemas/KYBRegistryAddress'
                      industries:
                        type: array
                        nullable: true
                        description: >-
                          Les activitats sota les quals el registre classifica
                          l'empresa, en un format canònic. Null si no n'indica
                          cap.
                        items:
                          $ref: '#/components/schemas/KYBRegistryIndustry'
                      accounts:
                        type: object
                        nullable: true
                        additionalProperties: true
                        description: >-
                          Dates de presentació al registre, quan estiguin
                          disponibles. Els informes anuals i les juntes generals
                          utilitzen last_annual_return_date i last_agm_date; són
                          diferents dels comptes financers.
                      registry_data:
                        $ref: '#/components/schemas/KYBRegistryData'
                      user_provided_data:
                        type: object
                        nullable: true
                        description: >-
                          Sempre `null` en aquest endpoint (utilitzat pel flux
                          de KYB allotjat quan els usuaris finals editen dades
                          del registre).
                      confirmed_by_user_at:
                        type: string
                        format: date-time
                        nullable: true
                        description: Sempre `null` en aquest endpoint.
                      last_console_edit_at:
                        type: string
                        format: date-time
                        nullable: true
                        description: >-
                          S'estableix quan un revisor de la consola edita el
                          registre més endavant.
                      is_editable:
                        type: boolean
                        description: >-
                          Si les dades provinents del registre encara es poden
                          editar al flux allotjat o a la consola.
                      registry_tier_delivered:
                        type: string
                        enum:
                          - basic
                          - shareholders
                          - ubo
                          - null
                        description: >-
                          Igual que el `registry_tier_delivered` de nivell
                          superior.
                        nullable: true
                      registry_ownership_status:
                        type: string
                        nullable: true
                        enum:
                          - not_requested
                          - delivered
                          - not_held
                          - unavailable
                          - pending
                          - null
                        description: >-
                          `delivered` quan s'han obtingut les dades de
                          titularitat, `not_held` quan el registre de
                          titularitat ha respost i no llista aquesta empresa
                          (consulta `registry_data.ownership_error`),
                          `unavailable` quan s'ha sol·licitat un nivell de
                          titularitat però el registre no en tenia per a aquesta
                          empresa o no s'ha pogut consultar (consulta
                          `registry_data.ownership_error`), `pending` quan la
                          secció de titularitat encara no s'ha recuperat del
                          registre i Didit encara l'està completant,
                          `not_requested` al nivell Lite.
                      ownership:
                        $ref: '#/components/schemas/KYBRegistryOwnership'
                      registry_tier:
                        type: string
                        nullable: true
                        description: >-
                          El nivell de registre que ha sol·licitat el flux de
                          treball: `basic`, `shareholders` o `ubo`. També a
                          `ownership.tier_requested`.
                      registry_monitoring:
                        type: object
                        nullable: true
                        description: >-
                          El monitor de registre més recent per a l'empresa, o
                          `null` quan no n'existeix cap.
                        properties:
                          uuid:
                            type: string
                            format: uuid
                          status:
                            type: string
                          unavailable_reason:
                            type: string
                            nullable: true
                          enrolled_at:
                            type: string
                            format: date-time
                            nullable: true
                          cancelled_at:
                            type: string
                            format: date-time
                            nullable: true
                          last_bill_date:
                            type: string
                            format: date
                            nullable: true
                          next_bill_date:
                            type: string
                            format: date
                            nullable: true
                          last_event_at:
                            type: string
                            format: date-time
                            nullable: true
                          events_count:
                            type: integer
                          watched_fields:
                            description: Els camps de l'empresa que el monitor supervisa.
                  vendor_data:
                    type: string
                    nullable: true
                    description: Ressò del `vendor_data` que has enviat.
                  metadata:
                    type: object
                    nullable: true
                    description: Ressò de les `metadata` que has enviat.
                  created_at:
                    type: string
                    format: date-time
              examples:
                Resolved company:
                  summary: >-
                    Perfil complet del registre (llista d'administradors
                    truncada per brevetat)
                  value:
                    request_id: 9d4f2c7a-1b3e-4a5c-8d6f-0e9a8b7c6d5e
                    kyb_registry:
                      uuid: f1e2d3c4-b5a6-4789-9c0d-1e2f3a4b5c6d
                      node_id: feature_kyb_registry
                      status: In Review
                      registry_status: active
                      data_resolved: true
                      company_name: Tesco PLC
                      registration_number: '00445790'
                      country_code: GB
                      region: ''
                      company_type: Public Limited Company
                      incorporation_date: '1947-11-27'
                      registered_address: >-
                        Tesco House, Shire Park, Kestrel Way, Welwyn Garden
                        City, United Kingdom, AL7 1GA
                      tax_number: GB412 8925 93
                      risk_level: low risk
                      verification_status: verified
                      is_from_registry: true
                      fetch_status: resolved
                      alternative_names: TESCO STORES (HOLDINGS) PUBLIC LIMITED COMPANY
                      nature_of_business: null
                      registered_capital: null
                      registered_capital_amount: null
                      registered_capital_currency: null
                      website: https://www.tesco.com/
                      email: customer.service@tesco.co.uk
                      phone: '03301231688'
                      legal_entity_identifier: null
                      location_of_registration: null
                      financial_summary:
                        currency: Pound (£)
                        total_number_of_shares: '8174378721'
                        meta_detail:
                          Class_Of_Share: Ordinary
                      officers:
                        - uuid: a1b2c3d4-e5f6-4789-9a0b-1c2d3e4f5a6b
                          name: CHRISTOPHER JON TAYLOR
                          designation: Secretary
                          role: secretary
                          nationality: null
                          is_active: true
                          kyc_status: null
                          kyc_session_url: null
                        - uuid: b2c3d4e5-f6a7-4890-8b1c-2d3e4f5a6b7c
                          name: MELISSA BETHELL
                          designation: Director
                          role: director
                          nationality: British
                          is_active: true
                          kyc_status: null
                          kyc_session_url: null
                      beneficial_owners: []
                      addresses:
                        - address: >-
                            Tesco House, Shire Park, Kestrel Way, Welwyn Garden
                            City, United Kingdom, AL7 1GA
                          type: legal_entity_registry_address
                          description: registered office address
                      industries: null
                      accounts:
                        last_account: 26 February 2025
                        next_account: 26 February 2026
                        due_by_date: 26 August 2026
                      registry_data:
                        ubo_resolution:
                          parent_chain: []
                          subsidiaries: []
                          unresolved: []
                      user_provided_data: null
                      confirmed_by_user_at: null
                      last_console_edit_at: null
                      is_editable: true
                    vendor_data: company-1234
                    metadata: null
                    created_at: '2026-06-11T10:45:00.000000+00:00'
        '202':
          description: >-
            Informe acceptat i encara en processament. Quan un informe encara
            s'està preparant, l'endpoint retorna 202 Accepted,
            kyb_registry.fetch_status=pending i registry_tier_delivered=null.
            Conserva request_id i consulta GET
            /v3/session/{request_id}/decision/ fins que
            registry_checks[0].company.fetch_status estigui resolt. Didit
            completa l'informe automàticament i cobra el nivell lliurat un cop
            estigui a punt. No repeteixis la compra mentre estigui pendent; cada
            nou POST crea una sol·licitud independent.
          content:
            application/json:
              schema:
                $ref: dd5fccbe-6ffa-4e8a-a4f2-7526a23b31ba
              examples:
                Pending (registry still resolving):
                  summary: >-
                    L'informe de titularitat encara s'està processant; recupera
                    la decisió desada
                  value:
                    request_id: 9d4f2c7a-1b3e-4a5c-8d6f-0e9a8b7c6d5e
                    kyb_registry:
                      uuid: 7c0a4f7e-2b1d-4f6a-9c3e-8d5b2a1f0e9d
                      node_id: feature_kyb_registry
                      status: Not Finished
                      registry_status: null
                      data_resolved: false
                      company_name: Example Holdings Limited
                      registration_number: '12345678'
                      country_code: HK
                      region: null
                      company_type: null
                      incorporation_date: null
                      registered_address: null
                      tax_number: null
                      risk_level: null
                      verification_status: null
                      is_from_registry: true
                      fetch_status: pending
                      alternative_names: null
                      nature_of_business: null
                      registered_capital: null
                      registered_capital_amount: null
                      registered_capital_currency: null
                      website: null
                      email: null
                      phone: null
                      legal_entity_identifier: null
                      location_of_registration: null
                      financial_summary: {}
                      officers: []
                      beneficial_owners: []
                      addresses: null
                      industries: null
                      accounts: null
                      registry_data: {}
                      user_provided_data: null
                      confirmed_by_user_at: null
                      last_console_edit_at: null
                      is_editable: true
                      registry_tier_delivered: null
                      registry_ownership_status: pending
                    vendor_data: company-1234
                    metadata: null
                    created_at: '2026-06-11T10:45:00.000000+00:00'
                    registry_tier_delivered: null
                    registry_tier_requested: ubo
        '400':
          description: >-
            Error de validació. Els problemes a nivell de camp utilitzen
            l'embolcall estàndard de DRF.
          content:
            application/json:
              examples:
                Missing kyb_response_id:
                  summary: '`kyb_response_id` és obligatori'
                  value:
                    kyb_response_id:
                      - This field is required.
                save_api_request=false rejected:
                  summary: Les seleccions sempre es conserven
                  value:
                    save_api_request:
                      - >-
                        KYB registry select must be saved so billing and
                        retrieval can be tracked.
        '403':
          description: >-
            Permís denegat. Es retorna quan falta la capçalera `x-api-key`, i
            també quan el saldo de l'organització que fa la crida no pot cobrir
            la crida; una clau incorrecta, revocada o caducada retorna `401`. Si
            falta la clau es retorna `403` amb `{"detail": ...}`; una clau
            incorrecta, revocada o caducada retorna `401`. La manca de crèdit
            retorna `403` amb `{"error": ...}` abans que es produeixi cap
            cribratge o crida al proveïdor.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Sense capçalera `x-api-key`, o la clau no és vàlida/s'ha
                    revocat
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: El saldo de l'organització no pot cobrir la crida
                  value:
                    error: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '429':
          description: >-
            S'ha superat el límit de freqüència. Els endpoints POST/PATCH/DELETE
            comparteixen un pressupost de 300 sol·licituds d'escriptura per
            minut per clau d'API (la creació de transaccions i la ingesta
            d'esdeveniments tenen un pressupost independent de 600). La resposta
            inclou les capçaleres `X-RateLimit-Limit`, `X-RateLimit-Remaining`,
            `X-RateLimit-Reset` i `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Més de 300 sol·licituds d'escriptura en el minut 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/kyb/ubo/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "kyb_response_id": "69aeeb95febb0f1704042259",
                "vendor_data": "company-1234"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.kyb.list_ubos(
                kyb_response_id="69aeeb95febb0f1704042259",
                vendor_data="company-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.kyb.listUbos({
              kyb_response_id: "69aeeb95febb0f1704042259",
              vendor_data: "company-1234",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.KYB.ListUBOs(ctx, didit.KYBRegistryCandidateRequest{\n\tKYBResponseID: \"69aeeb95febb0f1704042259\",\n\tVendorData:    didit.String(\"company-1234\"),\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.KYBRegistryCandidateRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.kyb().listUbos(KYBRegistryCandidateRequest.builder()
                    .kybResponseId("69aeeb95febb0f1704042259")
                    .vendorData("company-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->kyb->listUbos([
                'kyb_response_id' => '69aeeb95febb0f1704042259',
                'vendor_data' => 'company-1234',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.kyb.list_ubos(
              kyb_response_id: "69aeeb95febb0f1704042259",
              vendor_data: "company-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.Kyb.ListUbosAsync(new
            KYBRegistryCandidateRequest

            {
                KybResponseId = "69aeeb95febb0f1704042259",
                VendorData = "company-1234",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    KYBRegistryCandidateRequest:
      type: object
      required:
        - kyb_response_id
      properties:
        kyb_response_id:
          type: string
          maxLength: 1024
          description: >-
            Identificador de candidat de `POST /v3/kyb/search/`
            (`kyb_registry.companies[].kyb_response_id`). Efímer: fes-lo servir
            poc després de la cerca que l'ha generat. Els identificadors poden
            ser llargs, de manera que has d'emmagatzemar i enviar el valor
            exactament com s'ha retornat, sense retallar-lo ni assumir-ne una
            longitud.
          example: 69aeeb95febb0f1704042259
        vendor_data:
          type: string
          description: >-
            El teu identificador per a aquesta empresa; es retorna tal com s'ha
            enviat i s'emmagatzema amb la sessió de l'empresa.
        metadata:
          type: object
          nullable: true
          description: >-
            JSON de format lliure emmagatzemat amb la sessió d'empresa i
            retornat com a resposta.
        save_api_request:
          type: boolean
          default: true
          description: >-
            Ha de ser `true` (per defecte). Les seleccions de registres KYB
            sempre es guarden perquè se'n pugui fer el seguiment de la
            facturació i la recuperació; `false` retorna `400`.
    KYBRegistryShareholding:
      type: object
      nullable: true
      description: >-
        El que posseeix un titular, amb el mateix format per a tots els països i
        fonts de registres mercantils. Null quan el registre indica que no hi ha
        participació. Un interval (per exemple, el 25-50% d'un PSC del Regne
        Unit) no és una participació: `percentage` és null i l'interval es manté
        a `ownership_min_shares` / `ownership_max_shares`.
      properties:
        share_class:
          type: string
          nullable: true
          description: Classe o tipus d'acció tal com l'anomena el registre.
        number_of_shares:
          type: number
          nullable: true
          description: Nombre d'accions posseïdes.
        currency:
          type: string
          nullable: true
          description: Moneda ISO 4217 dels valors següents.
        nominal_value:
          type: number
          nullable: true
          description: Valor nominal per acció.
        total_value:
          type: number
          nullable: true
          description: Valor total de la participació.
        percentage:
          type: number
          nullable: true
          description: Participació exacta en percentatge, amb quatre decimals.
      required:
        - share_class
        - number_of_shares
        - currency
        - nominal_value
        - total_value
        - percentage
    KYBRegistryAddress:
      type: object
      description: >-
        Una adreça que indica el registre, amb el mateix format per a cada país
        i font de registre. Cada clau està sempre present; qualsevol part que el
        registre no publiqui és nul·la.
      properties:
        type:
          type: string
          nullable: true
          description: >-
            Tipus d'adreça en minúscules: `registered` per a la seu social;
            altres tipus segons com els anomena el registre (per exemple,
            `postal`, `office`). `null` quan el registre no indica de quin tipus
            d'adreça es tracta.
        address:
          type: string
          description: L'adreça completa en una sola línia. Sempre present a cada adreça.
        street:
          type: string
          nullable: true
          description: Carrer i número.
        city:
          type: string
          nullable: true
          description: Ciutat o localitat.
        postal_code:
          type: string
          nullable: true
          description: Codi postal.
        region:
          type: string
          nullable: true
          description: Regió, estat o província.
        country_code:
          type: string
          nullable: true
          description: Codi de país ISO 3166-1 alfa-2.
        description:
          type: string
          nullable: true
          description: >-
            L'etiqueta pròpia del registre per a l'adreça, si en proporciona
            una.
      required:
        - type
        - address
        - street
        - city
        - postal_code
        - region
        - country_code
        - description
    KYBRegistryIndustry:
      type: object
      description: >-
        Una activitat sota la qual el registre classifica l'empresa, amb el
        mateix format per a cada país i font de registre.
      properties:
        code:
          type: string
          nullable: true
          description: >-
            Codi d'activitat tal com l'imprimeix el registre (per exemple
            `73110`).
        description:
          type: string
          nullable: true
          description: Etiqueta de l'activitat, quan el registre en publica una.
        scheme:
          type: string
          nullable: true
          description: >-
            Sistema de classificació, un nom per sistema independentment de la
            font que l'hagi informat: `UK SIC 2007`, `US SIC`, `NACE Rev. 2`,
            `NACE Rev. 2.1`, `NAF Rev. 2`, `CNAE`, `SBI`, `NOGA 2008`, `CAE Rev.
            4`, `Canada SIC 1977`; altres sistemes nacionals mantenen el propi
            nom del registre. Null quan el registre no indica el nom del
            sistema.
        is_primary:
          type: boolean
          description: >-
            Cert per a l'activitat principal de l'empresa. Exactament una
            entrada és primària quan la llista no és buida.
      required:
        - code
        - description
        - scheme
        - is_primary
    KYBRegistryData:
      type: object
      nullable: true
      description: >-
        Detall normalitzat del registre mercantil de Didit per a l'empresa: el
        resultat de titularitat (`ownership_error`, `section_errors`,
        `ubo_resolution`, `lite_enrichment`), les correccions fetes amb
        update-data i fets del registre que no tenen un camp propi. Mai conté el
        registre propi de la font registral. Cada clau és opcional i només és
        present quan l'empresa en té un valor; se'n poden afegir de noves.
        Consulta els camps canònics (`addresses`, `industries`, `ownership`,
        `beneficial_owners[].shareholding`) per a tot allò que cobreixen.
      properties:
        company_name:
          type: string
          description: Nom de l'empresa corregit a la consola.
        registration_number:
          type: string
          description: >-
            Número de registre tal com l'indica el registre o una correcció de
            la consola.
        country_code:
          type: string
          description: País del registre segons el registre o una correcció de la consola.
        region:
          type: string
          description: Regió o estat del registre.
        incorporation_date:
          type: string
          description: Data de constitució (ISO 8601).
        registration_date:
          type: string
          description: >-
            Data de registre (ISO 8601) quan el registre n'indica una de
            diferent de la data de constitució.
        dissolution_date:
          type: string
          description: Data de dissolució (ISO 8601) quan el registre en fa constar una.
        tax_number:
          type: string
          description: Identificador fiscal.
        vat_number:
          type: string
          description: Número d'IVA.
        legal_address:
          type: string
          description: Adreça social tal com s'ha corregit a la consola.
        registered_address:
          type: string
          description: Adreça registrada tal com consta al registre.
        company_type:
          type: string
          description: Forma jurídica.
        registry_status:
          type: string
          description: Estat de l'empresa al registre mercantil.
        verification_status:
          type: string
          description: Estat de la verificació.
        alternative_names:
          type: string
          description: Altres noms comercials que l'empresa utilitza o ha utilitzat.
        nature_of_business:
          type: string
          description: Descripció de l'activitat.
        registered_capital:
          type: string
          description: Capital registrat tal com està imprès.
        registered_capital_amount:
          type: string
          description: Import del capital registrat, com a cadena en format decimal.
        registered_capital_currency:
          type: string
          description: Moneda del capital registrat (ISO 4217).
        website:
          type: string
          description: Lloc web.
        email:
          type: string
          description: Correu electrònic de contacte.
        phone:
          type: string
          description: Telèfon de contacte.
        legal_entity_identifier:
          type: string
          description: Identificador d'entitat jurídica (LEI).
        location_of_registration:
          type: string
          description: Lloc de registre.
        control_scheme:
          type: string
          description: Esquema de governança quan el registre l'exposa.
        ownership_error:
          type: string
          enum:
            - no_owners_on_record
            - no_natural_person_owner
            - ownership_section_unavailable
            - company_not_found
            - ambiguous_company_match
            - missing_registration_number
            - entity_type_not_covered
            - provider_unavailable
            - other
          description: >-
            Per què no s'ha lliurat un nivell de titularitat sol·licitat, amb
            els mateixos codis que `ownership.unavailable_reason`.
            `no_owners_on_record` (el registre ha respost i no indica cap
            titular) i `ownership_section_unavailable` (el registre no ha
            retornat la secció de titularitat) són resultats diferents.
        section_errors:
          type: object
          description: >-
            Seccions que el registre no ha retornat, indexades per secció
            (`officers`, `shareholders`, `group_structure`). Una secció llistada
            aquí no s'ha lliurat mai: una llista buida al seu costat no diu res
            sobre l'empresa.
          additionalProperties:
            $ref: '#/components/schemas/KYBRegistrySectionError'
        ubo_resolution:
          $ref: '#/components/schemas/KYBRegistryUboResolution'
        lite_enrichment:
          $ref: '#/components/schemas/KYBRegistryLiteEnrichment'
        registry_metadata:
          type: object
          additionalProperties:
            oneOf:
              - type: string
              - type: number
              - type: boolean
          description: >-
            Els camps propis del registre per a l'empresa, indexats tal com els
            anomena el registre, com a valors plans (registres antics). Només
            s'inclouen els camps revisats com a fets del registre.
        registry_sources:
          type: array
          description: >-
            Els registres oficials dels quals s'ha extret el registre (registres
            antics). No s'indiquen altres fonts.
          items:
            $ref: '#/components/schemas/KYBRegistrySource'
        previous_names:
          type: array
          items:
            type: string
          description: >-
            Noms sota els quals l'empresa estava registrada anteriorment
            (registres històrics).
        parent_companies:
          type: array
          items:
            type: string
          description: Empreses matriu que indica el registre (registres antics).
        documents_available:
          type: integer
          description: >-
            Quants registres ofereix el registre mercantil per a l'empresa
            (registres heretats).
    KYBRegistryOwnership:
      type: object
      description: >-
        El resultat del nivell de titularitat (Accionistes / UBO), amb la
        mateixa estructura per a cada país i font de registre.
      properties:
        status:
          type: string
          nullable: true
          enum:
            - not_requested
            - pending
            - delivered
            - not_held
            - unavailable
            - null
          description: >-
            `delivered` quan el registre ha publicat la titularitat; `not_held`
            quan el registre de titularitat ha respost i no llista en absolut
            l'empresa (consulta `unavailable_reason`); `unavailable` quan no ha
            servit les dades de titularitat per qualsevol altre motiu (consulta
            `unavailable_reason`); `pending` mentre el registre encara les està
            obtenint; `not_requested` per al nivell Basic.
        tier_requested:
          type: string
          nullable: true
          enum:
            - basic
            - shareholders
            - ubo
            - null
          description: El nivell que ha demanat el flux de treball.
        tier_delivered:
          type: string
          nullable: true
          enum:
            - basic
            - shareholders
            - ubo
            - null
          description: >-
            El nivell que ha lliurat el registre (i que es factura). Una
            sol·licitud d'UBO que es respon només amb accionistes directes és
            `shareholders`.
        unavailable_reason:
          type: string
          nullable: true
          enum:
            - no_owners_on_record
            - no_natural_person_owner
            - ownership_section_unavailable
            - company_not_found
            - ambiguous_company_match
            - missing_registration_number
            - entity_type_not_covered
            - provider_unavailable
            - other
            - null
          description: >-
            Per què no s'ha lliurat un nivell de titularitat sol·licitat. Nul
            tret que `status` sigui `unavailable` o `pending`.
        direct_ownership_complete:
          type: boolean
          nullable: true
          description: >-
            Cert quan les participacions declarades dels accionistes directes
            sumen el 100% (dins d'un punt percentual d'arrodoniment); fals quan
            no és així; null quan no s'ha proporcionat la titularitat o no s'ha
            declarat una participació.
        unresolved:
          type: array
          description: >-
            Parts de la cadena de titularitat que el registre no ha pogut
            resoldre, per exemple si no hi ha cap estructura de grup registrada
            per sobre dels propietaris directes.
          items:
            type: object
            properties:
              reason:
                type: string
              section:
                type: string
                nullable: true
      required:
        - status
        - tier_requested
        - tier_delivered
        - unavailable_reason
        - direct_ownership_complete
        - unresolved
    KYBRegistrySectionError:
      type: object
      description: Una secció que el registre no ha retornat.
      properties:
        status_code:
          type: integer
          nullable: true
          description: L'estat que el registre ha respost per a la secció.
      required:
        - status_code
    KYBRegistryUboResolution:
      type: object
      description: >-
        Com ha recorregut el nivell d'UBO la cadena de titularitat per sobre de
        l'empresa.
      properties:
        parent_chain:
          type: array
          description: Matrius corporatives des de la matriu última fins a l'empresa.
          items:
            $ref: '#/components/schemas/KYBRegistryGroupCompany'
        subsidiaries:
          type: array
          description: >-
            Empreses directament subordinades a l'empresa en el seu grup
            empresarial.
          items:
            $ref: '#/components/schemas/KYBRegistryGroupCompany'
        unresolved:
          type: array
          description: >-
            Parts de la cadena que el registre no ha pogut resoldre (les
            mateixes entrades que `ownership.unresolved`).
          items:
            type: object
            properties:
              reason:
                type: string
                description: >-
                  Per què, per exemple `no_group_structure_on_record`,
                  `selected_company_not_in_group_structure` o `section_error`.
              section:
                type: string
                nullable: true
                description: La secció afectada, per exemple `group_structure`.
            required:
              - reason
              - section
      required:
        - parent_chain
        - subsidiaries
        - unresolved
    KYBRegistryLiteEnrichment:
      type: object
      description: >-
        Camps buits del perfil Lite que una altra de les fonts del registre del
        país ha omplert. La font no s'especifica.
      properties:
        fields:
          type: array
          items:
            type: string
          description: Els camps de l'empresa que s'han emplenat.
        people_added:
          type: integer
          description: Quants administradors o titulars reals s'han afegit.
      required:
        - fields
        - people_added
    KYBRegistrySource:
      type: object
      description: >-
        Un registre oficial del qual s'ha extret el registre. Només s'esmenten
        els registres governamentals oficials, els reguladors i el sistema
        oficial d'identificadors; qualsevol altra font s'omet.
      properties:
        name:
          type: string
          description: Nom del registre, per exemple `UK Companies House`.
        source_type:
          type: string
          enum:
            - official
          description: Sempre `official`.
      required:
        - name
        - source_type
    KYBRegistryGroupCompany:
      type: object
      description: Una empresa del grup corporatiu, segons la seva identitat registral.
      properties:
        name:
          type: string
          nullable: true
          description: Nom de l'empresa.
        country_code:
          type: string
          nullable: true
          description: País de registre.
        registration_number:
          type: string
          nullable: true
          description: Número de registre.
      required:
        - name
        - country_code
        - registration_number
  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.