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

# Agregar nota de contexto

> Agrega una nota de contexto al timeline de la conversación. Útil para que el CRM externo deje registro de información que quieres que el equipo humano (o el AI downstream) considere al retomar el chat — ej. "cliente pidió seguimiento post-vacaciones", "contactó por falla de pagos", etc.

- La nota **no** se envía al contacto — solo vive en el timeline interno.
- Autor del evento: `api_token` (la UI del dashboard puede mostrar un badge "vía API").
- Límite: 5000 caracteres.



## OpenAPI

````yaml /openapi.json post /{slug}/conversation/notes
openapi: 3.1.0
info:
  title: 1TO1 AI Public API
  version: 0.2.0
  description: >-
    API pública de 1TO1 AI para integraciones externas (n8n, CRMs, scripts).
    Auth via Bearer token. Rate limit 60 req/min por API key. Contrato REST
    puro: el body de éxito es el payload directo (status HTTP como señal),
    errores retornan `{code, message}` con ambos campos garantizados. Ver schema
    `PublicError`.
servers:
  - url: https://app.1to1.ai/api/v1/public
    description: Producción
security:
  - bearerAuth: []
paths:
  /{slug}/conversation/notes:
    post:
      tags:
        - Conversations
      summary: Agregar nota de contexto
      description: >-
        Agrega una nota de contexto al timeline de la conversación. Útil para
        que el CRM externo deje registro de información que quieres que el
        equipo humano (o el AI downstream) considere al retomar el chat — ej.
        "cliente pidió seguimiento post-vacaciones", "contactó por falla de
        pagos", etc.


        - La nota **no** se envía al contacto — solo vive en el timeline
        interno.

        - Autor del evento: `api_token` (la UI del dashboard puede mostrar un
        badge "vía API").

        - Límite: 5000 caracteres.
      parameters:
        - $ref: '#/components/parameters/SlugPathParam'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateNoteRequest'
      responses:
        '201':
          description: Nota creada.
          headers:
            X-Request-Id:
              schema:
                type: string
                format: uuid
                description: >-
                  ID único para correlacionar con logs server-side. Si el
                  cliente envía uno válido (UUID), se preserva; si no, se genera
                  uno nuevo.
              required: true
              description: >-
                ID único para correlacionar con logs server-side. Si el cliente
                envía uno válido (UUID), se preserva; si no, se genera uno
                nuevo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateNoteResponse'
        '400':
          description: Body inválido (INVALID_REQUEST).
          headers:
            X-Request-Id:
              schema:
                type: string
                format: uuid
                description: >-
                  ID único para correlacionar con logs server-side. Si el
                  cliente envía uno válido (UUID), se preserva; si no, se genera
                  uno nuevo.
              required: true
              description: >-
                ID único para correlacionar con logs server-side. Si el cliente
                envía uno válido (UUID), se preserva; si no, se genera uno
                nuevo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicError'
        '401':
          description: Token ausente, mal formado o no válido (INVALID_API_TOKEN)
          headers:
            X-Request-Id:
              schema:
                type: string
                format: uuid
                description: >-
                  ID único para correlacionar con logs server-side. Si el
                  cliente envía uno válido (UUID), se preserva; si no, se genera
                  uno nuevo.
              required: true
              description: >-
                ID único para correlacionar con logs server-side. Si el cliente
                envía uno válido (UUID), se preserva; si no, se genera uno
                nuevo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicError'
        '403':
          description: >-
            El slug del path no coincide con el business del token
            (TOKEN_BUSINESS_MISMATCH)
          headers:
            X-Request-Id:
              schema:
                type: string
                format: uuid
                description: >-
                  ID único para correlacionar con logs server-side. Si el
                  cliente envía uno válido (UUID), se preserva; si no, se genera
                  uno nuevo.
              required: true
              description: >-
                ID único para correlacionar con logs server-side. Si el cliente
                envía uno válido (UUID), se preserva; si no, se genera uno
                nuevo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicError'
        '404':
          description: >-
            Conversación no encontrada (CONVERSATION_NOT_FOUND). Incluye el caso
            de una conversación tester que nunca corrió un empleado AI (no tiene
            thread asociado) — el contrato de la API no expone threads como
            entidad separada, por eso se reporta bajo el mismo código.
          headers:
            X-Request-Id:
              schema:
                type: string
                format: uuid
                description: >-
                  ID único para correlacionar con logs server-side. Si el
                  cliente envía uno válido (UUID), se preserva; si no, se genera
                  uno nuevo.
              required: true
              description: >-
                ID único para correlacionar con logs server-side. Si el cliente
                envía uno válido (UUID), se preserva; si no, se genera uno
                nuevo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicError'
        '409':
          description: >-
            El identificador de conversación es ambiguo: varios contactos
            comparten el teléfono (`PHONE_NUMBER_AMBIGUOUS`) o el username
            (`USERNAME_AMBIGUOUS`). Identifica la conversación por
            `whatsapp_user_id` o `uuid`.
          headers:
            X-Request-Id:
              schema:
                type: string
                format: uuid
                description: >-
                  ID único para correlacionar con logs server-side. Si el
                  cliente envía uno válido (UUID), se preserva; si no, se genera
                  uno nuevo.
              required: true
              description: >-
                ID único para correlacionar con logs server-side. Si el cliente
                envía uno válido (UUID), se preserva; si no, se genera uno
                nuevo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicError'
        '429':
          description: >-
            Rate limit excedido (RATE_LIMIT_EXCEEDED). Headers `Retry-After`,
            `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`
            indican cuándo reintentar.
          headers:
            X-Request-Id:
              schema:
                type: string
                format: uuid
                description: >-
                  ID único para correlacionar con logs server-side. Si el
                  cliente envía uno válido (UUID), se preserva; si no, se genera
                  uno nuevo.
              required: true
              description: >-
                ID único para correlacionar con logs server-side. Si el cliente
                envía uno válido (UUID), se preserva; si no, se genera uno
                nuevo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicError'
        '500':
          description: Fallo de DB al persistir la nota (UPDATE_FAILED).
          headers:
            X-Request-Id:
              schema:
                type: string
                format: uuid
                description: >-
                  ID único para correlacionar con logs server-side. Si el
                  cliente envía uno válido (UUID), se preserva; si no, se genera
                  uno nuevo.
              required: true
              description: >-
                ID único para correlacionar con logs server-side. Si el cliente
                envía uno válido (UUID), se preserva; si no, se genera uno
                nuevo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicError'
