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

# Rewrite a draft

> Requires ai:use and conversations:read on a connection owned by a current workspace owner/admin. API keys created before human ownership was recorded must be replaced in Settings. OAuth works through MCP; REST uses API keys. Creates a durable asynchronous run, never sends a message. Poll get_evelin_run, then retrieve the appropriate result. Uses the same workspace knowledge, runtime availability, and credit policy as the app. Identical retries with the same key reuse the run; changed inputs conflict. Private results remain bound to this exact connection. For improve, omit tone, preset and targetLanguage. For polish, choose at most one of tone or preset. For translate, provide targetLanguage and omit tone and preset.



## OpenAPI

````yaml POST /ai/conversations/{conversationId}/actions/rewrite
openapi: 3.1.0
info:
  title: Protodesk API
  version: 0.1.0
  description: >
    The Protodesk Platform API: sync your customers in, attach your own business
    objects (orders, bookings, listings) to conversations, post and read
    messages across channels, and receive every workspace event via signed
    webhooks or a resumable SSE stream.


    Authenticate every request with a workspace-scoped API key: `Authorization:
    Bearer pk_...`. Operations that support retry protection document an
    `Idempotency-Key` header. Reuse it only with an identical request. List
    pagination is described on each endpoint.


    Task-oriented guides: [docs.protodesk.io](https://docs.protodesk.io).
servers:
  - url: https://api.protodesk.io/v1
    description: Production
  - url: http://localhost:8080/v1
    description: Local development
security: []
tags:
  - name: Evelin
    description: >-
      Human-owned AI connections using the existing Evelin runtime. Generation
      never sends a customer message.
  - name: Customers
    description: People or companies contacting a workspace across channels.
  - name: Conversations
    description: Customer conversations attached to channels and external business objects.
  - name: Messages
    description: Customer, agent, AI, system, and internal messages inside conversations.
  - name: Attachments
    description: Scoped file transfer for messages.
  - name: Channel identities
    description: >-
      The same customer across WhatsApp, email, chat, and more — linked
      identities per channel.
  - name: Statuses & priorities
    description: The workspace's conversation statuses and priority levels.
  - name: Assignments
    description: >-
      Who a conversation has been assigned to, over time. Assign via POST
      /conversations/{conversationId}/assign.
  - name: Webhooks
    description: Webhook subscriptions for receiving workspace events.
  - name: Realtime
    description: Server-sent event stream of workspace events.
  - name: API Keys
    description: Create, list, and revoke workspace API keys.
  - name: Account
    description: The workspace and scopes behind your API key.
  - name: System
    description: Service metadata and health endpoints.
paths:
  /ai/conversations/{conversationId}/actions/rewrite:
    post:
      tags:
        - Evelin
      summary: Improve, polish, or translate a draft with Evelin
      description: >-
        Requires ai:use and conversations:read on a connection owned by a
        current workspace owner/admin. API keys created before human ownership
        was recorded must be replaced in Settings. OAuth works through MCP; REST
        uses API keys. Creates a durable asynchronous run, never sends a
        message. Poll get_evelin_run, then retrieve the appropriate result. Uses
        the same workspace knowledge, runtime availability, and credit policy as
        the app. Identical retries with the same key reuse the run; changed
        inputs conflict. Private results remain bound to this exact connection.
        For improve, omit tone, preset and targetLanguage. For polish, choose at
        most one of tone or preset. For translate, provide targetLanguage and
        omit tone and preset.
      operationId: rewrite_with_evelin
      parameters:
        - name: conversationId
          in: path
          required: true
          schema:
            type: string
        - name: Idempotency-Key
          in: header
          required: true
          schema:
            type: string
            minLength: 8
            maxLength: 128
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EvelinRewriteRequest'
      responses:
        '202':
          description: Run accepted or replayed. No message was sent.
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                properties:
                  data:
                    $ref: '#/components/schemas/EvelinCreatedRun'
        default:
          $ref: '#/components/responses/Error'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    EvelinRewriteRequest:
      type: object
      additionalProperties: false
      required:
        - mode
        - draft
      properties:
        mode:
          type: string
          enum:
            - improve
            - polish
            - translate
        draft:
          type: string
          minLength: 1
          maxLength: 20000
        targetLanguage:
          type: string
          minLength: 1
          maxLength: 100
        tone:
          type: string
          maxLength: 200
        preset:
          type: string
          enum:
            - expand
            - shorten
            - friendly
            - professional
    EvelinCreatedRun:
      type: object
      required:
        - id
        - kind
        - status
        - trigger
        - conversationId
        - agentId
        - agentVersionId
        - createdAt
      properties:
        id:
          type: string
        kind:
          type: string
        status:
          type: string
        trigger:
          type: object
          properties:
            type:
              type: string
        conversationId:
          type: string
        agentId:
          type: string
        agentVersionId:
          type: string
        createdAt:
          type: string
          format: date-time
    ErrorEnvelope:
      type: object
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/Error'
    Error:
      type: object
      required:
        - code
        - message
        - requestId
      properties:
        code:
          type: string
          example: route.not_found
        message:
          type: string
          example: Not found
        requestId:
          type: string
          example: req_x6q5vl75f5d53m7oet2k4r5w6a
  responses:
    Error:
      description: >-
        Error response. All /v1 responses carry RateLimit-Limit,
        RateLimit-Remaining, and RateLimit-Reset headers. A 429
        (rate_limit.exceeded) additionally carries Retry-After. Request bodies
        exceeding the route-class limit (1KB reads, 64KB writes) return 413
        (request.body_too_large).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
        RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  headers:
    RequestId:
      description: Request id for tracing this request in logs and support.
      schema:
        type: string
        example: req_x6q5vl75f5d53m7oet2k4r5w6a
    RateLimitLimit:
      description: >-
        Request budget for the route class (read or write) applied to this
        request.
      schema:
        type: integer
        example: 40
    RateLimitRemaining:
      description: Requests remaining in the current budget after this request.
      schema:
        type: integer
        example: 39
    RateLimitReset:
      description: Seconds until the budget refills to its full limit.
      schema:
        type: integer
        example: 1
    RetryAfter:
      description: Seconds to wait before retrying, sent with 429 responses.
      schema:
        type: integer
        example: 1
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: Protodesk API key
      description: >
        Use a workspace API key in the Authorization header: Bearer pk_....
        Older pk_live_ and pk_test_ keys remain valid; their prefixes do not
        isolate data or select a separate environment.

````

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