> ## Documentation Index
> Fetch the complete documentation index at: https://woku.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Crea un destino de tickets

> `kind`: zendesk \| salesforce \| slack \| custom \| email. `config`/`credentials` se validan segun el kind (ver `CreateTicketDestinationRequest`). `routingConditions` admiten el operador `equals` (un valor) o `any` (el tracker completo).



## OpenAPI

````yaml /openapi-v1.es.json post /v1/ticket-destinations
openapi: 3.0.3
info:
  title: Woku Client API v1
  description: >-
    API publica de Woku Client. Cambia el selector de version en la parte
    superior para ver la referencia v0.


    Esta especificacion cubre:

    - **Wokus**, crear wokus, obtener datos de reseñas, enviar reseñas de
    texto/voz, compartir por correo.

    - **Empresas**, `GET /companies/me` devuelve la empresa que hace la llamada.

    - **Reportes**, reportes NPS a nivel de empresa y por herramienta.

    - **Trackers externos**, etiqueta tus Wokus con identificadores de sistemas
    de terceros (id de transaccion de CRM, id de orden de ERP, etc.) y buscalos
    despues.

    - **Destinos de tickets**, configura las plataformas de SAC (Zendesk,
    Salesforce, Slack), un servicio HTTP personalizado o direcciones de correo
    que reciben tickets de soporte clasificados por IA, y las condiciones de
    tracker que enrutan un ticket a uno de ellos.

    - **Grupos de planes de accion**, define que feedback de VoC (condiciones de
    tracker) redacta un plan de mejora y quien es el responsable.

    - **Planes de accion**, lee planes redactados por IA y gestiona su ciclo de
    vida (aprobar, enviar a una herramienta externa o trabajarlos en el kanban
    gestionado de woku).


    ## Autenticacion


    Todos los endpoints requieren un token Bearer en el encabezado
    `Authorization`. Obten la clave de API de tu empresa desde el panel de Woku.


    ```

    Authorization: Bearer your_api_key_here

    ```


    ## URL base


    Produccion: `https://clientapi.woku.app`


    ## Modelo (Trackers externos)


    - **Definicion de tracker** (`ExternalTracker`): una entrada del catalogo
    por empresa como `{ name: 'trr', system: 'crm interno', description: '...'
    }`. La define un administrador en el panel de Woku.

    - **Valor de tracker** (`WokuExternalTrackerValue`): un valor de tipo cadena
    asociado a un par (Woku, Tracker). Varios Wokus pueden compartir el mismo
    valor.


    ## Modelo (enrutamiento / condiciones de grupo)


    `TicketRoutingCondition` (Destinos de tickets) y `ActionPlanGroupCondition`
    (Grupos de planes de accion) comparten la misma forma: una expresion
    booleana de filas sobre valores de `ExternalTracker`, con AND ligando mas
    fuerte que OR. Cada fila coincide cuando el feedback lleva `trackerId` con
    un valor que, para el operador `equals`, es igual a `value`, o, para el
    operador `any`, es cualquier valor (el tracker completo; en ese caso `value`
    se omite). `relationToPrevious` une una fila con la anterior (`AND` mismo
    grupo, `OR` inicia un grupo nuevo); la primera fila lo omite.
  version: 1.0.0
  contact:
    name: Woku Support
    url: https://woku.app
    email: team@woku.app
servers:
  - url: https://clientapi.woku.app
    description: Servidor de produccion
security: []
tags:
  - name: Wokus
    description: >-
      Crear wokus, obtener datos de reseñas, enviar reseñas de texto y voz,
      compartir enlaces de reseñas por correo.
  - name: Empresas
    description: Endpoint de la empresa que hace la llamada.
  - name: Reportes
    description: >-
      Reportes NPS para la empresa que hace la llamada y herramientas NPS
      individuales.
  - name: NPS
    description: >-
      Captura calificaciones NPS (a nivel de empresa o por herramienta NPS) y
      obten las definiciones de herramientas NPS.
  - name: CSAT
    description: >-
      Captura calificaciones CSAT (satisfaccion 1-5) a nivel de empresa o por
      herramienta CSAT, obten definiciones de herramientas y respuestas, y envia
      feedback de texto y voz.
  - name: CES
    description: >-
      Captura calificaciones CES (esfuerzo) a nivel de empresa o por herramienta
      CES, obten definiciones de herramientas y respuestas, y envia feedback de
      texto y voz.
  - name: Trackers externos
    description: >-
      Etiqueta Wokus con identificadores de sistemas externos y buscalos por
      nombre + valor.
  - name: Cuarentenas
    description: >-
      Verifica si un encuestado esta actualmente en cuarentena antes de
      solicitarle feedback.
  - name: Invitaciones
    description: >-
      Distribucion de encuestas: envia encuestas NPS, forms e invitaciones de
      reseña de woku por correo o WhatsApp.
  - name: Forms
    description: Obten definiciones de forms y envia respuestas desde tu propia interfaz.
  - name: Flows
    description: >-
      Renderiza recorridos de Flow (wokus ordenados con un NPS opcional) en tu
      propia app.
  - name: Capturas
    description: Ingesta de capturas del SDK movil
  - name: Destinos de tickets
    description: >-
      Configura donde se entregan los tickets de soporte clasificados por IA
      (Zendesk, Salesforce, Slack, un servicio HTTP personalizado o correo
      simple) y el enrutamiento basado en trackers que elige un destino.
  - name: Grupos de planes de acción
    description: >-
      Define que feedback de VoC (condiciones de tracker) redacta un plan de
      accion y quienes son los responsables.
  - name: Planes de acción
    description: >-
      Lee planes de mejora redactados por IA y gestiona su ciclo de vida:
      aprobar, enviar a Jira/monday.com/ClickUp/Notion o trabajarlos dentro del
      kanban gestionado de woku.
