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

# Canjear el enlace del portal por un enlace de deuda

> Cuando el enlace no apunta a una factura y no hay sesión posible en Atlas (el cliente no tiene portal activo o el correo es sólo usuario de otras empresas): emite un enlace de deuda del cliente del token a nombre del contacto del cliente con el correo del token (si ninguno lo tiene y es el correo principal del cliente, lo crea con el rol «Portal Atlas») y quema el token del portal en la misma transacción. Recibe sólo el token: el cliente sale de él y no lee atlas_client_id. Token usado, vencido o sin correo, y un correo que ya no es de ningún contacto ni el principal responden el mismo TOKEN_INVALID, sin quemar nada.



## OpenAPI

````yaml /generated/specs/atlas-portal.json post /api/v1/internal/atlas-portal/portal-tokens/debt-link
openapi: 3.0.0
info:
  title: Raul API - Portal del cliente (Atlas)
  description: >-
    Namespace interno que consume el backend de Atlas: facturacion y soporte de
    un cliente comercial resuelto por Client.atlas_client_id, con token de
    servicio propio.
  version: 2.0.0
  contact: {}
servers:
  - url: https://api.raul.ugps.io
    description: Production
security: []
tags: []
paths:
  /api/v1/internal/atlas-portal/portal-tokens/debt-link:
    post:
      tags:
        - Atlas portal
      summary: Canjear el enlace del portal por un enlace de deuda
      description: >-
        Cuando el enlace no apunta a una factura y no hay sesión posible en
        Atlas (el cliente no tiene portal activo o el correo es sólo usuario de
        otras empresas): emite un enlace de deuda del cliente del token a nombre
        del contacto del cliente con el correo del token (si ninguno lo tiene y
        es el correo principal del cliente, lo crea con el rol «Portal Atlas») y
        quema el token del portal en la misma transacción. Recibe sólo el token:
        el cliente sale de él y no lee atlas_client_id. Token usado, vencido o
        sin correo, y un correo que ya no es de ningún contacto ni el principal
        responden el mismo TOKEN_INVALID, sin quemar nada.
      operationId: AtlasPortalTokenController_exchangeForDebtLink
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AtlasPortalDebtLinkExchangeCommandDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AtlasPortalDebtLinkExchangeResponseDto'
        '400':
          description: Cuerpo inválido (VALIDATION_ERROR)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AtlasPortalErrorResponseDto'
        '401':
          description: >-
            Token de servicio inválido (UNAUTHORIZED) o enlace inexistente,
            usado o vencido (TOKEN_INVALID)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AtlasPortalErrorResponseDto'
      security:
        - bearerAuth: []
components:
  schemas:
    AtlasPortalDebtLinkExchangeCommandDto:
      type: object
      properties:
        token:
          type: string
          format: uuid
          description: >-
            Token del enlace del portal del cliente; un solo uso. El cliente del
            enlace de deuda sale de él
      required:
        - token
    AtlasPortalDebtLinkExchangeResponseDto:
      type: object
      properties:
        contractVersion:
          type: number
          description: Versión del contrato; el consumidor acepta la vigente y la anterior
          example: 1
          minimum: 1
        debtLinkToken:
          type: string
          pattern: ^[A-Za-z0-9_-]{43}$
          description: >-
            Token del enlace de deuda (`/deuda/:token`); sólo viaja en esta
            respuesta
        expiresAt:
          type: string
          format: date-time
      required:
        - contractVersion
        - debtLinkToken
        - expiresAt
    AtlasPortalErrorResponseDto:
      type: object
      properties:
        contractVersion:
          type: number
          description: Versión del contrato; el consumidor acepta la vigente y la anterior
          example: 1
          minimum: 1
        code:
          type: string
          enum:
            - CLIENT_NOT_LINKED
            - CLIENT_WITHOUT_ATLAS_LINK
            - INVOICE_NOT_FOUND
            - INVOICE_NOT_PAYABLE
            - TICKET_NOT_FOUND
            - TICKET_CLOSED
            - TOKEN_INVALID
            - TOKEN_WITHOUT_EMAIL
            - VALIDATION_ERROR
            - UNAUTHORIZED
        message:
          type: string
      required:
        - contractVersion
        - code
        - message
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Token de sesión Better Auth para rutas de backoffice; las rutas de
        portal usan su token propio.

````

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