components:
  parameters:
    SlugPathParam:
      schema:
        $ref: '#/components/schemas/SlugPathParam'
      required: true
      description: >-
        Slug del business, case-insensitive. Debe coincidir con el business del
        token.
      name: slug
      in: path
  schemas:
    CreateNoteRequest:
      type: object
      properties:
        conversation:
          $ref: '#/components/schemas/ConversationRef'
        note:
          type: string
          minLength: 1
          maxLength: 5000
          example: Cliente pidió seguimiento en 2 semanas (post-vacaciones).
          description: >-
            Texto libre de la nota de contexto. Se guarda en el timeline y no se
            envía al contacto.
      required:
        - conversation
        - note
    CreateNoteResponse:
      type: object
      properties:
        conversation:
          type: object
          properties:
            uuid:
              type: string
              format: uuid
          required:
            - uuid
        note:
          type: object
          properties:
            uuid:
              type: string
              format: uuid
            created_at:
              type: string
              format: date-time
          required:
            - uuid
            - created_at
      required:
        - conversation
        - note
    PublicError:
      type: object
      properties:
        code:
          type: string
          example: INVALID_API_TOKEN
        message:
          type: string
          example: >-
            The provided API token is invalid or has been revoked. Generate a
            new one in Settings → API Token.
      required:
        - code
        - message
      description: >-
        Public API error body. The client should match against `code` (stable
        canonical identifier) and NOT against `message` (human text, may be
        refined between API versions without notice). The HTTP status code is
        the error-type signal (4xx client, 5xx server).
    SlugPathParam:
      type: string
      example: acme
      description: >-
        Slug del business, case-insensitive. Debe coincidir con el business del
        token.
    ConversationRef:
      type: object
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            UUID interno de 1TO1 AI. Fallback — los CRMs externos normalmente no
            lo conocen.
        whatsapp_user_id:
          type: string
          description: >-
            BSUID de WhatsApp (identidad opaca de Meta). Se resuelve por
            igualdad exacta contra el identificador BSUID del contacto (no se
            normaliza).
        username:
          type: string
          example: '@mariana.lopez'
          description: >-
            Username público de WhatsApp del contacto. Se acepta con o sin `@`
            inicial y sin distinguir mayúsculas (match case-insensitive contra
            el último username observado por la plataforma; best-effort: el
            usuario puede cambiarlo — la clave estable es `uuid`). Si varios
            contactos lo comparten, la API responde 409 `USERNAME_AMBIGUOUS`.
        phone:
          type: string
          example: +52 55 1234 5678
          description: >-
            Teléfono en formato E.164. Se normaliza (solo dígitos) antes del
            lookup por teléfono del contacto. Puede estar duplicado entre
            contactos (números reciclados / identidades separadas): en ese caso
            la API responde 409 `PHONE_NUMBER_AMBIGUOUS` en vez de adivinar.
      description: >-
        Identificador de la conversación — exactamente UNO de los cuatro campos
        debe venir. Orden de resolución: uuid > whatsapp_user_id > username >
        phone. El lookup filtra por el business del token (defense in depth
        cross-tenant). Resolver por `phone` o `username` puede devolver 409
        (`PHONE_NUMBER_AMBIGUOUS` / `USERNAME_AMBIGUOUS`) cuando varios
        contactos comparten el identificador — aplica a cualquier endpoint que
        acepte esta referencia.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: sk_1to1_<hex>
      description: >-
        API token emitido desde Settings → API Token del dashboard 1TO1 AI.
        Enviar en header Authorization: Bearer sk_1to1_...

````