openapi: 3.0.3
info:
  title: API de FANDIT
  version: v2
  description: 'Referencia completa de la API REST de FANDIT: subvenciones, concesiones, usuarios, expertos, clientes, contactos y expedientes.


    **Autenticación — dos tokens distintos:**

    - `Token de usuario`: para el bloque Buscador/Subvenciones (filtros, búsqueda, detalle, concesiones, simuladores, normativa, evaluación, documentos requeridos, relacionadas, chatbot) y para el login propio de usuario (`/users/login/`) y `/users/current/`.

    - `Token de experto`: para el resto de endpoints de gestión (usuarios, clientes, contactos, expedientes) y para `/experts/current/`.


    El prefijo de la cabecera cambia según el tipo de token: `Authorization: Token TU_API_KEY` para token de usuario, `Authorization: ExpertToken TU_API_KEY` para token de experto. Los endpoints de login/registro (`/users/login/`, `/experts/login`, y los de SSO en `/api/v1/users/partners-brand/`) no requieren esta cabecera — el token se obtiene como resultado del login o viaja como parámetro en el body en el caso de los endpoints SSO.


    La mayoría de endpoints del bloque Subvenciones devuelven 403 tanto si falta token como si el usuario no tiene créditos suficientes en su cuenta: conviene tratarlos como casos distintos en la capa de aplicación.'
  contact:
    name: FANDIT
    url: https://www.fandit.es
servers:
- url: https://api.fandit.es
  description: Producción (dominio genérico)
- url: https://{plataforma}.api.fandit.es
  description: 'Marca blanca: sustituye {plataforma} por el subdominio de tu marca.'
  variables:
    plataforma:
      default: tu-marca
      description: Subdominio de tu marca blanca (por ejemplo, tu-marca.api.fandit.es).
tags:
- name: Filtros
- name: Autenticación (legacy / SSO)
- name: Autenticación
- name: Usuarios
- name: Subvenciones
- name: Expedientes
- name: Clientes
- name: Contactos
components:
  securitySchemes:
    UserTokenAuth:
      type: apiKey
      in: header
      name: Authorization
      description: 'Token de usuario. Formato: `Authorization: Token TU_API_KEY`. Se obtiene en POST /users/login/. Necesario para el bloque Buscador/Subvenciones y para /users/current/.'
    ExpertTokenAuth:
      type: apiKey
      in: header
      name: Authorization
      description: 'Token de experto. Formato: `Authorization: ExpertToken TU_API_KEY` (prefijo distinto al token de usuario). Se obtiene en POST /experts/login. Necesario para el resto de endpoints de gestión (usuarios, clientes, contactos, expedientes) y para /experts/current/.'
