Gradient Labs Actions & Tools API

Define the business tools the AI agent can call and execute them. Tools can be run via the API or delivered to your endpoint through the action.execute webhook so the agent can take real actions in your systems.

OpenAPI Specification

gradient-labs-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Gradient Labs API
  version: '1.0'
  description: >-
    HTTP API for Gradient Labs' AI customer support agent ("Otto"). Use it to
    start and drive support conversations, add customer and human-agent
    messages, assign work to the AI agent, hand off to humans, run business
    tools/actions, and manage the knowledge base the agent reasons over.


    All requests are authenticated with a Bearer API key in the `Authorization`
    header. Unless stated otherwise, endpoints are idempotent and requests can
    be safely retried.


    IMPORTANT (accuracy note): Gradient Labs' public API reference at
    https://api-docs.gradient-labs.ai/ is behind an access-code gate. The paths,
    verbs, and field names in this document were reconstructed from the vendor's
    official open-source Go SDK (github.com/gradientlabs-ai/gradientlabs-go) and
    corroborating SDKs. Request/response schemas are modeled and simplified;
    verify exact field-level shapes against the gated reference before relying on
    them in production. See review.yml (endpointsConfirmed vs endpointsModeled).
  contact:
    name: Gradient Labs
    url: https://www.gradient-labs.ai
  license:
    name: Proprietary
servers:
- url: https://api.gradient-labs.ai
  description: Gradient Labs production API
security:
- bearerAuth: []
tags:
- name: Conversations
  description: Start, read, and manage the lifecycle of AI-agent conversations.
- name: Messages
  description: Add inbound messages to a conversation.
- name: Hand-off
  description: Assign conversations between the AI agent and human participants.
- name: Actions & Tools
  description: Define and execute business tools the AI agent can call.
- name: Knowledge
  description: Manage knowledge-base articles that ground the AI agent.