paths:
  /v1/ticket-destinations:
    post:
      tags:
        - Destinos de tickets
      summary: Crea un destino de tickets
      description: >-
        `kind`: zendesk \| salesforce \| slack \| custom \| email.
        `config`/`credentials` se validan segun el kind (ver
        `CreateTicketDestinationRequest`). `routingConditions` admiten el
        operador `equals` (un valor) o `any` (el tracker completo).
      operationId: createTicketDestination
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTicketDestinationRequest'
            examples:
              zendesk:
                summary: Zendesk, ruteado a un grupo de agentes especifico
                value:
                  name: Zendesk Soporte Chile
                  kind: zendesk
                  config:
                    connectionId: 665f1a2b3c4d5e6f7a8b9c0d
                    groupId: 360000123456
                  credentials: {}
                  routingConditions:
                    - trackerId: 507f1f77bcf86cd799439011
                      operator: equals
                      value: reclamo
              salesforce:
                summary: Salesforce, cola por defecto
                value:
                  name: Salesforce Casos
                  kind: salesforce
                  config:
                    queueId: 00G5f000004CzXPEA0
                    caseOrigin: Web
                  credentials: {}
              slack:
                summary: Notificacion a canal de Slack
                value:
                  name: 'Slack #soporte'
                  kind: slack
                  config:
                    connectionId: 665f1a2b3c4d5e6f7a8b9c0e
                    channelId: C0123ABCD
                    channelLabel: '#soporte'
                  credentials: {}
              custom:
                summary: Servicio HTTP personalizado con un token bearer
                value:
                  name: Servicio interno
                  kind: custom
                  config:
                    url: https://tickets.miempresa.com/api/incoming
                    method: POST
                  credentials:
                    authType: bearer
                    token: sk_live_xxx
              email:
                summary: Correo simple, ruteado a cualquier valor de un tracker
                value:
                  name: Soporte por correo
                  kind: email
                  config:
                    emails:
                      - soporte@miempresa.com
                  credentials: {}
                  routingConditions:
                    - trackerId: 507f1f77bcf86cd799439011
                      operator: any
      responses:
        '201':
          description: Destino creado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TicketDestination'
        '400':
          description: Error de validacion
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
        '403':
          description: Clave de API invalida o ausente
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenError'
      security:
        - BearerAuth: []