paths:
  /api/v1/users/partners-brand/check-user/{email}:
    get:
      tags:
      - Autenticación (legacy / SSO)
      summary: Validar correo
      operationId: sso_auth_email_validation
      description: Petición para validar si un correo ya existe en la plataforma.
      security: []
      parameters:
      - name: email
        in: path
        required: true
        description: Correo electrónico a validar.
        schema:
          type: string
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  username:
                    type: string
              example:
                username: laura.gomez
        '400': &id001
          description: Petición inválida (parámetros o formato incorrecto).
        '401': &id002
          description: Falta la cabecera Authorization o el token no es válido.
        '403': &id003
          description: No autorizado (token del tipo incorrecto, o sin créditos suficientes en endpoints que consumen créditos).
        '404': &id004
          description: Recurso no encontrado.
  /api/v1/users/partners-brand/delete-user/:
    delete:
      tags:
      - Autenticación (legacy / SSO)
      summary: Eliminar de usuario
      operationId: sso_users_management_delete_user
      description: Petición para eliminar un usuario registrado.
      security: []
      parameters:
      - name: token
        in: query
        required: true
        description: OTP del usuario.
        schema:
          type: string
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: string
              example: Usuario eliminado correctamente.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v1/users/partners-brand/login/:
    post:
      tags:
      - Autenticación (legacy / SSO)
      summary: Login de usuario
      operationId: sso_auth_log_in
      description: Petición para iniciar sesión de un usuario con su correo y contraseña.
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: Correo electrónico con el que registrar el usuario.
                password:
                  type: string
                  description: Contraseña.
              required:
              - email
              - password
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  otp:
                    type: string
                  uuid:
                    type: string
              example:
                otp: '482913'
                uuid: 3f2504e0-4f89-11d3-9a0c-0305e82c3301
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v1/users/partners-brand/password-change/:
    put:
      tags:
      - Autenticación (legacy / SSO)
      summary: Cambio de contraseña
      operationId: sso_users_management_password_change
      description: Petición para cambiar la contraseña de un usuario ya registrado.
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: Token de usuario.
                password:
                  type: string
                  description: Contraseña.
                password_confirm:
                  type: string
                  description: Confirmación de contraseña.
              required:
              - token
              - password
              - password_confirm
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: string
              example: Contraseña actualizada correctamente.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v1/users/partners-brand/registration/:
    post:
      tags:
      - Autenticación (legacy / SSO)
      summary: Registro de usuarios
      operationId: sso_users_management_registration
      description: Petición para registrar un nuevo usuario en la plataforma.
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                first_name:
                  type: string
                  description: Nombre del usuario.
                last_name:
                  type: string
                  description: Apellido del usuario.
                email:
                  type: string
                  description: Correo electrónico con el que registrar el usuario.
                password1:
                  type: string
                  description: Contraseña.
                password2:
                  type: string
                  description: Confirmación de contraseña.
                platform:
                  type: string
                  description: Plataforma hija, en caso de tener.
                general_notifications:
                  type: boolean
                  description: Recibir notificaciones generales.
              required:
              - first_name
              - email
              - password1
              - password2
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  otp:
                    type: string
                  uuid:
                    type: string
              example:
                otp: '927154'
                uuid: 7c9e6679-7425-40de-944b-e07fc1f90ae7
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/clients/:
    get:
      tags:
      - Clientes
      summary: Listado de clientes
      operationId: v2_customers_list
      description: Petición paginada para obtener todos los clientes que correspondan según el permiso del gestor.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: page
        in: query
        required: true
        description: Página del listado a visualizar.
        schema:
          type: number
      - name: page_size
        in: query
        required: true
        description: Tamaño de la paginación (Obligatorio, máximo 200).
        schema:
          type: number
      - name: order
        in: query
        required: false
        description: Nombre de atributo por el que ordenar los resultados.
        schema:
          type: string
      - name: general_text
        in: query
        required: false
        description: Texto a buscar en todos los campos del cliente.
        schema:
          type: string
      - name: email__contains
        in: query
        required: false
        description: Correo electrónico del cliente.
        schema:
          type: string
      - name: nif__icontains
        in: query
        required: false
        description: NIF/CIF del cliente.
        schema:
          type: string
      - name: reference__icontains
        in: query
        required: false
        description: Referencia del cliente.
        schema:
          type: string
      - name: business_name__icontains
        in: query
        required: false
        description: Nombre o razón social.
        schema:
          type: string
      - name: contacts__icontains
        in: query
        required: false
        description: Contacto del cliente.
        schema:
          type: string
      - name: simulator_check
        in: query
        required: false
        description: Cliente con perfil de solicitante completo.
        schema:
          type: string
      - name: status__in
        in: query
        required: false
        description: Estado del usuario.
        schema:
          type: string
      - name: expert__in
        in: query
        required: false
        description: Mostrar solo mis clientes asignados.
        schema:
          type: array
          items:
            type: integer
      - name: provinces_to_work__id__in
        in: query
        required: false
        description: Provincias de interés del cliente.
        schema:
          type: array
          items:
            type: integer
      - name: applicant_types_v2__id__in
        in: query
        required: false
        description: Tipo de solicitante (mismo espacio de ids que `applicants` en /data-filters/).
        schema:
          type: array
          items:
            type: integer
      - name: province_id__in
        in: query
        required: false
        description: Provincia de la sede.
        schema:
          type: array
          items:
            type: integer
      - name: cnaes__id__in
        in: query
        required: false
        description: CNAE(s) del cliente.
        schema:
          type: array
          items:
            type: integer
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        expert_data:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                            email:
                              type: string
                        experts:
                          type: array
                          items:
                            type: integer
                        public:
                          type: boolean
                        status:
                          type: integer
                        platform_data:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                        nif:
                          type: string
                        business_name:
                          type: string
                        email:
                          type: string
                        phone:
                          type: string
                          nullable: true
                        reference:
                          type: string
                          nullable: true
                        notes:
                          type: string
                          nullable: true
                        province:
                          type: array
                          items:
                            type: integer
                        address:
                          type: string
                        postal_code:
                          type: string
                        location:
                          type: string
                        legal_representative_name:
                          type: string
                        legal_representative_nif:
                          type: string
                        legal_representation_type:
                          type: string
                        contacts:
                          type: string
                        cnaes:
                          type: array
                          items:
                            type: integer
                        provinces_to_work:
                          type: array
                          items:
                            type: integer
                        applicant_types:
                          type: array
                          items:
                            type: integer
                        action_items:
                          type: array
                          items:
                            type: integer
                        employees_quantity:
                          type: integer
                        constitution_date:
                          type: string
                        last_year_billing:
                          type: integer
                        investment_budget:
                          type: integer
                        project_description:
                          type: string
              example:
                count: 128
                next: https://api.fandit.es/api/v2/clients/?page=2&page_size=10
                previous: null
                results:
                - id: 3021
                  expert_data:
                    id: 45
                    name: María Fernández
                    email: maria.fernandez@example.com
                  experts:
                  - 45
                  - 52
                  public: false
                  status: 1
                  platform_data:
                    id: 2
                    name: FANDIT
                  nif: B12345678
                  business_name: Innovatech Soluciones SL
                  email: contacto@example.com
                  phone: null
                  reference: null
                  notes: null
                  province:
                  - 28
                  address: Calle Alcalá 120, 3ºB
                  postal_code: '28009'
                  location: Madrid
                  legal_representative_name: Carlos Ruiz Gómez
                  legal_representative_nif: 12345678Z
                  legal_representation_type: Administrador único
                  contacts: Carlos Ruiz Gómez - 600000001
                  cnaes:
                  - 6201
                  - 6202
                  provinces_to_work:
                  - 28
                  - 8
                  applicant_types:
                  - 1
                  - 3
                  action_items:
                  - 1
                  - 2
                  employees_quantity: 18
                  constitution_date: '2015-03-12'
                  last_year_billing: 850000
                  investment_budget: 120000
                  project_description: Digitalización de procesos internos y desarrollo de nueva plataforma de gestión.
                - id: 3045
                  expert_data:
                    id: 52
                    name: Javier Ortega
                    email: javier.ortega@example.com
                  experts:
                  - 52
                  public: true
                  status: 1
                  platform_data:
                    id: 2
                    name: FANDIT
                  nif: 44556677Q
                  business_name: Panadería Hermanos Soler
                  email: info@example.com
                  phone: null
                  reference: REF-2024-0198
                  notes: Cliente interesado en ayudas de digitalización
                  province:
                  - 8
                  address: Avinguda Diagonal 455
                  postal_code: 08036
                  location: Barcelona
                  legal_representative_name: Marta Soler Puig
                  legal_representative_nif: 87654321X
                  legal_representation_type: Autónomo
                  contacts: Marta Soler Puig - 600000005
                  cnaes:
                  - 1071
                  provinces_to_work:
                  - 8
                  applicant_types:
                  - 2
                  action_items:
                  - 3
                  employees_quantity: 6
                  constitution_date: '2019-07-01'
                  last_year_billing: 210000
                  investment_budget: 35000
                  project_description: Ampliación de obrador y compra de maquinaria.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
    post:
      tags:
      - Clientes
      summary: Crear cliente
      operationId: v2_customers_create
      description: Petición crear un nuevo cliente.
      security:
      - ExpertTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                nif:
                  type: string
                  description: NIF/CIF del cliente.
                business_name:
                  type: string
                  description: Nombre o razón social del cliente.
                email:
                  type: string
                  description: Correo electrónico del cliente.
                phone:
                  type: string
                  description: Teléfono del cliente.
              required:
              - nif
      responses:
        '201':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  expert_data:
                    type: object
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
                      email:
                        type: string
                  experts:
                    type: array
                    items:
                      type: integer
                  public:
                    type: boolean
                  status:
                    type: integer
                  platform_data:
                    type: object
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
                  nif:
                    type: string
                  business_name:
                    type: string
                  email:
                    type: string
                  phone:
                    type: string
                  reference:
                    type: string
                    nullable: true
                  notes:
                    type: string
                    nullable: true
                  province:
                    type: array
                    items: {}
                  address:
                    type: string
                  postal_code:
                    type: string
                  location:
                    type: string
                  legal_representative_name:
                    type: string
                  legal_representative_nif:
                    type: string
                  legal_representation_type:
                    type: string
                  contacts:
                    type: string
                  cnaes:
                    type: array
                    items: {}
                  provinces_to_work:
                    type: array
                    items: {}
                  applicant_types:
                    type: array
                    items: {}
                  action_items:
                    type: array
                    items: {}
                  employees_quantity:
                    type: string
                    nullable: true
                  constitution_date:
                    type: string
                    nullable: true
                  last_year_billing:
                    type: string
                    nullable: true
                  investment_budget:
                    type: string
                    nullable: true
                  project_description:
                    type: string
              example:
                id: 3102
                expert_data:
                  id: 45
                  name: María Fernández
                  email: maria.fernandez@example.com
                experts:
                - 45
                public: false
                status: 1
                platform_data:
                  id: 2
                  name: FANDIT
                nif: B98765432
                business_name: Talleres Mecánicos Rivas SL
                email: admin@example.com
                phone: '600000006'
                reference: null
                notes: null
                province: []
                address: ''
                postal_code: ''
                location: ''
                legal_representative_name: ''
                legal_representative_nif: ''
                legal_representation_type: ''
                contacts: ''
                cnaes: []
                provinces_to_work: []
                applicant_types: []
                action_items: []
                employees_quantity: null
                constitution_date: null
                last_year_billing: null
                investment_budget: null
                project_description: ''
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/clients/share/:
    post:
      tags:
      - Clientes
      summary: Compartir clientes
      operationId: v2_customers_share
      description: Petición para compartir clientes con otros gestores.
      security:
      - ExpertTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                client_ids:
                  type: array
                  items:
                    type: integer
                  description: 'Array de ids de clientes a compartir (Obligatorio, formato: 1, 2, 3).'
                experts:
                  type: array
                  items:
                    type: integer
                  description: 'Array de ids de experts con los que compartir (Obligatorio, formato: 1, 2, 3).'
              required:
              - client_ids
              - experts
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: string
              example:
                response: Se han compartido 3 cliente(s) con 2 experto(s) correctamente.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/clients/{client_id}/:
    get:
      tags:
      - Clientes
      summary: Detalle del cliente
      operationId: v2_customers_detail
      description: Petición para obtener toda la información de una cliente específico.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: client_id
        in: path
        required: true
        description: client_id del cliente a buscar.
        schema:
          type: string
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  expert_data:
                    type: object
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
                      email:
                        type: string
                  experts:
                    type: array
                    items:
                      type: integer
                  public:
                    type: boolean
                  status:
                    type: integer
                  platform_data:
                    type: object
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
                  nif:
                    type: string
                  business_name:
                    type: string
                  email:
                    type: string
                  phone:
                    type: string
                    nullable: true
                  reference:
                    type: string
                    nullable: true
                  notes:
                    type: string
                    nullable: true
                  province:
                    type: array
                    items:
                      type: integer
                  address:
                    type: string
                  postal_code:
                    type: string
                  location:
                    type: string
                  legal_representative_name:
                    type: string
                  legal_representative_nif:
                    type: string
                  legal_representation_type:
                    type: string
                  contacts:
                    type: string
                  cnaes:
                    type: array
                    items:
                      type: integer
                  provinces_to_work:
                    type: array
                    items:
                      type: integer
                  applicant_types:
                    type: array
                    items:
                      type: integer
                  action_items:
                    type: array
                    items:
                      type: integer
                  employees_quantity:
                    type: integer
                  constitution_date:
                    type: string
                  last_year_billing:
                    type: integer
                  investment_budget:
                    type: integer
                  project_description:
                    type: string
              example:
                id: 3021
                expert_data:
                  id: 45
                  name: María Fernández
                  email: maria.fernandez@example.com
                experts:
                - 45
                - 52
                public: false
                status: 1
                platform_data:
                  id: 2
                  name: FANDIT
                nif: B12345678
                business_name: Innovatech Soluciones SL
                email: contacto@example.com
                phone: null
                reference: null
                notes: null
                province:
                - 28
                address: Calle Alcalá 120, 3ºB
                postal_code: '28009'
                location: Madrid
                legal_representative_name: Carlos Ruiz Gómez
                legal_representative_nif: 12345678Z
                legal_representation_type: Administrador único
                contacts: Carlos Ruiz Gómez - 600000001
                cnaes:
                - 6201
                - 6202
                provinces_to_work:
                - 28
                - 8
                applicant_types:
                - 1
                - 3
                action_items:
                - 1
                - 2
                employees_quantity: 18
                constitution_date: '2015-03-12'
                last_year_billing: 850000
                investment_budget: 120000
                project_description: Digitalización de procesos internos y desarrollo de nueva plataforma de gestión.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
    patch:
      tags:
      - Clientes
      summary: Actualizar cliente
      operationId: v2_customers_update
      description: Petición para actualizar los datos de un cliente específico.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: client_id
        in: path
        required: true
        description: Identificador del cliente a actualizar.
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                nif:
                  type: string
                  description: NIF/CIF del cliente.
                business_name:
                  type: string
                  description: Nombre o razón social del cliente.
                email:
                  type: string
                  description: Correo electrónico del cliente.
                phone:
                  type: string
                  description: Teléfono del cliente.
                public:
                  type: boolean
                  description: Cliente disponible para compartir con otros gestores.
                status:
                  type: string
                  description: Estado del usuario.
                address:
                  type: string
                  description: Dirección del cliente.
                postal_code:
                  type: string
                  description: Codigo postal del cliente.
                location:
                  type: string
                  description: Localización del cliente.
                legal_representative_name:
                  type: string
                  description: Nombre de representante legal.
                legal_representative_nif:
                  type: string
                  description: NIF/CIF de representante legal.
                legal_representation_type:
                  type: string
                  description: Tipo de representación legal.
                province:
                  type: number
                  description: Provincia de la sede.
                cnaes:
                  type: array
                  items:
                    type: integer
                  description: CNAE(s) del cliente.
                provinces_to_work:
                  type: array
                  items:
                    type: integer
                  description: Provincias de interés del cliente.
                applicant_types:
                  type: array
                  items:
                    type: integer
                  description: Tipo de solicitante.
                action_items:
                  type: array
                  items:
                    type: integer
                  description: Acciones a llevar a cabo.
                employees_quantity:
                  type: number
                  description: Cantidad de empleados.
                constitution_date:
                  type: string
                  description: Fecha de constitución.
                last_year_billing:
                  type: number
                  description: Facturación anual.
                investment_budget:
                  type: number
                  description: Inversión prevista.
                project_description:
                  type: string
                  description: Descripción del proyecto.
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  expert_data:
                    type: object
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
                      email:
                        type: string
                  experts:
                    type: array
                    items:
                      type: integer
                  public:
                    type: boolean
                  status:
                    type: integer
                  platform_data:
                    type: object
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
                  nif:
                    type: string
                  business_name:
                    type: string
                  email:
                    type: string
                  phone:
                    type: string
                  reference:
                    type: string
                    nullable: true
                  notes:
                    type: string
                    nullable: true
                  province:
                    type: array
                    items:
                      type: integer
                  address:
                    type: string
                  postal_code:
                    type: string
                  location:
                    type: string
                  legal_representative_name:
                    type: string
                  legal_representative_nif:
                    type: string
                  legal_representation_type:
                    type: string
                  contacts:
                    type: string
                  cnaes:
                    type: array
                    items:
                      type: integer
                  provinces_to_work:
                    type: array
                    items:
                      type: integer
                  applicant_types:
                    type: array
                    items:
                      type: integer
                  action_items:
                    type: array
                    items:
                      type: integer
                  employees_quantity:
                    type: integer
                  constitution_date:
                    type: string
                  last_year_billing:
                    type: integer
                  investment_budget:
                    type: integer
                  project_description:
                    type: string
              example:
                id: 3021
                expert_data:
                  id: 45
                  name: María Fernández
                  email: maria.fernandez@example.com
                experts:
                - 45
                - 52
                public: true
                status: 1
                platform_data:
                  id: 2
                  name: FANDIT
                nif: B12345678
                business_name: Innovatech Soluciones SL
                email: contacto@example.com
                phone: '600000007'
                reference: null
                notes: null
                province:
                - 28
                address: Calle Alcalá 120, 3ºB
                postal_code: '28009'
                location: Madrid
                legal_representative_name: Carlos Ruiz Gómez
                legal_representative_nif: 12345678Z
                legal_representation_type: Administrador único
                contacts: Carlos Ruiz Gómez - 600000001
                cnaes:
                - 6201
                - 6202
                provinces_to_work:
                - 28
                - 8
                applicant_types:
                - 1
                - 3
                action_items:
                - 1
                - 2
                employees_quantity: 22
                constitution_date: '2015-03-12'
                last_year_billing: 920000
                investment_budget: 150000
                project_description: Digitalización de procesos internos y desarrollo de nueva plataforma de gestión.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
    delete:
      tags:
      - Clientes
      summary: Eliminar cliente
      operationId: v2_customers_delete
      description: Petición un cliente en específico.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: client_id
        in: path
        required: true
        description: Id del cliente.
        schema:
          type: string
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  Response:
                    type: string
              example:
                Response: Cliente eliminado correctamente.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/crm/fund-dashboard-data/:
    get:
      tags:
      - Subvenciones
      summary: Dashboard de subvenciones agregadas
      operationId: v2_crm_fund_dashboard_data
      description: 'Petición para obtener estadísticas agregadas de convocatorias activas (conteo e importe total) agrupadas por distintas dimensiones (comunidades, provincias, actividades, tipos de solicitante, tipos de convocatoria, acciones, orígenes y ámbito territorial) y por ventana temporal (día, semana, mes), dentro de un rango de fechas de alta de la convocatoria. Pensado para alimentar paneles/dashboards internos, no para el buscador de convocatorias en sí (para eso usa GET /funds/). La respuesta no está paginada.'
      security:
      - UserTokenAuth: []
      - ExpertTokenAuth: []
      parameters:
      - name: requestData
        in: query
        required: true
        description: Objeto de filtros serializado como JSON. Debe incluir como mínimo start_date y end_date.
        schema:
          type: object
          properties:
            start_date:
              type: string
              format: date
              description: Fecha de alta de la convocatoria, inicio de rango. Formato YYYY-MM-DD.
            end_date:
              type: string
              format: date
              description: Fecha de alta de la convocatoria, fin de rango. Formato YYYY-MM-DD.
            communities:
              type: array
              items:
                type: integer
              description: IDs de comunidad autónoma.
            provinces:
              type: array
              items:
                type: integer
              description: IDs de provincia.
            applicants_v2:
              type: array
              items:
                type: integer
              description: IDs de tipo de solicitante (mismo espacio de ids que `applicants` en /data-filters/).
            activities_v2:
              type: array
              items:
                type: integer
              description: IDs de actividad/sector.
            actions_v2:
              type: array
              items:
                type: integer
              description: IDs de acción/línea de ayuda.
            types:
              type: array
              items:
                type: integer
              description: IDs de tipo de convocatoria.
            region_types:
              type: array
              items:
                type: integer
              description: IDs de ámbito territorial.
            origins:
              type: array
              items:
                type: integer
              description: IDs de origen de fondos.
            order_by:
              type: string
              description: Campo de ordenación de los resultados agrupados (por defecto `count`).
          required:
          - start_date
          - end_date
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: object
                    description: 'Objeto con una clave por dimensión (communities, provinces, activities_v2, applicant_types_v2, types, actions_v2, origins), cada una con la forma {months, weeks, days, globals}, más los agregados globales total, total_amount, values y region_types.'
              example:
                results:
                  communities:
                    months:
                    - label: '2026-01-01 - 2026-01-31'
                      count: 42
                      total: 15000000
                    weeks: []
                    days: []
                    globals:
                    - communities: 13
                      name: Comunidad de Madrid
                      count: 42
                      total: 15000000
                  provinces:
                    months: []
                    weeks: []
                    days: []
                    globals: []
                  activities_v2:
                    months: []
                    weeks: []
                    days: []
                    globals: []
                  applicant_types_v2:
                    months: []
                    weeks: []
                    days: []
                    globals: []
                  types:
                    months: []
                    weeks: []
                    days: []
                    globals: []
                  actions_v2:
                    months: []
                    weeks: []
                    days: []
                    globals: []
                  origins:
                    months: []
                    weeks: []
                    days: []
                    globals: []
                  total: 42
                  total_amount:
                    total_amount: 15000000
                  values:
                    days: []
                    weeks: []
                    months: []
                  region_types:
                  - region_type: 1
                    count: 42
                    total: 15000000
                    name: Nacional
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/data-filters/:
    get:
      tags:
      - Filtros
      summary: Filtros generales
      operationId: data_filters
      description: 'Devuelve el catálogo completo de valores de referencia usados por el resto de endpoints: tipos de solicitante, actividades/sectores, comunidades autónomas y provincias (con provinces anidadas), líneas de crédito, orígenes de fondos, tipos de ayuda, CNAEs, grupos de acción, etc. Cada elemento trae su id, que es el que hay que usar como filtro en los demás endpoints. Los ids devueltos aquí bajo applicants, activities y actions son compatibles con los campos applicants_v2/activities_v2/actions_v2 usados en /funds/ y /funds/concessions/ (mismo espacio de ids, a pesar de la diferencia de nombre). No consume créditos, solo requiere token de usuario.'
      security:
      - UserTokenAuth: []
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  action_items:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                        action_groups:
                          type: array
                          items:
                            type: object
                            properties:
                              name:
                                type: string
                              action_items:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    id:
                                      type: integer
                                    name:
                                      type: string
                  activities:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  applicants:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  cnaes:
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                        code2009:
                          type: string
                        id:
                          type: integer
                        title:
                          type: string
                  communities:
                    type: array
                    items:
                      type: object
                      properties:
                        action:
                          type: string
                        code:
                          type: string
                        country:
                          type: integer
                        id:
                          type: integer
                        name:
                          type: string
                        provinces:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                              name:
                                type: string
                  credits:
                    type: array
                    items:
                      type: object
                      properties:
                        description:
                          type: string
                        id:
                          type: integer
                        name:
                          type: string
                  groups:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  origins:
                    type: array
                    items:
                      type: object
                      properties:
                        action:
                          type: string
                        id:
                          type: integer
                        name:
                          type: string
                  provinces:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  regions_types:
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: integer
                        id:
                          type: integer
                        name:
                          type: string
                  types_fund:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  user_profile:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
              example:
                action_items:
                - name: Digitalización
                  action_groups:
                  - name: Transformación digital
                    action_items:
                    - id: 1
                      name: Implantación de ERP
                    - id: 2
                      name: Comercio electrónico
                activities:
                - id: 4
                  name: Industria manufacturera
                - id: 6
                  name: Energías renovables
                applicants:
                - id: 1
                  name: Autónomo
                - id: 2
                  name: Pyme
                cnaes:
                - code: '4321'
                  code2009: '4321'
                  id: 4321
                  title: Instalaciones eléctricas
                communities:
                - action: update
                  code: MD
                  country: 1
                  id: 13
                  name: Comunidad de Madrid
                  provinces:
                  - id: 28
                    name: Madrid
                credits:
                - description: Línea ICO Empresas y Emprendedores
                  id: 1
                  name: ICO Empresas
                groups:
                - id: 1
                  name: Administradores
                - id: 2
                  name: Gestores
                origins:
                - action: update
                  id: 1
                  name: Fondos Next Generation EU
                provinces:
                - id: 28
                  name: Madrid
                - id: 46
                  name: Valencia
                regions_types:
                - code: 1
                  id: 1
                  name: Objetivo Transición Justa
                types_fund:
                - id: 1
                  name: Subvención
                - id: 2
                  name: Préstamo
                user_profile:
                - id: 1
                  name: Básico
                - id: 2
                  name: Pro
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/experts/available-experts/:
    get:
      tags:
      - Expedientes
      summary: Gestores disponibles
      operationId: v2_workflow_experts_list
      description: Petición para obtener todos los gestores con los que se puede compartir o asignar expedientes y clientes.
      security:
      - ExpertTokenAuth: []
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    nullable: true
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        email:
                          type: string
                        first_name:
                          type: string
                        last_name:
                          type: string
              example:
                count: 3
                next: null
                previous: null
                results:
                - id: 12
                  email: javier.ortega@example.com
                  first_name: Javier
                  last_name: Ortega
                - id: 34
                  email: marta.sanchez@example.com
                  first_name: Marta
                  last_name: Sánchez
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/experts/current/:
    get:
      tags:
      - Autenticación
      summary: Current de experto
      operationId: v2_auth_current_expert
      description: Petición para obtener toda la información del expert logueado.
      security:
      - ExpertTokenAuth: []
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  first_name:
                    type: string
                  last_name:
                    type: string
                  username:
                    type: string
                  phone:
                    type: string
                  business_name:
                    type: string
                  profile_avatar:
                    type: string
                  profile_avatar_thumbnail:
                    type: string
                  communities:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  provinces:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  actions:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  action_items:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  applicant_types:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  fund_types:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  region_types:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  activities:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  expert_types:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  solution_types:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                  is_super_expert:
                    type: boolean
                  groups:
                    type: array
                    items:
                      type: string
                  permissions:
                    type: array
                    items: {}
                  active_custom_forms:
                    type: integer
                  marketplace_membership:
                    type: object
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
                      funds_limit:
                        type: integer
                      leads_limit:
                        type: integer
                      leads_etg:
                        type: boolean
                      priority:
                        type: integer
                  integrations:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        extension_name:
                          type: string
                        handler_name:
                          type: string
                        url_api:
                          type: string
                          nullable: true
                        created_at:
                          type: string
                        updated_at:
                          type: string
                        is_active:
                          type: boolean
                        extension:
                          type: integer
                  platforms_with_billing_access:
                    type: array
                    items:
                      type: string
                  marketplace_partners_info:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                        schema:
                          type: string
                        url:
                          type: string
                  email:
                    type: string
                  website:
                    type: string
                  contact_email:
                    type: string
                  profile_image:
                    type: string
                  title:
                    type: string
                  experience:
                    type: string
                  services:
                    type: string
                  areas:
                    type: string
                  extra_info:
                    type: string
                  marketplace_visibility:
                    type: boolean
                  marketplace_name:
                    type: string
                  slug:
                    type: string
                  assessment:
                    type: integer
                  status:
                    type: integer
                  daily_downloaded_instructions:
                    type: array
                    items:
                      type: integer
                  monthly_downloaded_instructions:
                    type: array
                    items:
                      type: integer
                  custom_forms_available:
                    type: integer
                  access_ecosystem:
                    type: integer
                  partners_with_user:
                    type: array
                    items:
                      type: string
                  workflow_funds:
                    type: array
                    items:
                      type: integer
              example:
                id: 542
                first_name: Carlos
                last_name: Ruiz
                username: carlos.ruiz
                phone: '+34600000005'
                business_name: Consultora Ayudas y Subvenciones S.L.
                profile_avatar: https://fandit-media.s3.amazonaws.com/experts/avatars/542.jpg
                profile_avatar_thumbnail: https://fandit-media.s3.amazonaws.com/experts/avatars/542_thumb.jpg
                communities:
                - id: 1
                  name: Andalucía
                - id: 13
                  name: Madrid
                provinces:
                - id: 28
                  name: Madrid
                - id: 41
                  name: Sevilla
                actions:
                - id: 3
                  name: Digitalización
                - id: 7
                  name: Internacionalización
                action_items:
                - id: 12
                  name: Implantación de ERP
                applicant_types:
                - id: 2
                  name: Pyme
                fund_types:
                - id: 1
                  name: Subvención
                - id: 4
                  name: Préstamo
                region_types:
                - id: 1
                  name: Nacional
                activities:
                - id: 15
                  name: Industria
                expert_types:
                - id: 2
                  name: Consultoría
                solution_types:
                - id: 1
                  name: Gestión de ayudas
                is_super_expert: true
                groups:
                - Expert
                permissions: []
                active_custom_forms: 4
                marketplace_membership:
                  id: 2
                  name: Premium
                  funds_limit: 50
                  leads_limit: 20
                  leads_etg: true
                  priority: 1
                integrations:
                - id: 9
                  extension_name: CRM Sync
                  handler_name: crm_sync_handler
                  url_api: null
                  created_at: '2025-02-10T09:30:00Z'
                  updated_at: '2026-06-15T11:12:00Z'
                  is_active: true
                  extension: 3
                platforms_with_billing_access:
                - FANDIT
                marketplace_partners_info:
                - name: FANDIT Marketplace
                  schema: https
                  url: marketplace.fandit.es
                email: carlos.ruiz@example.com
                website: https://consultora-ayudas.es
                contact_email: contacto@example.com
                profile_image: https://fandit-media.s3.amazonaws.com/experts/profile/542.jpg
                title: Consultor senior en subvenciones públicas
                experience: Más de 10 años gestionando ayudas y subvenciones para pymes.
                services: Diagnóstico de ayudas, tramitación y justificación de subvenciones.
                areas: Digitalización, Internacionalización, I+D+i
                extra_info: Colegiado en el Colegio de Economistas de Madrid.
                marketplace_visibility: true
                marketplace_name: Consultora Ayudas y Subvenciones
                slug: consultora-ayudas-y-subvenciones
                assessment: 5
                status: 1
                daily_downloaded_instructions:
                - 12
                - 8
                - 15
                monthly_downloaded_instructions:
                - 340
                - 298
                custom_forms_available: 6
                access_ecosystem: 1
                partners_with_user:
                - FANDIT
                workflow_funds:
                - 101
                - 102
                - 205
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/experts/login:
    post:
      tags:
      - Autenticación
      summary: Login de experto
      operationId: v2_auth_expert_log_in
      description: Petición para obtener el token de experto.
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: Correo electrónico con el que registrar el usuario.
                password:
                  type: string
                  description: Contraseña.
              required:
              - email
              - password
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  token:
                    type: string
                  expert:
                    type: object
                    properties:
                      id:
                        type: integer
                      first_name:
                        type: string
                      last_name:
                        type: string
                      username:
                        type: string
                      phone:
                        type: string
                      business_name:
                        type: string
                      profile_avatar:
                        type: string
                      profile_avatar_thumbnail:
                        type: string
                      communities:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                      provinces:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                      actions:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                      action_items:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                      applicant_types:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                      fund_types:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                      region_types:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                      activities:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                      expert_types:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                      solution_types:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                      is_super_expert:
                        type: boolean
                      groups:
                        type: array
                        items:
                          type: string
                      permissions:
                        type: array
                        items: {}
                      active_custom_forms:
                        type: integer
                      marketplace_membership:
                        type: object
                        properties:
                          id:
                            type: integer
                          name:
                            type: string
                          funds_limit:
                            type: integer
                          leads_limit:
                            type: integer
                          leads_etg:
                            type: boolean
                          priority:
                            type: integer
                      integrations:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                            extension_name:
                              type: string
                            handler_name:
                              type: string
                            url_api:
                              type: string
                              nullable: true
                            created_at:
                              type: string
                            updated_at:
                              type: string
                            is_active:
                              type: boolean
                            extension:
                              type: integer
                      platforms_with_billing_access:
                        type: array
                        items:
                          type: string
                      marketplace_partners_info:
                        type: array
                        items:
                          type: object
                          properties:
                            name:
                              type: string
                            schema:
                              type: string
                            url:
                              type: string
                      email:
                        type: string
                      website:
                        type: string
                      contact_email:
                        type: string
                      profile_image:
                        type: string
                      title:
                        type: string
                      experience:
                        type: string
                      services:
                        type: string
                      areas:
                        type: string
                      extra_info:
                        type: string
                      marketplace_visibility:
                        type: boolean
                      marketplace_name:
                        type: string
                      slug:
                        type: string
                      assessment:
                        type: integer
                      status:
                        type: integer
                      daily_downloaded_instructions:
                        type: array
                        items:
                          type: integer
                      monthly_downloaded_instructions:
                        type: array
                        items:
                          type: integer
                      custom_forms_available:
                        type: integer
                      access_ecosystem:
                        type: integer
                      partners_with_user:
                        type: array
                        items:
                          type: string
                      workflow_funds:
                        type: array
                        items:
                          type: integer
              example:
                token: EXPERT_TOKEN_DE_EJEMPLO
                expert:
                  id: 542
                  first_name: Carlos
                  last_name: Ruiz
                  username: carlos.ruiz
                  phone: '+34600000005'
                  business_name: Consultora Ayudas y Subvenciones S.L.
                  profile_avatar: https://fandit-media.s3.amazonaws.com/experts/avatars/542.jpg
                  profile_avatar_thumbnail: https://fandit-media.s3.amazonaws.com/experts/avatars/542_thumb.jpg
                  communities:
                  - id: 1
                    name: Andalucía
                  - id: 13
                    name: Madrid
                  provinces:
                  - id: 28
                    name: Madrid
                  - id: 41
                    name: Sevilla
                  actions:
                  - id: 3
                    name: Digitalización
                  - id: 7
                    name: Internacionalización
                  action_items:
                  - id: 12
                    name: Implantación de ERP
                  applicant_types:
                  - id: 2
                    name: Pyme
                  fund_types:
                  - id: 1
                    name: Subvención
                  - id: 4
                    name: Préstamo
                  region_types:
                  - id: 1
                    name: Nacional
                  activities:
                  - id: 15
                    name: Industria
                  expert_types:
                  - id: 2
                    name: Consultoría
                  solution_types:
                  - id: 1
                    name: Gestión de ayudas
                  is_super_expert: true
                  groups:
                  - Expert
                  permissions: []
                  active_custom_forms: 4
                  marketplace_membership:
                    id: 2
                    name: Premium
                    funds_limit: 50
                    leads_limit: 20
                    leads_etg: true
                    priority: 1
                  integrations:
                  - id: 9
                    extension_name: CRM Sync
                    handler_name: crm_sync_handler
                    url_api: null
                    created_at: '2025-02-10T09:30:00Z'
                    updated_at: '2026-06-15T11:12:00Z'
                    is_active: true
                    extension: 3
                  platforms_with_billing_access:
                  - FANDIT
                  marketplace_partners_info:
                  - name: FANDIT Marketplace
                    schema: https
                    url: marketplace.fandit.es
                  email: carlos.ruiz@example.com
                  website: https://consultora-ayudas.es
                  contact_email: contacto@example.com
                  profile_image: https://fandit-media.s3.amazonaws.com/experts/profile/542.jpg
                  title: Consultor senior en subvenciones públicas
                  experience: Más de 10 años gestionando ayudas y subvenciones para pymes.
                  services: Diagnóstico de ayudas, tramitación y justificación de subvenciones.
                  areas: Digitalización, Internacionalización, I+D+i
                  extra_info: Colegiado en el Colegio de Economistas de Madrid.
                  marketplace_visibility: true
                  marketplace_name: Consultora Ayudas y Subvenciones
                  slug: consultora-ayudas-y-subvenciones
                  assessment: 5
                  status: 1
                  daily_downloaded_instructions:
                  - 12
                  - 8
                  - 15
                  monthly_downloaded_instructions:
                  - 340
                  - 298
                  custom_forms_available: 6
                  access_ecosystem: 1
                  partners_with_user:
                  - FANDIT
                  workflow_funds:
                  - 101
                  - 102
                  - 205
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/forms/:
    get:
      tags:
      - Expedientes
      summary: Listado de expedientes
      operationId: v2_workflow_list
      description: Petición paginada para obtener todos los expedientes creados.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: page
        in: query
        required: true
        description: Página del listado a visualizar.
        schema:
          type: number
      - name: page_size
        in: query
        required: true
        description: Tamaño de la paginación.
        schema:
          type: number
      - name: isActive
        in: query
        required: false
        description: Mostrar solo los expedientes activos o no.
        schema:
          type: number
      - name: general_text
        in: query
        required: false
        description: Texto a buscar en todos los campos del expediente.
        schema:
          type: string
      - name: guest_email
        in: query
        required: false
        description: Correo electrónico del solicitante.
        schema:
          type: string
      - name: guest_name
        in: query
        required: false
        description: Cliente o razón social.
        schema:
          type: string
      - name: client_name
        in: query
        required: false
        description: contacto del expediente.
        schema:
          type: string
      - name: status
        in: query
        required: false
        description: Estado del expediente.
        schema:
          type: string
      - name: sub_status
        in: query
        required: false
        description: Subestado del expediente.
        schema:
          type: string
      - name: start_date
        in: query
        required: false
        description: Fecha de creación (inicio de rango).
        schema:
          type: string
      - name: end_date
        in: query
        required: false
        description: Fecha de creación (fin de rango).
        schema:
          type: string
      - name: expert_name
        in: query
        required: false
        description: Nombre del gestor.
        schema:
          type: string
      - name: fund_title
        in: query
        required: false
        description: Título del expediente.
        schema:
          type: string
      - name: reference
        in: query
        required: false
        description: Referencia del expediente.
        schema:
          type: string
      - name: concession_date_start
        in: query
        required: false
        description: Fecha de concesión (inicio de rango).
        schema:
          type: string
      - name: concession_date_end
        in: query
        required: false
        description: Fecha de concesión (fin de rango).
        schema:
          type: string
      - name: presentation_date_start
        in: query
        required: false
        description: Fecha de presentación (inicio de rango).
        schema:
          type: string
      - name: presentation_date_end
        in: query
        required: false
        description: Fecha de presentación (fin de rango).
        schema:
          type: string
      - name: requested_amount_min
        in: query
        required: false
        description: Monto solicitado (inicio de rango).
        schema:
          type: string
      - name: requested_amount_max
        in: query
        required: false
        description: Monto solicitado (fin de rango).
        schema:
          type: string
      - name: awarded_amount_min
        in: query
        required: false
        description: Monto concedido (inicio de rango).
        schema:
          type: string
      - name: awarded_amount_max
        in: query
        required: false
        description: Monto concedido (fin de rango).
        schema:
          type: string
      - name: my_workflows
        in: query
        required: false
        description: Mostrar solo los expediente asignados al experto logueado.
        schema:
          type: boolean
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        identifier:
                          type: string
                        uuid:
                          type: string
                        title:
                          type: string
                        client_data:
                          type: object
                          properties:
                            id:
                              type: integer
                            business_name:
                              type: string
                            email:
                              type: string
                            nif:
                              type: string
                        expert_data:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                            email:
                              type: string
                        company:
                          type: string
                        phone:
                          type: string
                        platform:
                          type: string
                        reference:
                          type: string
                        additional_data:
                          type: string
                        status_group:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                        current_status:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                        requested_amount:
                          type: integer
                        awarded_amount:
                          type: string
                          nullable: true
                        presentation_date:
                          type: string
                        concession_date:
                          type: string
                          nullable: true
                        shared_client:
                          type: boolean
              example:
                count: 128
                next: https://api.fandit.es/api/v2/forms/?page=2&page_size=10
                previous: null
                results:
                - id: 4521
                  identifier: EXP-2026-04521
                  uuid: a1b2c3d4-5e6f-4a1b-8c9d-0e1f2a3b4c5d
                  title: Ayuda Kit Digital - Segmento III
                  client_data:
                    id: 982
                    business_name: Innovaciones Digitales SL
                    email: contacto@example.com
                    nif: B12345678
                  expert_data:
                    id: 34
                    name: Marta Sánchez
                    email: marta.sanchez@example.com
                  company: Innovaciones Digitales SL
                  phone: '600000002'
                  platform: fandit
                  reference: REF-2026-0088
                  additional_data: Solicitud vinculada a la convocatoria Kit Digital 2026
                  status_group:
                    id: 2
                    name: En trámite
                  current_status:
                    id: 5
                    name: Pendiente de documentación
                  requested_amount: 12000
                  awarded_amount: null
                  presentation_date: '2026-03-14'
                  concession_date: null
                  shared_client: true
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
    post:
      tags:
      - Expedientes
      summary: Crear expediente
      operationId: v2_workflow_create
      description: Petición crear un nuevo expediente.
      security:
      - ExpertTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                template_id:
                  type: number
                  description: Id de plantilla de expediente.
                title:
                  type: string
                  description: Título del nuevo expediente.
                shared_client:
                  type: boolean
                  description: Compartir los datos del solicitante.
                expert_id:
                  type: number
                  description: Id del gestor asignado.
                client:
                  type: number
                  description: Id del cliente asignado.
                applicant_additional_data:
                  type: string
                  description: Nº Expediente (información adicional).
                applicant_reference:
                  type: string
                  description: Referencia.
              required:
              - title
              - client
      responses:
        '201':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  workflow_id:
                    type: integer
                  exist_applicant:
                    type: boolean
                  uuid:
                    type: string
              example:
                workflow_id: 4837
                exist_applicant: true
                uuid: f3a1b2c4-6d7e-4f8a-9b0c-1d2e3f4a5b6c
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/forms/expert-assign/:
    post:
      tags:
      - Expedientes
      summary: Asignar expedientes a un gestor
      operationId: v2_workflow_asign_workflow_to_expert
      description: Petición para asignarle un mismo gestor a expedientes de forma masiva.
      security:
      - ExpertTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                workflows:
                  type: array
                  items:
                    type: integer
                  description: Array de ids de expedientes a actualizar.
                expert_id:
                  type: number
                  description: Id del experto a asignar.
              required:
              - workflows
              - expert_id
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: string
              example:
                response: Se han asignado 3 expedientes al gestor seleccionado.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/forms/list-import/:
    post:
      tags:
      - Expedientes
      summary: Importar expedientes
      operationId: v2_workflow_import_workflows
      description: Petición para importar expedientes de forma masiva a partir de un excel.
      security:
      - ExpertTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                  description: Archivo con expedientes a importar.
              required:
              - file
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: string
              example:
                response: Se han importado 12 expedientes correctamente.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/forms/status-groups-list/:
    get:
      tags:
      - Expedientes
      summary: Estados y subestados de expedientes
      operationId: v2_workflow_stats_and_subs
      description: Petición paginada para obtener todos los posibles estados y subestados que puede tener un expediente, y poder seleccionarlos al momento de crear uno.
      security:
      - ExpertTokenAuth: []
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    nullable: true
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                        status:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                              initial_state:
                                type: boolean
                              name:
                                type: string
                              template:
                                type: integer
              example:
                count: 6
                next: null
                previous: null
                results:
                - id: 1
                  name: En trámite
                  status:
                  - id: 1
                    initial_state: true
                    name: Pendiente de documentación
                    template: 1
                  - id: 2
                    initial_state: false
                    name: En revisión
                    template: 1
                - id: 2
                  name: Concedido
                  status:
                  - id: 3
                    initial_state: false
                    name: Concedido - pendiente de justificación
                    template: 1
                  - id: 4
                    initial_state: false
                    name: Justificado
                    template: 1
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/forms/update-status/:
    post:
      tags:
      - Expedientes
      summary: Actualizar estados y subestados de expedientes
      operationId: v2_workflow_update_stats_and_subs
      description: Petición para actualizar el estado de expedientes de forma masiva.
      security:
      - ExpertTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                workflows:
                  type: array
                  items:
                    type: integer
                  description: Array de ids de expedientes a actualizar.
                new_status_group:
                  type: number
                  description: Estado del expediente.
                new_status:
                  type: number
                  description: Subestado del expediente.
                observation:
                  type: string
                  description: Nota de observación.
              required:
              - workflows
              - new_status_group
              - new_status
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: string
              example:
                response: Se han actualizado 3 expedientes correctamente.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/forms/update/:
    post:
      tags:
      - Expedientes
      summary: Eliminar, archivar o restaurar expedientes
      operationId: v2_workflow_update_archive_delete
      description: Petición para eliminar, archivar o restaurar expedientes de forma masiva.
      security:
      - ExpertTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                workflows:
                  type: array
                  items:
                    type: integer
                  description: Array de ids de expedientes a actualizar.
                action:
                  type: string
                  description: Acción a llevar a cabo (Eliminar, archivar, desarchivar).
              required:
              - workflows
              - action
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: string
              example:
                response: Se han archivado 3 expedientes correctamente.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/forms/{workflow_id}/:
    get:
      tags:
      - Expedientes
      summary: Detalle de un expediente
      operationId: v2_workflow_detail
      description: Petición para obtener toda la información de un expediente específico.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: workflow_id
        in: path
        required: true
        description: Id del expediente a buscar.
        schema:
          type: string
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  identifier:
                    type: string
                  uuid:
                    type: string
                  title:
                    type: string
                  client_data:
                    type: object
                    properties:
                      id:
                        type: integer
                      business_name:
                        type: string
                      email:
                        type: string
                      nif:
                        type: string
                  expert_data:
                    type: object
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
                      email:
                        type: string
                  company:
                    type: string
                  phone:
                    type: string
                  platform:
                    type: string
                  reference:
                    type: string
                  additional_data:
                    type: string
                  status_group:
                    type: object
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
                  current_status:
                    type: object
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
                  requested_amount:
                    type: integer
                  awarded_amount:
                    type: string
                    nullable: true
                  presentation_date:
                    type: string
                  concession_date:
                    type: string
                    nullable: true
                  shared_client:
                    type: boolean
              example:
                id: 4521
                identifier: EXP-2026-04521
                uuid: a1b2c3d4-5e6f-4a1b-8c9d-0e1f2a3b4c5d
                title: Ayuda Kit Digital - Segmento III
                client_data:
                  id: 982
                  business_name: Innovaciones Digitales SL
                  email: contacto@example.com
                  nif: B12345678
                expert_data:
                  id: 34
                  name: Marta Sánchez
                  email: marta.sanchez@example.com
                company: Innovaciones Digitales SL
                phone: '600000002'
                platform: fandit
                reference: REF-2026-0088
                additional_data: Solicitud vinculada a la convocatoria Kit Digital 2026
                status_group:
                  id: 2
                  name: En trámite
                current_status:
                  id: 5
                  name: Pendiente de documentación
                requested_amount: 12000
                awarded_amount: null
                presentation_date: '2026-03-14'
                concession_date: null
                shared_client: true
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/fund-details/{identifier}/:
    get:
      tags:
      - Subvenciones
      summary: Detalles de una subvención
      operationId: v2_funds_detail
      description: 'Detalle completo de una convocatoria activa. Acepta como identificador el id numérico o el slug de la convocatoria (el slug se normaliza a minúsculas). Este endpoint solo cubre convocatorias activas: una convocatoria histórica o ya resuelta devuelve 404 aunque el identificador sea válido; para consultar esas, usa /funds/concessions/ o /funds/concessions/beneficiaries*. Para preguntas sobre cómo aumentar las probabilidades de éxito de una solicitud, combina este endpoint con fund-evaluation y fund-required-documents. Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación.'
      security:
      - UserTokenAuth: []
      parameters:
      - name: identifier
        in: path
        required: true
        description: ID numérico o slug de la convocatoria.
        schema:
          type: string
      responses:
        '200':
          description: Detalle de la convocatoria.
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  slug:
                    type: string
                  formatted_title:
                    type: string
                  goal_extra:
                    type: string
                  status_text:
                    type: string
                  scope:
                    type: string
                  total_amount:
                    type: number
                  request_amount:
                    type: number
                  publisher:
                    type: string
                  applicants:
                    type: string
                  term:
                    type: string
                  help_type:
                    type: string
                  expenses:
                    type: string
                  fund_execution_period:
                    type: string
                  line:
                    type: string
                  extra_limit:
                    type: string
                  info_extra:
                    type: string
        '404':
          description: No existe o no está activa (ver nota en la descripción sobre convocatorias históricas).
        '400': *id001
        '401': *id002
        '403': *id003
  /api/v2/funds/:
    get:
      tags:
      - Subvenciones
      summary: Listado de subvenciones
      operationId: v2_funds_list
      description: 'Listado de convocatorias activas (active=True) con un amplio sistema de filtros, incluyendo búsqueda semántica vectorizada (search_by_vectorized_text) que puede autocompletar filtros. Si se necesita el total de resultados y la respuesta no cabe en una página, seguir pidiendo páginas siguientes con el parámetro page hasta agotar los resultados (usar count). Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación.'
      security:
      - UserTokenAuth: []
      parameters:
      - name: requestData
        in: query
        required: false
        description: 'Objeto de filtros serializado como JSON. Ejemplo: {"provinces":[33],"is_open":true,"sizes":[2],"order":"-total_amount"}'
        schema:
          type: object
          description: Todos los campos son opcionales. Se envía serializado como JSON dentro del query param `requestData` (no como query params individuales). Si `requestData` no se envía, se aplican los valores por defecto (equivale a una búsqueda sin filtros).
          properties: &id005
            provinces:
              type: array
              items:
                type: integer
              description: IDs de provincia.
              default: []
            communities:
              type: array
              items:
                type: integer
              description: IDs de comunidad autónoma.
              default: []
            types:
              type: array
              items:
                type: integer
              description: IDs de tipo de convocatoria.
              default: []
            region_types:
              type: array
              items:
                type: integer
              description: IDs de ámbito territorial.
              default: []
            applicants_v2:
              type: array
              items:
                type: integer
              description: IDs de tipo de solicitante (mismo espacio de ids que `applicants` en /data-filters/).
              default: []
            actions_v2:
              type: array
              items:
                type: integer
              description: IDs de acción/línea de ayuda (mismo espacio de ids que `actions` en /data-filters/).
              default: []
            activities_v2:
              type: array
              items:
                type: integer
              description: IDs de actividad/sector (mismo espacio de ids que `activities` en /data-filters/).
              default: []
            origins:
              type: array
              items:
                type: integer
              description: IDs de origen de fondos.
              default: []
            credit_types:
              type: array
              items:
                type: integer
              description: IDs de tipo de ayuda.
              default: []
            sizes:
              type: array
              items:
                type: integer
              description: IDs de tamaño de empresa.
              default: []
            profiles:
              type: array
              items:
                type: integer
              description: IDs de perfil de solicitante.
              default: []
            search_by_text:
              type: string
              description: Búsqueda de texto literal (coincidencia de palabras en el título). Úsalo para nombres concretos de convocatoria.
              default: ''
            search_by_vectorized_text:
              type: string
              description: 'Búsqueda semántica vía embeddings: encuentra convocatorias relacionadas con una idea aunque no compartan las palabras exactas. Puede autocompletar automáticamente applicants_v2/actions_v2/communities/provinces si vienen vacíos. Al combinarlo con otros filtros estructurados (por ejemplo `is_open`), estos actúan de forma acumulativa: cuanto más específico sea el texto y más restrictivos los filtros adicionales, menos resultados devolverá la búsqueda, pudiendo llegar a cero si ninguna convocatoria cumple todos los criterios a la vez.'
              default: ''
            is_open:
              type: boolean
              nullable: true
              description: Si se indica, filtra solo convocatorias abiertas (true) o no abiertas (false). Para distinguir entre pendientes y cerradas usa `status_code`.
              default: null
            reviewed:
              type: boolean
              description: Acepta true/"true"/1/"1" como verdadero; cualquier otro valor se trata como falso.
              default: false
            start_date:
              type: string
              format: date
              nullable: true
              description: Fecha de apertura, inicio de rango. Formato YYYY-MM-DD.
            end_date:
              type: string
              format: date
              nullable: true
              description: Fecha de apertura, fin de rango. Formato YYYY-MM-DD.
            final_period_start_date:
              type: string
              format: date
              nullable: true
              description: Fecha de cierre, inicio de rango. Formato YYYY-MM-DD.
            final_period_end_date:
              type: string
              format: date
              nullable: true
              description: Fecha de cierre, fin de rango. Formato YYYY-MM-DD.
            platform:
              type: string
              nullable: true
              description: Slug de plataforma.
            office:
              description: Filtro de oficina/organismo (int o string).
              nullable: true
            bdns:
              type: integer
              nullable: true
              description: Código BDNS. Debe enviarse como número entero.
            min_budget:
              type: number
              nullable: true
              description: Presupuesto de la ayuda, mínimo de rango.
            max_budget:
              type: number
              nullable: true
              description: Presupuesto de la ayuda, máximo de rango.
            order:
              type: string
              default: -order_score
              description: 'Atributo por el que ordenar los resultados. Antepón un guion (-) para orden descendente. Valores admitidos: `order_score` (afinidad/relevancia con la búsqueda, valor por defecto), `total_amount` (presupuesto), `start_date`, `end_date`, `final_period_start_date` y `final_period_end_date` (fechas). Ejemplos: `-total_amount` (mayor presupuesto primero), `-end_date` (cierre más próximo primero).'
            zip_code:
              type: string
              nullable: true
              description: Código postal por el que filtrar.
            status_code:
              type: integer
              nullable: true
              description: 'Filtro por estado de la convocatoria: `0` = pendiente (aún no abierta), `1` = abierta, `2` = cerrada.'
              enum:
              - 0
              - 1
              - 2
            minimis:
              type: boolean
              nullable: true
              description: Filtra por régimen de minimis.
            min_total_amount:
              type: number
              nullable: true
              description: Importe total de la convocatoria, mínimo de rango.
            max_total_amount:
              type: number
              nullable: true
              description: Importe total de la convocatoria, máximo de rango.
      - name: page
        in: query
        required: false
        description: Página del listado. Es un parámetro de query independiente, no va dentro de requestData.
        schema:
          type: integer
          default: 1
      responses:
        '200':
          description: Listado paginado (o array plano si no hay paginación, cuando page es None).
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    nullable: true
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        slug:
                          type: string
                        formatted_title:
                          type: string
                        status_text:
                          type: string
                        new_entity:
                          type: integer
                        total_amount:
                          type: number
        '400':
          description: 'Filtros de fecha/monto inválidos, p.ej. {"errors": "Rango de fechas inválidas"} o {"errors": "Rango de montos inválidos"}.'
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/funds/chatbot/:
    post:
      tags:
      - Subvenciones
      summary: Chatbot de subvención
      operationId: v2_funds_chatbot
      description: 'Proxy hacia un servicio externo de chatbot, con RAG acotado por fund_id. Diseño recomendado: stateless — reenviar el historial completo (record) en cada llamada, sin que Fandit guarde sesión en servidor. Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación.'
      security:
      - UserTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - fund_id
              - prompt
              properties:
                fund_id:
                  type: integer
                  description: Id de la convocatoria (404 si no existe).
                prompt:
                  type: string
                  description: Pregunta del usuario.
                record:
                  type: array
                  default: []
                  description: Historial de conversación.
                  items:
                    type: object
                    properties:
                      role:
                        type: string
                      content:
                        type: string
                max_tokens:
                  type: integer
                  default: 2048
                  description: Límite de tokens de la respuesta.
      responses:
        '200':
          description: 'Respuesta del servicio de chatbot, típicamente un objeto con la respuesta generada (por ejemplo, {"response": "..."}).'
          content:
            application/json:
              schema:
                type: object
        '400':
          description: Faltan campos o tipos inválidos.
        '404':
          description: fund_id inexistente.
        '502':
          description: El servicio externo de chatbot no devolvió JSON válido.
        '401': *id002
        '403': *id003
  /api/v2/funds/concessions/:
    get:
      tags:
      - Subvenciones
      summary: Listado de concesiones
      operationId: v2_funds_concessions_list
      description: 'Listado de fondos con concesiones publicadas (with_concessions=True): ayudas ya resueltas, no convocatorias abiertas en general. Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación.'
      security:
      - UserTokenAuth: []
      parameters:
      - name: requestData
        in: query
        required: false
        description: Mismo formato que en /funds/, pero solo un subconjunto de los campos tiene efecto aquí (ver descripción de cada campo).
        schema:
          type: object
          description: 'Todos los campos son opcionales. Se envía serializado como JSON dentro del query param `requestData` (no como query params individuales). Si `requestData` no se envía, se aplican los valores por defecto (equivale a una búsqueda sin filtros). Este endpoint reutiliza el mismo formato requestData que /funds/, pero solo tienen efecto los siguientes campos: actions_v2, activities_v2, applicants_v2, bdns, communities, credit_types, end_date, final_period_end_date, final_period_start_date, max_total_amount, min_total_amount, office, origins, profiles, provinces, region_types, reviewed, search_by_text, sizes, start_date, types. El resto de campos (zip_code, status_code, minimis, min_budget/max_budget, search_by_vectorized_text) se acepta en el JSON pero no se aplica en este endpoint.'
          properties: *id005
      - name: page
        in: query
        required: false
        description: Página del listado. Es un parámetro de query independiente, no va dentro de requestData.
        schema:
          type: integer
          default: 1
      responses:
        '200':
          description: Listado paginado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    nullable: true
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        slug:
                          type: string
                        formatted_title:
                          type: string
                        status_text:
                          type: string
                        total_amount:
                          type: number
                        concessions_count:
                          type: integer
                        concessions_amount:
                          type: number
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/funds/concessions/beneficiaries-by-cif/:
    get:
      tags:
      - Subvenciones
      summary: Concesiones por CIF
      operationId: v2_funds_concessions_beficiaries_list
      description: 'Devuelve el listado de subvenciones/concesiones recibidas por una empresa concreta, identificada por su NIF/CIF: una fila por cada convocatoria que esa empresa ha recibido (nif fijo, fund_id variable). Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación. Algunas empresas tienen decenas de concesiones asociadas: si necesitas el total, sigue pidiendo páginas siguientes con page hasta agotar los resultados (usa count).'
      security:
      - UserTokenAuth: []
      parameters:
      - name: requestData
        in: query
        required: true
        description: 'Ejemplo: {"nif": "B88445358"}.'
        schema:
          type: object
          required:
          - nif
          properties:
            nif:
              type: string
              description: CIF/NIF del beneficiario.
      - name: page
        in: query
        required: false
        description: Página del listado. Es un parámetro de query independiente, no va dentro de requestData.
        schema:
          type: integer
          default: 1
      responses:
        '200':
          description: Listado paginado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    nullable: true
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items: &id006
                      type: object
                      properties:
                        fund_id:
                          type: integer
                        fund_slug:
                          type: string
                          nullable: true
                        fund_title:
                          type: string
                          nullable: true
                        beneficiary_cif:
                          type: string
                        beneficiary_name:
                          type: string
                        concession_date:
                          type: string
                          format: date
                        awarded_amount:
                          type: number
        '400':
          description: requestData inválido o no se envió nif.
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/funds/concessions/beneficiaries/:
    get:
      tags:
      - Subvenciones
      summary: Concesiones por subvención
      operationId: v2_funds_concessions_by_slug_beficiaries_list
      description: 'Devuelve el listado de beneficiarios de una convocatoria concreta, identificada por fund_id o fund_slug: una fila por cada empresa que ha recibido esa convocatoria (fund_id fijo, beneficiario variable). Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación. Algunas convocatorias tienen más de 1000 concesiones asociadas: si necesitas el total, sigue pidiendo páginas siguientes con page hasta agotar los resultados (usa count).'
      security:
      - UserTokenAuth: []
      parameters:
      - name: requestData
        in: query
        required: true
        description: 'Ejemplo: {"fund_id": 916430}. Admite fund_id o fund_slug (no combinar ambos).'
        schema:
          type: object
          properties:
            fund_id:
              type: integer
              nullable: true
              description: Id de la convocatoria. No combinar con fund_slug.
            fund_slug:
              type: string
              nullable: true
              description: Slug de la convocatoria. No combinar con fund_id.
      - name: page
        in: query
        required: false
        description: Página del listado. Es un parámetro de query independiente, no va dentro de requestData.
        schema:
          type: integer
          default: 1
      responses:
        '200':
          description: Listado paginado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    nullable: true
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items: *id006
        '400':
          description: requestData inválido o no se envió fund_id ni fund_slug.
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/funds/fund-evaluation/{id}/:
    get:
      tags:
      - Subvenciones
      summary: Evaluación de una subvención
      operationId: v2_funds_evaluation
      description: 'Devuelve los criterios de evaluación de la convocatoria (requisitos y si está sujeta a régimen de minimis). Consultar siempre que se pregunte cómo aumentar probabilidades de éxito, qué se valora o cómo preparar mejor una solicitud, aunque no se mencione explícitamente "evaluación". Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación.'
      security:
      - UserTokenAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: Id de la convocatoria.
        schema:
          type: integer
      responses:
        '200':
          description: Criterios de evaluación de la convocatoria.
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  requirements:
                    type: string
                  minimis:
                    type: boolean
        '404':
          description: Convocatoria inexistente.
        '400': *id001
        '401': *id002
        '403': *id003
  /api/v2/funds/fund-normative/{id}/:
    get:
      tags:
      - Subvenciones
      summary: Normativa de una subvención
      operationId: v2_funds_normative
      description: 'Devuelve el listado de normativa disponible: enlaces, PDFs (cada uno con su URL directa y metadatos de clasificación), si es competitiva/no competitiva/minimis, BDNS. Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación.'
      security:
      - UserTokenAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: Id de la convocatoria.
        schema:
          type: integer
      responses:
        '200':
          description: Listado de normativa de la convocatoria.
          content:
            application/json:
              schema:
                type: object
                properties:
                  office:
                    type: string
                    nullable: true
                  department:
                    type: string
                    nullable: true
                  has_regulation_url:
                    type: boolean
                  pdf_files:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        title:
                          type: string
                        filename:
                          type: string
                        primary:
                          type: boolean
                        document_type:
                          type: string
                          nullable: true
                          description: Tipo de documento (ej. Convocatoria, Modificaciones, Extracto, Bases reguladoras).
                        coincidence_category:
                          type: string
                          nullable: true
                          description: Categoría de coincidencia del documento con esta convocatoria (ej. Múltiple).
                        coincidence_percent:
                          type: number
                          nullable: true
                          description: Porcentaje de coincidencia del documento con esta convocatoria.
                        source:
                          type: string
                          description: URL directa de descarga del PDF.
                  has_link:
                    type: boolean
                  bdns_list:
                    type: array
                    items:
                      type: string
                  competitiva:
                    type: boolean
                  no_competitiva:
                    type: boolean
                  minimis:
                    type: boolean
        '404':
          description: Convocatoria inexistente.
        '400': *id001
        '401': *id002
        '403': *id003
  /api/v2/funds/fund-related/{id}/:
    get:
      tags:
      - Subvenciones
      summary: Subvenciones relacionadas
      operationId: v2_funds_related
      description: 'Devuelve el historial de ediciones anteriores de la misma ayuda, sin paginar. Cada elemento incluye el campo previous con el id de la edición inmediatamente anterior, lo que permite seguir recorriendo el historial hacia atrás si se necesita. Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación.'
      security:
      - UserTokenAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: Id de la convocatoria.
        schema:
          type: integer
      responses:
        '200':
          description: Array plano de convocatorias relacionadas, de la más reciente a la más antigua.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    register_date:
                      type: string
                      format: date
                    start_date:
                      type: string
                      format: date
                    slug:
                      type: string
                    cleaned_title:
                      type: string
                    status_text:
                      type: string
                    total_amount:
                      type: number
                    fund_scope:
                      type: string
                    concessions_count:
                      type: integer
                    concessions_amount:
                      type: number
                    entity:
                      type: string
                      nullable: true
                    department:
                      type: string
                      nullable: true
                    office:
                      type: string
                      nullable: true
                    previous:
                      type: integer
                      nullable: true
                      description: Id de la edición anterior a esta en el historial, o null si no hay ninguna más antigua.
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/funds/fund-required-documents/{id}/:
    get:
      tags:
      - Subvenciones
      summary: Documentos requeridos de una subvención
      operationId: v2_funds_required_documents
      description: 'Devuelve la documentación requerida para solicitar la convocatoria. Combinar con fund-evaluation cuando se pregunte por estrategia de éxito: sin la documentación correcta ni siquiera se evalúa la solicitud. Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación.'
      security:
      - UserTokenAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: Id de la convocatoria.
        schema:
          type: integer
      responses:
        '200':
          description: Documentación requerida de la convocatoria.
          content:
            application/json:
              schema:
                type: object
                properties:
                  required_documents:
                    type: string
                  template_document:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        title:
                          type: string
                        filename:
                          type: string
                        primary:
                          type: boolean
        '404':
          description: Convocatoria inexistente.
        '400': *id001
        '401': *id002
        '403': *id003
  /api/v2/funds/opportunities-by-cif/:
    post:
      tags:
      - Subvenciones
      summary: Simulador por CIF
      operationId: v2_funds_simulator_for_companies
      description: 'Calcula hasta 20 oportunidades de subvención a partir del NIF/CIF y CNAE de una empresa: infiere el tipo de solicitante según el NIF y cruza con las acciones asociadas al CNAE. Para perfil genérico sin CIF usar el simulador por perfil. Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación.'
      security:
      - UserTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - province
              - cnae
              - nif
              properties:
                province:
                  type: integer
                  description: Provincia de la empresa.
                cnae:
                  type: string
                  description: Código CNAE 2009 de la empresa.
                nif:
                  type: string
                  description: CIF/NIF de la empresa.
      responses:
        '200':
          description: Array plano, máximo 20 resultados.
          content:
            application/json:
              schema:
                type: array
                items: &id008
                  type: object
                  properties:
                    id:
                      type: integer
                    slug:
                      type: string
                    formatted_title:
                      type: string
                    status_text:
                      type: string
                    total_amount:
                      type: number
                    scope:
                      type: string
        '400':
          description: Faltan campos o el CNAE no es válido.
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/funds/opportunities-by-profile/:
    post:
      tags:
      - Subvenciones
      summary: Simulador por perfil
      operationId: v2_funds_simulator_by_profile
      description: 'Igual que el simulador por CIF, pero recibiendo el perfil directamente en vez de derivarlo del NIF. Requiere token de usuario y créditos disponibles en la cuenta: devuelve 403 si el usuario no tiene créditos suficientes, distinto de un fallo de autenticación.'
      security:
      - UserTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - province
              - applicants_v2
              - actions_v2
              properties:
                province:
                  description: Provincia (int) o array de provincias.
                applicants_v2:
                  type: array
                  items:
                    type: integer
                  description: IDs de tipo de solicitante. No puede ir vacío.
                actions_v2:
                  type: array
                  items:
                    type: integer
                  description: IDs de acción/línea de ayuda. No puede ir vacío.
      responses:
        '200':
          description: Array plano, máximo 20 resultados (mismo formato que el simulador por CIF).
          content:
            application/json:
              schema:
                type: array
                items: *id008
        '400':
          description: Faltan campos obligatorios o vienen vacíos.
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/summary-topics/:
    get:
      tags:
      - Contactos
      summary: Listado de contactos
      operationId: v2_contacts_list
      description: Petición paginada para obtener todos los contactos registrados.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: page
        in: query
        required: true
        description: Página del listado a visualizar.
        schema:
          type: number
      - name: page_size
        in: query
        required: true
        description: Tamaño de la paginación (Obligatorio, máximo 200).
        schema:
          type: number
      - name: order
        in: query
        required: false
        description: Nombre de atributo por el que ordenar los resultados.
        schema:
          type: string
      - name: general_text
        in: query
        required: false
        description: Texto a buscar en todas las columnas.
        schema:
          type: string
      - name: email
        in: query
        required: false
        description: Correo electrónico a buscar.
        schema:
          type: string
      - name: company
        in: query
        required: false
        description: Nombre o razón social.
        schema:
          type: string
      - name: nif
        in: query
        required: false
        description: NIF/CIF.
        schema:
          type: string
      - name: start_date
        in: query
        required: false
        description: Fecha de último contacto (inicio de rango).
        schema:
          type: string
      - name: end_date
        in: query
        required: false
        description: Fecha de último contacto (fin de rango).
        schema:
          type: string
      - name: unregistered_users
        in: query
        required: false
        description: Contactos con usuario registrado o no.
        schema:
          type: number
      - name: provinces
        in: query
        required: false
        description: Provincia.
        schema:
          type: array
          items:
            type: integer
      - name: applicants
        in: query
        required: false
        description: Tipo de solicitante.
        schema:
          type: array
          items:
            type: integer
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    nullable: true
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        email:
                          type: string
                        name:
                          type: string
                        company:
                          type: string
                        cif:
                          type: string
                        contact_type:
                          type: integer
                        contact_type_label:
                          type: string
                        user:
                          type: integer
                        contacts:
                          type: integer
                        last_contact_date:
                          type: string
                        created_at:
                          type: string
                        lead_status:
                          type: integer
                        lead_priority:
                          type: integer
                        status_label:
                          type: string
                        priority_label:
                          type: string
                        investment_capital:
                          type: integer
                        project_description:
                          type: string
                        applicants:
                          type: array
                          items:
                            type: integer
                        provinces:
                          type: array
                          items:
                            type: integer
                        action_items:
                          type: array
                          items:
                            type: integer
                        cnaes:
                          type: array
                          items:
                            type: integer
              example:
                count: 2
                next: null
                previous: null
                results:
                - id: 3021
                  email: contacto@example.com
                  name: Ana López
                  company: Empresa Ejemplo SL
                  cif: B12345678
                  contact_type: 1
                  contact_type_label: Solicitud web
                  user: 10482
                  contacts: 3
                  last_contact_date: '2026-07-28'
                  created_at: '2026-06-15'
                  lead_status: 3
                  lead_priority: 2
                  status_label: Interés
                  priority_label: Media
                  investment_capital: 150000
                  project_description: Ampliación de planta de producción y digitalización de procesos
                  applicants:
                  - 1
                  provinces:
                  - 28
                  action_items:
                  - 1
                  - 2
                  cnaes:
                  - 4321
                - id: 3045
                  email: info@example.com
                  name: Carlos Fernández
                  company: Innovatech Soluciones SL
                  cif: B87654321
                  contact_type: 2
                  contact_type_label: Referido
                  user: 10501
                  contacts: 1
                  last_contact_date: '2026-08-02'
                  created_at: '2026-08-01'
                  lead_status: 1
                  lead_priority: 3
                  status_label: Nuevo
                  priority_label: Alta
                  investment_capital: 320000
                  project_description: Implantación de sistema de energía solar fotovoltaica
                  applicants:
                  - 2
                  provinces:
                  - 46
                  action_items:
                  - 3
                  cnaes:
                  - 4322
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
    post:
      tags:
      - Contactos
      summary: Crear contacto
      operationId: v2_contacts_create
      description: Petición crear un nuevo contacto.
      security:
      - ExpertTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: Correo electrónico del contacto.
                name:
                  type: string
                  description: Nombre.
                company:
                  type: string
                  description: Nombre o razón social.
                phone:
                  type: string
                  description: Teléfono.
                lead_status:
                  type: number
                  description: Estado del contacto ( Nuevo = 1, Toma de contacto = 2, Interés = 3, En evolución = 4, No me interesa = 5, Contratado = 6, Cerrado = 7).
                priority_status:
                  type: number
                  description: Prioridad del contacto (Baja = 1, Media = 2, Alta = 3).
                investment_capital:
                  type: number
                  description: Inversión prevista.
                project_description:
                  type: string
                  description: Descripción del proyecto.
                applicants:
                  type: array
                  items:
                    type: integer
                  description: Tipo de solicitante.
                provinces:
                  type: array
                  items:
                    type: integer
                  description: Provincia.
                action_items:
                  type: array
                  items:
                    type: integer
                  description: Acciones a llevar a cabo.
                cnaes:
                  type: array
                  items:
                    type: integer
                  description: CNAE(s) del contacto.
              required:
              - email
      responses:
        '201':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  email:
                    type: string
                  name:
                    type: string
                  company:
                    type: string
                  cif:
                    type: string
                  contact_type:
                    type: integer
                  contact_type_label:
                    type: string
                  user:
                    type: string
                    nullable: true
                  contacts:
                    type: integer
                  last_contact_date:
                    type: string
                  created_at:
                    type: string
                  lead_status:
                    type: integer
                  lead_priority:
                    type: integer
                  status_label:
                    type: string
                  priority_label:
                    type: string
                  investment_capital:
                    type: integer
                  project_description:
                    type: string
                  applicants:
                    type: array
                    items:
                      type: integer
                  provinces:
                    type: array
                    items:
                      type: integer
                  action_items:
                    type: array
                    items:
                      type: integer
                  cnaes:
                    type: array
                    items:
                      type: integer
              example:
                id: 3102
                email: nuevo.contacto@example.com
                name: Marta Ruiz
                company: Consultora Ejemplo SL
                cif: B11223344
                contact_type: 1
                contact_type_label: Solicitud web
                user: null
                contacts: 1
                last_contact_date: '2026-08-10'
                created_at: '2026-08-10'
                lead_status: 1
                lead_priority: 1
                status_label: Nuevo
                priority_label: Baja
                investment_capital: 80000
                project_description: Proyecto de digitalización comercial
                applicants:
                - 1
                provinces:
                - 28
                action_items:
                - 1
                cnaes:
                - 4321
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/summary-topics/{contact_id}/:
    get:
      tags:
      - Contactos
      summary: Detalle del contacto
      operationId: v2_contacts_detail
      description: Petición paginada para obtener todos los contactos registrados.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: contact_id
        in: path
        required: true
        description: id del contacto a buscar.
        schema:
          type: string
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  email:
                    type: string
                  name:
                    type: string
                  company:
                    type: string
                  cif:
                    type: string
                  contact_type:
                    type: integer
                  contact_type_label:
                    type: string
                  user:
                    type: integer
                  contacts:
                    type: integer
                  last_contact_date:
                    type: string
                  created_at:
                    type: string
                  lead_status:
                    type: integer
                  lead_priority:
                    type: integer
                  status_label:
                    type: string
                  priority_label:
                    type: string
                  investment_capital:
                    type: integer
                  project_description:
                    type: string
                  applicants:
                    type: array
                    items:
                      type: integer
                  provinces:
                    type: array
                    items:
                      type: integer
                  action_items:
                    type: array
                    items:
                      type: integer
                  cnaes:
                    type: array
                    items:
                      type: integer
              example:
                id: 3021
                email: contacto@example.com
                name: Ana López
                company: Empresa Ejemplo SL
                cif: B12345678
                contact_type: 1
                contact_type_label: Solicitud web
                user: 10482
                contacts: 3
                last_contact_date: '2026-07-28'
                created_at: '2026-06-15'
                lead_status: 3
                lead_priority: 2
                status_label: Interés
                priority_label: Media
                investment_capital: 150000
                project_description: Ampliación de planta de producción y digitalización de procesos
                applicants:
                - 1
                provinces:
                - 28
                action_items:
                - 1
                - 2
                cnaes:
                - 4321
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
    patch:
      tags:
      - Contactos
      summary: Actualizar contacto
      operationId: v2_contacts_update
      description: Petición actualizar un contacto en específico.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: contact_id
        in: path
        required: true
        description: Identificador del contacto a actualizar.
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: Nombre.
                company:
                  type: string
                  description: Nombre o razón social.
                phone:
                  type: string
                  description: Teléfono.
                lead_status:
                  type: number
                  description: Estado del contacto ( Nuevo = 1, Toma de contacto = 2, Interés = 3, En evolución = 4, No me interesa = 5, Contratado = 6, Cerrado = 7).
                priority_status:
                  type: number
                  description: Prioridad del contacto (Baja = 1, Media = 2, Alta = 3).
                investment_capital:
                  type: number
                  description: Inversión prevista.
                project_description:
                  type: string
                  description: Descripción del proyecto.
                applicants:
                  type: array
                  items:
                    type: integer
                  description: Tipo de solicitante.
                provinces:
                  type: array
                  items:
                    type: integer
                  description: Provincia.
                action_items:
                  type: array
                  items:
                    type: integer
                  description: Acciones a llevar a cabo.
                cnaes:
                  type: array
                  items:
                    type: integer
                  description: CNAE(s) del contacto.
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  email:
                    type: string
                  name:
                    type: string
                  company:
                    type: string
                  cif:
                    type: string
                  contact_type:
                    type: integer
                  contact_type_label:
                    type: string
                  user:
                    type: integer
                  contacts:
                    type: integer
                  last_contact_date:
                    type: string
                  created_at:
                    type: string
                  lead_status:
                    type: integer
                  lead_priority:
                    type: integer
                  status_label:
                    type: string
                  priority_label:
                    type: string
                  investment_capital:
                    type: integer
                  project_description:
                    type: string
                  applicants:
                    type: array
                    items:
                      type: integer
                  provinces:
                    type: array
                    items:
                      type: integer
                  action_items:
                    type: array
                    items:
                      type: integer
                  cnaes:
                    type: array
                    items:
                      type: integer
              example:
                id: 3021
                email: contacto@example.com
                name: Ana López
                company: Empresa Ejemplo SL
                cif: B12345678
                contact_type: 1
                contact_type_label: Solicitud web
                user: 10482
                contacts: 4
                last_contact_date: '2026-08-09'
                created_at: '2026-06-15'
                lead_status: 4
                lead_priority: 3
                status_label: En evolución
                priority_label: Alta
                investment_capital: 175000
                project_description: Ampliación de planta de producción y digitalización de procesos
                applicants:
                - 1
                provinces:
                - 28
                action_items:
                - 1
                - 2
                - 3
                cnaes:
                - 4321
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/templates/:
    get:
      tags:
      - Expedientes
      summary: Plantillas de expedientes
      operationId: v2_workflow_templates_list
      description: Petición paginada para obtener todas las plantillas necesarias para la creación de un expediente.
      security:
      - ExpertTokenAuth: []
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        copied:
                          type: boolean
                        created_at:
                          type: string
                        custom_forms:
                          type: object
                          properties:
                            mine:
                              type: integer
                            others:
                              type: integer
                        expert_data:
                          type: object
                          properties:
                            email:
                              type: string
                            id:
                              type: integer
                            name:
                              type: string
                        experts:
                          type: array
                          items:
                            type: integer
                        fund_data:
                          type: object
                          properties:
                            id:
                              type: integer
                            title:
                              type: string
                        id:
                          type: integer
                        platform:
                          type: string
                        public:
                          type: boolean
                        title:
                          type: string
                        updated_at:
                          type: string
              example:
                count: 14
                next: https://api.fandit.es/api/v2/templates/?page=2
                previous: null
                results:
                - copied: false
                  created_at: '2025-11-04T09:32:11Z'
                  custom_forms:
                    mine: 3
                    others: 8
                  expert_data:
                    email: marta.sanchez@example.com
                    id: 34
                    name: Marta Sánchez
                  experts:
                  - 12
                  - 34
                  - 56
                  fund_data:
                    id: 210
                    title: Kit Digital - Segmento III
                  id: 58
                  platform: fandit
                  public: true
                  title: Plantilla Kit Digital
                  updated_at: '2026-02-18T14:05:44Z'
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/users/:
    get:
      tags:
      - Usuarios
      summary: Listado de usuarios
      operationId: v2_users_list
      description: Petición paginada para obtener todos los usuarios registrados.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: page
        in: query
        required: true
        description: Página del listado a visualizar.
        schema:
          type: number
      - name: page_size
        in: query
        required: true
        description: Tamaño de la paginación.
        schema:
          type: number
      - name: platform
        in: query
        required: false
        description: Marca gris seleccionada.
        schema:
          type: string
      - name: requestData
        in: query
        required: false
        description: Filtros adicionales de búsqueda, serializados como JSON en un único query param.
        schema:
          type: object
          properties:
            order:
              type: string
              description: Nombre de atributo por el que ordenar los resultados.
            general_text:
              type: string
              description: Texto a buscar en todas las columnas.
            user:
              type: string
              description: Correo electrónico o nombre del usuario a filtrar.
            profile:
              type: string
              description: Perfil de los usuarios a filtrar (Básico, Pro, Equipo).
            start_date:
              type: string
              description: Fecha de creación (inicio de rango).
            end_date:
              type: string
              description: Fecha de creación (fin de rango).
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type: string
                    nullable: true
                  previous:
                    type: string
                    nullable: true
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        email:
                          type: string
                        username:
                          type: string
                        first_name:
                          type: string
                        last_name:
                          type: string
                        platform:
                          type: string
                        is_active:
                          type: boolean
                        communities_list:
                          type: array
                          items:
                            type: integer
                        provinces_list:
                          type: array
                          items:
                            type: integer
                        applicants_list:
                          type: array
                          items:
                            type: integer
                        region_types_list:
                          type: array
                          items:
                            type: integer
                        actions_list:
                          type: array
                          items:
                            type: integer
                        activities_list:
                          type: array
                          items:
                            type: integer
                        general_notifications:
                          type: boolean
                        distributor:
                          type: string
                        business_name:
                          type: string
                        phone:
                          type: string
                        fund_types_list:
                          type: array
                          items:
                            type: integer
                        origins_list:
                          type: array
                          items:
                            type: integer
                        groups_data:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                              name:
                                type: string
              example:
                count: 2
                next: null
                previous: null
                results:
                - id: 10482
                  email: usuario@example.com
                  username: usuario_empresa
                  first_name: Laura
                  last_name: Gómez
                  platform: fandit
                  is_active: true
                  communities_list:
                  - 1
                  - 8
                  provinces_list:
                  - 28
                  - 8
                  applicants_list:
                  - 1
                  - 2
                  region_types_list:
                  - 1
                  actions_list:
                  - 1
                  - 2
                  - 3
                  activities_list:
                  - 4
                  general_notifications: true
                  distributor: FANDIT
                  business_name: Empresa Ejemplo SL
                  phone: '600000000'
                  fund_types_list:
                  - 1
                  - 2
                  origins_list:
                  - 1
                  groups_data:
                  - id: 1
                    name: Administradores
                  - id: 2
                    name: Gestores
                - id: 10501
                  email: contacto@example.com
                  username: innovatech_sl
                  first_name: Carlos
                  last_name: Fernández
                  platform: fandit
                  is_active: true
                  communities_list:
                  - 10
                  provinces_list:
                  - 46
                  applicants_list:
                  - 1
                  region_types_list:
                  - 2
                  actions_list:
                  - 2
                  activities_list:
                  - 6
                  general_notifications: false
                  distributor: FANDIT
                  business_name: Innovatech Soluciones SL
                  phone: '600000004'
                  fund_types_list:
                  - 3
                  origins_list:
                  - 2
                  groups_data:
                  - id: 2
                    name: Gestores
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
    post:
      tags:
      - Usuarios
      summary: Crear usuario
      operationId: v2_users_create
      description: Petición para crear un nuevo usuario.
      security:
      - ExpertTokenAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: Correo electrónico con el que registrar el usuario.
                password:
                  type: string
                  description: Contraseña.
                username:
                  type: string
                  description: Username del usuario.
                first_name:
                  type: string
                  description: Nombre del usuario.
                last_name:
                  type: string
                  description: Apellido del usuario.
                business_name:
                  type: string
                  description: Nombre o razón social.
                phone:
                  type: string
                  description: Número telefónico del usuario.
                distributor:
                  type: string
                  description: Nombre del distribuidor.
                general_notifications:
                  type: boolean
                  description: Recibir notificaciones generales.
                communities:
                  type: array
                  items:
                    type: integer
                  description: Comunidades de interes del usuario.
                provinces:
                  type: array
                  items:
                    type: integer
                  description: Provincias de interes del usuario.
                applicants:
                  type: array
                  items:
                    type: integer
                  description: Tipo de solicitante del usuario.
                region_types:
                  type: array
                  items:
                    type: integer
                  description: Regiones de interes del usuario.
                action_items:
                  type: array
                  items:
                    type: integer
                  description: Acción a llevar a cabo por el usuario.
                activities:
                  type: array
                  items:
                    type: integer
                  description: Sector económico del usuario.
                fund_types:
                  type: array
                  items:
                    type: integer
                  description: Tipo de ayuda.
                origins:
                  type: array
                  items:
                    type: integer
                  description: Origen de los fondos.
              required:
              - email
              - password
              - username
              - first_name
      responses:
        '201':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  email:
                    type: string
                  username:
                    type: string
                  first_name:
                    type: string
                  last_name:
                    type: string
                  platform:
                    type: string
                  is_active:
                    type: boolean
                  general_notifications:
                    type: boolean
                  distributor:
                    type: string
                  business_name:
                    type: string
                  phone:
                    type: string
                  communities_list:
                    type: array
                    items:
                      type: integer
                  provinces_list:
                    type: array
                    items:
                      type: integer
                  applicants_list:
                    type: array
                    items:
                      type: integer
                  region_types_list:
                    type: array
                    items:
                      type: integer
                  action_items_list:
                    type: array
                    items:
                      type: integer
                  activities_list:
                    type: array
                    items:
                      type: integer
                  fund_types_list:
                    type: array
                    items:
                      type: integer
                  origins_list:
                    type: array
                    items:
                      type: integer
                  groups_data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
              example:
                id: 10530
                email: nuevo.usuario@example.com
                username: nuevo_usuario
                first_name: Marta
                last_name: Ruiz
                platform: fandit
                is_active: true
                general_notifications: true
                distributor: FANDIT
                business_name: Consultora Ejemplo SL
                phone: '600000003'
                communities_list:
                - 1
                provinces_list:
                - 28
                applicants_list:
                - 1
                region_types_list:
                - 1
                action_items_list:
                - 1
                activities_list:
                - 3
                fund_types_list:
                - 1
                origins_list:
                - 1
                groups_data:
                - id: 2
                  name: Gestores
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/users/current/:
    get:
      tags:
      - Autenticación
      summary: Current de usuario
      operationId: v2_auth_current_user
      description: Petición para obtener toda la información del usuario logueado.
      security:
      - UserTokenAuth: []
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  email:
                    type: string
                  username:
                    type: string
                  first_name:
                    type: string
                  last_name:
                    type: string
                  platform:
                    type: integer
                  is_active:
                    type: boolean
                  communities_list:
                    type: array
                    items:
                      type: integer
                  provinces_list:
                    type: array
                    items:
                      type: integer
                  applicants_list:
                    type: array
                    items:
                      type: integer
                  region_types_list:
                    type: array
                    items:
                      type: integer
                  actions_list:
                    type: array
                    items:
                      type: integer
                  activities_list:
                    type: array
                    items:
                      type: integer
                  general_notifications:
                    type: boolean
                  distributor:
                    type: string
                  business_name:
                    type: string
                  phone:
                    type: string
                  fund_types_list:
                    type: array
                    items:
                      type: integer
                  origins_list:
                    type: array
                    items:
                      type: integer
              example:
                id: 10482
                email: laura.gomez@example.com
                username: laura.gomez
                first_name: Laura
                last_name: Gómez
                platform: 3
                is_active: true
                communities_list:
                - 1
                - 8
                provinces_list:
                - 28
                - 41
                applicants_list:
                - 2
                - 5
                region_types_list:
                - 1
                actions_list:
                - 3
                - 7
                - 12
                activities_list:
                - 15
                - 22
                general_notifications: true
                distributor: FANDIT
                business_name: Innovatech Soluciones S.L.
                phone: '+34600000000'
                fund_types_list:
                - 1
                - 4
                origins_list:
                - 2
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/users/login/:
    post:
      tags:
      - Autenticación
      summary: Login de usuario
      operationId: v2_auth_log_in
      description: Petición para obtener los token de usuario y experto si es el caso.
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: Correo electrónico con el que registrar el usuario.
                password:
                  type: string
                  description: Contraseña.
              required:
              - email
              - password
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  token:
                    type: string
                  ExpertToken:
                    type: string
                  user:
                    type: object
                    properties:
                      id:
                        type: integer
                      email:
                        type: string
                      username:
                        type: string
                      first_name:
                        type: string
                      last_name:
                        type: string
                      platform:
                        type: integer
                      is_active:
                        type: boolean
                      communities_list:
                        type: array
                        items:
                          type: integer
                      provinces_list:
                        type: array
                        items:
                          type: integer
                      applicants_list:
                        type: array
                        items:
                          type: integer
                      region_types_list:
                        type: array
                        items:
                          type: integer
                      actions_list:
                        type: array
                        items:
                          type: integer
                      activities_list:
                        type: array
                        items:
                          type: integer
                      general_notifications:
                        type: boolean
                      distributor:
                        type: string
                      business_name:
                        type: string
                      phone:
                        type: string
                      fund_types_list:
                        type: array
                        items:
                          type: integer
                      origins_list:
                        type: array
                        items:
                          type: integer
              example:
                token: TOKEN_DE_EJEMPLO
                ExpertToken: EXPERT_TOKEN_DE_EJEMPLO
                user:
                  id: 10482
                  email: laura.gomez@example.com
                  username: laura.gomez
                  first_name: Laura
                  last_name: Gómez
                  platform: 3
                  is_active: true
                  communities_list:
                  - 1
                  - 8
                  provinces_list:
                  - 28
                  - 41
                  applicants_list:
                  - 2
                  - 5
                  region_types_list:
                  - 1
                  actions_list:
                  - 3
                  - 7
                  - 12
                  activities_list:
                  - 15
                  - 22
                  general_notifications: true
                  distributor: FANDIT
                  business_name: Innovatech Soluciones S.L.
                  phone: '+34600000000'
                  fund_types_list:
                  - 1
                  - 4
                  origins_list:
                  - 2
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/users/usage-statistics/:
    get:
      tags:
      - Usuarios
      summary: Estadísticas de uso
      operationId: v2_users_usage_statistics
      description: Petición para obtener el consumo de créditos del usuario o experto autenticado en el mes en curso.
      security:
      - UserTokenAuth: []
      - ExpertTokenAuth: []
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  user_id:
                    type: integer
                  user_email:
                    type: string
                  monthly_used_credits:
                    type: integer
                  max_credits:
                    type: integer
                  credits_bag:
                    type: integer
                  credits_reset_date:
                    type: string
              example:
                user_id: 10482
                user_email: laura.gomez@example.com
                monthly_used_credits: 34
                max_credits: 100
                credits_bag: 10
                credits_reset_date: '2026-09-01'
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
  /api/v2/users/{id}/:
    get:
      tags:
      - Usuarios
      summary: Detalles del usuario
      operationId: v2_users_detail
      description: Petición para obtener toda la información de un usuario usuario específico.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: Identificador del usuario a buscar.
        schema:
          type: number
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  email:
                    type: string
                  username:
                    type: string
                  first_name:
                    type: string
                  last_name:
                    type: string
                  platform:
                    type: string
                  is_active:
                    type: boolean
                  general_notifications:
                    type: boolean
                  distributor:
                    type: string
                  business_name:
                    type: string
                  phone:
                    type: string
                  communities_list:
                    type: array
                    items:
                      type: integer
                  provinces_list:
                    type: array
                    items:
                      type: integer
                  applicants_list:
                    type: array
                    items:
                      type: integer
                  region_types_list:
                    type: array
                    items:
                      type: integer
                  action_items_list:
                    type: array
                    items:
                      type: integer
                  activities_list:
                    type: array
                    items:
                      type: integer
                  fund_types_list:
                    type: array
                    items:
                      type: integer
                  origins_list:
                    type: array
                    items:
                      type: integer
                  groups_data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
              example:
                id: 10482
                email: usuario@example.com
                username: usuario_empresa
                first_name: Laura
                last_name: Gómez
                platform: fandit
                is_active: true
                general_notifications: true
                distributor: FANDIT
                business_name: Empresa Ejemplo SL
                phone: '600000000'
                communities_list:
                - 1
                - 8
                provinces_list:
                - 28
                - 8
                applicants_list:
                - 1
                - 2
                region_types_list:
                - 1
                action_items_list:
                - 1
                - 2
                - 3
                activities_list:
                - 4
                fund_types_list:
                - 1
                - 2
                origins_list:
                - 1
                groups_data:
                - id: 1
                  name: Administradores
                - id: 2
                  name: Gestores
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
    patch:
      tags:
      - Usuarios
      summary: Actualizar usuario
      operationId: v2_users_update
      description: Petición para actualizar los datos de un usuario específico.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: Identificador del usuario a buscar.
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                password:
                  type: string
                  description: Contraseña.
                username:
                  type: string
                  description: Username del usuario.
                first_name:
                  type: string
                  description: Nombre del usuario.
                last_name:
                  type: string
                  description: Apellido del usuario.
                business_name:
                  type: string
                  description: Nombre o razón social.
                phone:
                  type: string
                  description: Número telefónico del usuario.
                distributor:
                  type: string
                  description: Nombre del distribuidor.
                general_notifications:
                  type: boolean
                  description: Recibir notificaciones generales.
                communities:
                  type: array
                  items:
                    type: integer
                  description: Comunidades de interes del usuario.
                provinces:
                  type: array
                  items:
                    type: integer
                  description: Provincias de interes del usuario.
                applicants:
                  type: array
                  items:
                    type: integer
                  description: Tipo de solicitante del usuario.
                region_types:
                  type: array
                  items:
                    type: integer
                  description: Regiones de interes del usuario.
                action_items:
                  type: array
                  items:
                    type: integer
                  description: Acción a llevar a cabo por el usuario.
                activities:
                  type: array
                  items:
                    type: integer
                  description: Sector económico del usuario.
                fund_types:
                  type: array
                  items:
                    type: integer
                  description: Tipo de ayuda.
                origins:
                  type: array
                  items:
                    type: integer
                  description: Origen de los fondos.
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  email:
                    type: string
                  username:
                    type: string
                  first_name:
                    type: string
                  last_name:
                    type: string
                  platform:
                    type: string
                  is_active:
                    type: boolean
                  general_notifications:
                    type: boolean
                  distributor:
                    type: string
                  business_name:
                    type: string
                  phone:
                    type: string
                  communities_list:
                    type: array
                    items:
                      type: integer
                  provinces_list:
                    type: array
                    items:
                      type: integer
                  applicants_list:
                    type: array
                    items:
                      type: integer
                  region_types_list:
                    type: array
                    items:
                      type: integer
                  action_items_list:
                    type: array
                    items:
                      type: integer
                  activities_list:
                    type: array
                    items:
                      type: integer
                  fund_types_list:
                    type: array
                    items:
                      type: integer
                  origins_list:
                    type: array
                    items:
                      type: integer
                  groups_data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
              example:
                id: 10482
                email: usuario@example.com
                username: usuario_empresa
                first_name: Laura
                last_name: Gómez
                platform: fandit
                is_active: true
                general_notifications: true
                distributor: FANDIT
                business_name: Empresa Ejemplo SL
                phone: '600000000'
                communities_list:
                - 1
                - 8
                provinces_list:
                - 28
                - 8
                applicants_list:
                - 1
                - 2
                region_types_list:
                - 1
                action_items_list:
                - 1
                - 2
                - 3
                activities_list:
                - 4
                fund_types_list:
                - 1
                - 2
                origins_list:
                - 1
                groups_data:
                - id: 1
                  name: Administradores
                - id: 2
                  name: Gestores
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
    delete:
      tags:
      - Usuarios
      summary: Eliminar usuario
      operationId: v2_users_delete
      description: Petición para eliminar un usuario específico.
      security:
      - ExpertTokenAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: Identificador del usuario a buscar.
        schema:
          type: string
      responses:
        '200':
          description: Respuesta correcta
          content:
            application/json:
              schema:
                type: string
              example: User deleted successfully
        '400': *id001
        '401': *id002
        '403': *id003
        '404': *id004