paths:
  /conversations:
    post:
      tags:
      - Conversations
      operationId: startConversation
      summary: Start a conversation
      description: >-
        Creates a new conversation and (optionally) assigns it to the Gradient
        Labs AI agent so it begins working the conversation autonomously.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StartConversationParams'
      responses:
        '200':
          description: Conversation started.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Conversation'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /conversations/{conversationID}/read:
    get:
      tags:
      - Conversations
      operationId: readConversation
      summary: Read a conversation
      description: Returns the current state of a conversation.
      parameters:
      - $ref: '#/components/parameters/ConversationID'
      - name: support_platform
        in: query
        required: false
        description: >-
          Identifies the support platform (e.g. intercom) if the conversation was
          initiated through one.
        schema:
          type: string
      responses:
        '200':
          description: Conversation state.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Conversation'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /conversations/{conversationID}/messages:
    post:
      tags:
      - Messages
      operationId: addMessage
      summary: Add a message to a conversation
      description: >-
        Adds an inbound message (from the customer or a human agent) to a
        conversation for the AI agent to process. The participant type cannot be
        the AI agent.
      parameters:
      - $ref: '#/components/parameters/ConversationID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddMessageParams'
      responses:
        '200':
          description: Message accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Message'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /conversations/{conversationID}/assignee:
    put:
      tags:
      - Hand-off
      operationId: assignConversation
      summary: Assign a conversation
      description: >-
        Assigns or reassigns a conversation to a participant. Set assignee_type
        to ai-agent to assign the conversation to the Gradient Labs AI agent.
      parameters:
      - $ref: '#/components/parameters/ConversationID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssignmentParams'
      responses:
        '200':
          description: Conversation assigned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Conversation'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /conversations/{conversationID}/finish:
    put:
      tags:
      - Conversations
      operationId: finishConversation
      summary: Finish a conversation
      description: Marks a conversation as finished.
      parameters:
      - $ref: '#/components/parameters/ConversationID'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LifecycleParams'
      responses:
        '200':
          description: Conversation finished.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Conversation'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /conversations/{conversationID}/cancel:
    put:
      tags:
      - Conversations
      operationId: cancelConversation
      summary: Cancel a conversation
      description: Cancels a conversation, stopping the AI agent from working it.
      parameters:
      - $ref: '#/components/parameters/ConversationID'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LifecycleParams'
      responses:
        '200':
          description: Conversation cancelled.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Conversation'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /conversations/{conversationID}/resume:
    put:
      tags:
      - Conversations
      operationId: resumeConversation
      summary: Resume a conversation
      description: Resumes a previously finished or cancelled conversation.
      parameters:
      - $ref: '#/components/parameters/ConversationID'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LifecycleParams'
      responses:
        '200':
          description: Conversation resumed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Conversation'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /conversations/{conversationID}/rate:
    put:
      tags:
      - Conversations
      operationId: rateConversation
      summary: Rate a conversation
      description: >-
        Records a customer satisfaction rating (e.g. CSAT survey) for a
        conversation.
      parameters:
      - $ref: '#/components/parameters/ConversationID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RatingParams'
      responses:
        '200':
          description: Rating recorded.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /tools:
    post:
      tags:
      - Actions & Tools
      operationId: createTool
      summary: Create a tool
      description: >-
        Defines a business tool the AI agent can call. Requires a Management API
        key.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Tool'
      responses:
        '200':
          description: Tool created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Tool'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /tools/{id}/execute:
    post:
      tags:
      - Actions & Tools
      operationId: executeTool
      summary: Execute a tool
      description: >-
        Executes a defined tool with the supplied arguments and returns its
        JSON-encoded result. Requires a Management API key.
      parameters:
      - name: id
        in: path
        required: true
        description: The tool identifier.
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExecutionParams'
      responses:
        '200':
          description: Tool execution result.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExecuteResult'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /articles:
    post:
      tags:
      - Knowledge
      operationId: upsertArticle
      summary: Upsert a knowledge article
      description: >-
        Creates or updates a knowledge-base article that grounds the AI agent's
        answers.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpsertArticleParams'
      responses:
        '200':
          description: Article upserted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Article'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Provide your Gradient Labs API key as a Bearer token in the
        Authorization header. Some administrative endpoints (tools) require a
        Management API key.
  parameters:
    ConversationID:
      name: conversationID
      in: path
      required: true
      description: Your unique identifier for the conversation.
      schema:
        type: string
  responses:
    Unauthorized:
      description: Missing or invalid API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Resource not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    TooManyRequests:
      description: Rate limit exceeded.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    ParticipantType:
      type: string
      description: The type of participant in a conversation.
      enum:
      - ai-agent
      - customer
      - human-agent
    Channel:
      type: string
      description: >-
        The channel a conversation is taking place on; determines how the AI
        agent formats its responses.
      enum:
      - email
      - chat
      - sms
      - voice
    StartConversationParams:
      type: object
      required:
      - id
      - customer_id
      - channel
      properties:
        id:
          type: string
          description: Uniquely identifies the conversation.
        customer_id:
          type: string
          description: >-
            Identifies the customer, used to build historical context across
            conversations.
        assignee_id:
          type: string
          description: The participant the conversation is assigned to.
        assignee_type:
          $ref: '#/components/schemas/ParticipantType'
        channel:
          $ref: '#/components/schemas/Channel'
        created:
          type: string
          format: date-time
          description: When the conversation started; defaults to now.
        resources:
          type: object
          additionalProperties: true
          description: Arbitrary data made available to the AI agent.
        conversation_token:
          type: string
          description: >-
            A sensitive token echoed back in webhooks and tool calls for this
            conversation.
        traffic_group_id:
          type: string
          description: Restricts the conversation to a specific group of procedures.
    Conversation:
      type: object
      properties:
        id:
          type: string
        customer_id:
          type: string
        channel:
          $ref: '#/components/schemas/Channel'
        assignee_id:
          type: string
        assignee_type:
          $ref: '#/components/schemas/ParticipantType'
        status:
          type: string
          description: Current lifecycle status of the conversation.
        created:
          type: string
          format: date-time
    AddMessageParams:
      type: object
      required:
      - id
      - body
      - participant_id
      - participant_type
      properties:
        id:
          type: string
          description: >-
            Unique message identifier (letters, numbers and _ - + = characters).
        body:
          type: string
          description: The message text.
        subject:
          type: string
          description: Email subject line, when applicable.
        participant_id:
          type: string
          description: Identifier of the sender.
        participant_type:
          $ref: '#/components/schemas/ParticipantType'
        created:
          type: string
          format: date-time
        attachments:
          type: array
          items:
            $ref: '#/components/schemas/Attachment'
    Message:
      type: object
      properties:
        id:
          type: string
        body:
          type: string
        subject:
          type: string
        participant_id:
          type: string
        participant_type:
          $ref: '#/components/schemas/ParticipantType'
        created:
          type: string
          format: date-time
        attachments:
          type: array
          items:
            $ref: '#/components/schemas/Attachment'
        conversation_token:
          type: string
    Attachment:
      type: object
      properties:
        id:
          type: string
        filename:
          type: string
        url:
          type: string
          format: uri
        content_type:
          type: string
    AssignmentParams:
      type: object
      required:
      - assignee_type
      properties:
        assignee_id:
          type: string
          description: The specific user the conversation is being assigned to.
        assignee_type:
          $ref: '#/components/schemas/ParticipantType'
        timestamp:
          type: string
          format: date-time
          description: When the assignment happened; defaults to now.
        reason:
          type: string
          description: Optional description of why this assignment is happening.
    LifecycleParams:
      type: object
      description: Common parameters for finish, cancel, and resume operations.
      properties:
        timestamp:
          type: string
          format: date-time
          description: When the lifecycle change occurred; defaults to now.
        reason:
          type: string
          description: Optional description of why the change is happening.
    RatingParams:
      type: object
      required:
      - type
      - value
      - max_value
      - min_value
      properties:
        type:
          type: string
          description: The type of survey sent to the customer (e.g. csat).
        value:
          type: integer
          description: The rating score the customer gave.
        max_value:
          type: integer
          description: Maximum value of the rating scale.
        min_value:
          type: integer
          description: Minimum value of the rating scale.
        comments:
          type: string
          description: Optional free-text feedback from the customer.
        timestamp:
          type: string
          format: date-time
          description: When the rating was given; defaults to now.
    Tool:
      type: object
      description: >-
        A business tool the AI agent can call. Fields are modeled; verify the
        exact shape against the gated API reference.
      properties:
        id:
          type: string
        name:
          type: string
        description:
          type: string
        parameters:
          type: array
          items:
            $ref: '#/components/schemas/ToolParameter'
        execution:
          type: string
          description: >-
            How the tool is executed - via webhook (action.execute delivered to
            your endpoint) or via a configured HTTP request.
    ToolParameter:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        type:
          type: string
        required:
          type: boolean
    ExecutionParams:
      type: object
      required:
      - id
      properties:
        id:
          type: string
          description: The tool identifier.
        arguments:
          type: array
          items:
            $ref: '#/components/schemas/Argument'
    Argument:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
    ExecuteResult:
      type: object
      properties:
        id:
          type: string
          description: The tool identifier.
        result:
          description: The JSON-encoded result of the tool execution, if it succeeded.
        error:
          type: string
          description: Error message if execution failed.
    UpsertArticleParams:
      type: object
      required:
      - id
      properties:
        id:
          type: string
          description: Your chosen identifier for the article.
        author_id:
          type: string
          description: Identifies the user who last edited the article.
        title:
          type: string
          description: The article's heading (may be empty for drafts).
        description:
          type: string
          description: A tagline for the article.
        body:
          type: string
          description: The main content (may be empty for drafts).
        visibility:
          type: string
          description: Access level (e.g. public, internal).
        topic_id:
          type: string
          description: Associated topic identifier.
        status:
          type: string
          description: Publication state (e.g. published, draft).
        data:
          type: object
          additionalProperties: true
          description: Additional metadata as JSON.
        created:
          type: string
          format: date-time
        last_edited:
          type: string
          format: date-time
    Article:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        description:
          type: string
        body:
          type: string
        visibility:
          type: string
        topic_id:
          type: string
        status:
          type: string
        created:
          type: string
          format: date-time
        last_edited:
          type: string
          format: date-time
    Error:
      type: object
      properties:
        error:
          type: string
        message:
          type: string
    WebhookEnvelope:
      type: object
      description: >-
        Common envelope for all webhook events the AI agent delivers. Requests
        are signed; verify them with your webhook signing key. The
        sequence_number increments per conversation so you can establish a total
        order of events.
      properties:
        id:
          type: string
          description: Unique event identifier.
        type:
          type: string
          description: The event type.
          enum:
          - agent.message
          - conversation.hand_off
          - conversation.finished
          - action.execute
          - resource.pull
        sequence_number:
          type: integer
          description: Incrementing number establishing total event order.
        timestamp:
          type: string
          format: date-time
        data:
          type: object
          additionalProperties: true
          description: >-
            Event-specific payload. For agent.message includes conversation,
            body, total, sequence, intent, is_holding. For
            conversation.hand_off includes conversation, target, reason_code,
            reason, note, intent. For conversation.finished includes
            conversation, reason_code, intent. For action.execute includes
            action, params, conversation. For resource.pull includes
            resource_type, conversation.
webhooks:
  agentMessage:
    post:
      summary: agent.message
      description: >-
        Delivered when the AI agent produces an outbound message for the
        customer.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookEnvelope'
      responses:
        '200':
          description: Acknowledged.
  conversationHandOff:
    post:
      summary: conversation.hand_off
      description: >-
        Delivered when the AI agent escalates a conversation to a human agent,
        including reason_code, reason, target, and note.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookEnvelope'
      responses:
        '200':
          description: Acknowledged.
  conversationFinished:
    post:
      summary: conversation.finished
      description: >-
        Delivered when the AI agent concludes a conversation, including
        reason_code and classified intent.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookEnvelope'
      responses:
        '200':
          description: Acknowledged.
  actionExecute:
    post:
      summary: action.execute
      description: >-
        Delivered when the AI agent needs your system to execute an action
        (tool), including the action name and params.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookEnvelope'
      responses:
        '200':
          description: Acknowledged.
  resourcePull:
    post:
      summary: resource.pull
      description: >-
        Delivered when the AI agent wants to pull a resource of a given
        resource_type for the conversation.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookEnvelope'
      responses:
        '200':
          description: Acknowledged.