components:
  schemas:
    CreateTicketDestinationRequest:
      type: object
      required:
        - name
        - kind
        - config
        - credentials
      properties:
        name:
          type: string
          maxLength: 120
          example: Zendesk Soporte Chile
        kind:
          type: string
          enum:
            - zendesk
            - salesforce
            - slack
            - custom
            - email
        config:
          type: object
          additionalProperties: true
          description: >-
            Configuracion no secreta, especifica por tipo, validada segun el
            tipo:

            - `zendesk`: `{ connectionId, groupId? }`. `connectionId` es el id
            de la Integration de Zendesk de la empresa; `groupId` es el grupo
            numerico de agentes, opcional, donde llega el ticket.

            - `salesforce`: `{ queueId?, caseOrigin? }`. `queueId` es un id de
            Case Queue (`"00G..."`, 15 o 18 caracteres); `caseOrigin` por
            defecto es `"Web"`.

            - `slack`: `{ connectionId, channelId, channelLabel? }`.
            `connectionId` es el id de la Integration de Slack de la empresa;
            `channelId` es el id del canal de Slack (`"C..."`); `channelLabel`
            es un nombre solo de visualizacion (por ejemplo `"#soporte"`).

            - `custom`: `{ url, method, headers? }`. `method` es `POST` o `PUT`;
            `headers` son cabeceras adicionales no secretas (nunca
            `Authorization`).

            - `email`: `{ emails }`. Hasta 20 direcciones de destinatarios; el
            servidor envia el ticket como un correo con formato, sin llamada
            externa.
        credentials:
          type: object
          additionalProperties: true
          description: >-
            Credenciales de solo escritura, especificas por tipo. La API nunca
            las devuelve; ver `credentialsHint` en la respuesta.

            - `zendesk`, `salesforce`, `slack`: se autentican a traves de la
            Integration de la empresa (conectada por separado en el panel).
            Enviar `{}`.

            - `custom`: `{ authType, ... }` donde `authType` es `none`, `basic`
            (agrega `username`, `password`), `bearer` (agrega `token`) o
            `api-key-header` (agrega `headerName`, `headerValue`).

            - `email`: enviar `{}`. El servidor es dueno del transporte de
            correo; no hay credencial que enviar.
        aiContext:
          type: string
          maxLength: 2000
          description: >-
            Contexto en lenguaje natural por destino, inyectado en el prompt de
            triage de la IA.
        routingConditions:
          type: array
          maxItems: 20
          items:
            $ref: '#/components/schemas/TicketRoutingCondition'
        template:
          $ref: '#/components/schemas/TicketDestinationTemplate'
    TicketDestination:
      type: object
      description: >-
        Las credenciales nunca se incluyen: `credentialsHint` muestra solo los
        ultimos 4 caracteres enmascarados del secreto almacenado (vacio para
        tipos que no tienen secreto propio).
      properties:
        _id:
          type: string
          example: 507f1f77bcf86cd799439021
        companyId:
          type: string
        name:
          type: string
        kind:
          type: string
          enum:
            - zendesk
            - salesforce
            - slack
            - custom
            - email
        config:
          type: object
          additionalProperties: true
        aiContext:
          type: string
        routingConditions:
          type: array
          items:
            $ref: '#/components/schemas/TicketRoutingCondition'
        credentialsHint:
          type: string
          description: >-
            Vista previa enmascarada del secreto almacenado (por ejemplo
            "••••a1b2"). Vacio cuando el tipo no tiene secreto propio.
          example: ••••a1b2
        template:
          $ref: '#/components/schemas/TicketDestinationTemplate'
        enabled:
          type: boolean
          default: true
        status:
          type: string
          enum:
            - active
            - error
          description: >-
            `error` = la ultima entrega o prueba de conexion fallo (ver
            `lastError`).
        lastDeliveryAt:
          type: string
          format: date-time
        lastError:
          type: string
          description: >-
            Motivo de falla saneado del ultimo intento de entrega. Nunca
            contiene credenciales.
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    ValidationError:
      type: object
      properties:
        statusCode:
          type: integer
          example: 400
        message:
          oneOf:
            - type: string
            - type: array
              items:
                type: string
        error:
          type: string
          example: Bad Request
    ForbiddenError:
      type: object
      properties:
        statusCode:
          type: integer
          example: 403
        message:
          type: string
          example: Authentication required
        error:
          type: string
          example: Forbidden
    TicketRoutingCondition:
      type: object
      description: >-
        Una fila de ruteo: el ticket debe llevar `trackerId` con un valor que
        coincida segun `operator`. Las filas forman una expresion booleana (AND
        liga mas fuerte que OR) mediante `relationToPrevious`; un destino se usa
        cuando CUALQUIER grupo OR de sus filas coincide por completo.
      required:
        - trackerId
      properties:
        relationToPrevious:
          type: string
          enum:
            - AND
            - OR
          description: Une esta fila con la anterior. Se omite en la primera fila.
        trackerId:
          type: string
          description: Id de ExternalTracker (el catalogo de trackers de la empresa).
          example: 507f1f77bcf86cd799439011
        operator:
          type: string
          enum:
            - equals
            - any
          default: equals
          description: >-
            `equals` compara el valor del tracker contra `value`. `any` coincide
            con cualquier valor del tracker (el tracker completo; `value` se
            omite).
        value:
          type: string
          maxLength: 200
          description: >-
            El valor con el que el tracker debe coincidir. Requerido salvo que
            operator sea "any".
    TicketDestinationTemplate:
      type: object
      description: >-
        Solo tiene sentido para kind `custom`; los kinds con nombre
        (zendesk/salesforce/slack/email) usan un preset fijo y rechazan este
        campo.
      required:
        - preset
      properties:
        preset:
          type: string
          example: custom
        body:
          type: string
          maxLength: 10000
          description: >-
            Plantilla de cuerpo JSON personalizada con marcadores `{{path}}`
            resueltos contra el sobre canonico del ticket. Omitir para enviar el
            sobre canonico sin cambios.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Clave de API de la empresa. Obtenla desde tu panel de Woku en
        Configuracion > API Keys. La misma clave usada para los endpoints v0.

````