Opply Tasks API

The Tasks API from Opply — 17 operation(s) for tasks.

Operations 26

GET /api/v1/chat/ List a task's chat messages #
POST /api/v1/chat/ Post a chat message #
POST /api/v1/chat/{uuid}/react/ Add or remove an emoji reaction on a chat message #
DELETE /api/v1/chat/{uuid}/react/ Add or remove an emoji reaction on a chat message #
POST /api/v1/chat/mark-read/ Mark a task's chat read #
GET /api/v1/task-recurrences/{uuid}/ Get a recurring-task series #
PATCH /api/v1/task-recurrences/{uuid}/ Partially update a recurring-task series #
POST /api/v1/task-recurrences/{uuid}/disable/ Pause a recurring-task series (Turn off repeat) #
POST /api/v1/task-recurrences/{uuid}/enable/ Resume a recurring-task series #
GET /api/v1/tasks/ List tasks #
POST /api/v1/tasks/ Create a task #
GET /api/v1/tasks/{uuid}/ Get a task #
PUT /api/v1/tasks/{uuid}/ Update a task #
PATCH /api/v1/tasks/{uuid}/ Partially update a task #
DELETE /api/v1/tasks/{uuid}/ Delete a task #
GET /api/v1/tasks/{uuid}/attachments/ List task attachments #
POST /api/v1/tasks/{uuid}/attachments/ List task attachments #
DELETE /api/v1/tasks/{uuid}/attachments/{attachment_uuid}/ Delete a task attachment #
POST /api/v1/tasks/{uuid}/plan/approve/ Approve the pending agent plan (version-pinned) #
POST /api/v1/tasks/{uuid}/plan/reject/ Reject the pending agent plan (task returns to humans, agent unassigned) #
POST /api/v1/tasks/{uuid}/repeat/ Set, update, or clear a task's recurrence #
DELETE /api/v1/tasks/{uuid}/repeat/ Set, update, or clear a task's recurrence #
POST /api/v1/tasks/{uuid}/route/ Route a MoR-routed task to a worker (by role) #
GET /api/v1/tasks/{uuid}/route-targets/ List the routable targets for a MoR-routed task #
GET /api/v1/tasks/me/ List tasks assigned to current user #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/opply-tasks-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

opply-tasks-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Opply Activity Feed Tasks API
  version: 0.0.0
servers:
- url: https://api.opply.com
  description: Base URL declared by the provider in apis.yml (roadmap#122).
tags:
- name: Tasks
paths:
  /api/v1/chat/:
    get:
      operationId: api_v1_chat_list
      description: Comments on tasks (channel-neutral ``Message`` rows).
      summary: List a task's chat messages
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - in: query
        name: task_uuid
        schema:
          type: string
          format: uuid
        description: UUID of the task whose chat to list.
        required: true
      - in: query
        name: thread
        schema:
          type: string
          enum:
          - main
          - plan
          default: main
        description: 'Which of the task''s chat threads to target: `main` (default — the task conversation) or `plan` (the plan-discussion thread on the Plan tab).'
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedMessageReadList'
          description: ''
    post:
      operationId: api_v1_chat_create
      description: Comments on tasks (channel-neutral ``Message`` rows).
      summary: Post a chat message
      tags:
      - Tasks
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MessageWrite'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/MessageWrite'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/MessageWrite'
        required: true
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MessageRead'
          description: ''
  /api/v1/chat/{uuid}/react/:
    post:
      operationId: api_v1_chat_react_create
      description: POST adds the caller's reaction (idempotent); DELETE removes it. The emoji (a query param) must be one of the fixed MessageReactionEmoji palette. Returns the message with its updated aggregated reactions.
      summary: Add or remove an emoji reaction on a chat message
      parameters:
      - in: query
        name: emoji
        schema:
          type: string
          enum:
          - ✅
          - ❤️
          - 🎉
          - 👀
          - 👍
          - 😂
        description: The reaction emoji (fixed palette).
        required: true
      - in: path
        name: uuid
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MessageRead'
          description: ''
    delete:
      operationId: api_v1_chat_react_destroy
      description: POST adds the caller's reaction (idempotent); DELETE removes it. The emoji (a query param) must be one of the fixed MessageReactionEmoji palette. Returns the message with its updated aggregated reactions.
      summary: Add or remove an emoji reaction on a chat message
      parameters:
      - in: query
        name: emoji
        schema:
          type: string
          enum:
          - ✅
          - ❤️
          - 🎉
          - 👀
          - 👍
          - 😂
        description: The reaction emoji (fixed palette).
        required: true
      - in: path
        name: uuid
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MessageRead'
          description: ''
  /api/v1/chat/mark-read/:
    post:
      operationId: api_v1_chat_mark_read_create
      description: 'Advance the caller''s read cursor on a task''s chat to now.


        Anyone who can see the task (and thus its chat) may mark it read for

        themselves — read-state is per-user and innocuous. Resolves the task

        caller-scoped, so an out-of-scope uuid is a 404. ``thread`` picks

        which conversation''s cursor advances (main default | plan).'
      summary: Mark a task's chat read
      parameters:
      - in: query
        name: task_uuid
        schema:
          type: string
          format: uuid
        description: UUID of the task whose chat to mark read.
        required: true
      - in: query
        name: thread
        schema:
          type: string
          enum:
          - main
          - plan
          default: main
        description: 'Which of the task''s chat threads to target: `main` (default — the task conversation) or `plan` (the plan-discussion thread on the Plan tab).'
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
          description: ''
  /api/v1/task-recurrences/{uuid}/:
    get:
      operationId: api_v1_task_recurrences_retrieve
      description: 'Manage an existing recurring-task series (the template''s recurrence).


        Creation happens implicitly when a task is created with a ``recurrence``

        block (see ``TaskSerializer``); this surface is for reading the series,

        editing its schedule / default assignee for *future* occurrences, and

        pausing / resuming it. Hard-scoped to the caller''s company via the

        queryset — a leaked UUID can''t reach another tenant''s series.'
      summary: Get a recurring-task series
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskRecurrence'
          description: ''
    patch:
      operationId: api_v1_task_recurrences_partial_update
      description: 'Manage an existing recurring-task series (the template''s recurrence).


        Creation happens implicitly when a task is created with a ``recurrence``

        block (see ``TaskSerializer``); this surface is for reading the series,

        editing its schedule / default assignee for *future* occurrences, and

        pausing / resuming it. Hard-scoped to the caller''s company via the

        queryset — a leaked UUID can''t reach another tenant''s series.'
      summary: Partially update a recurring-task series
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Tasks
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedTaskRecurrence'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedTaskRecurrence'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedTaskRecurrence'
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskRecurrence'
          description: ''
  /api/v1/task-recurrences/{uuid}/disable/:
    post:
      operationId: api_v1_task_recurrences_disable_create
      description: 'Manage an existing recurring-task series (the template''s recurrence).


        Creation happens implicitly when a task is created with a ``recurrence``

        block (see ``TaskSerializer``); this surface is for reading the series,

        editing its schedule / default assignee for *future* occurrences, and

        pausing / resuming it. Hard-scoped to the caller''s company via the

        queryset — a leaked UUID can''t reach another tenant''s series.'
      summary: Pause a recurring-task series (Turn off repeat)
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskRecurrence'
          description: ''
  /api/v1/task-recurrences/{uuid}/enable/:
    post:
      operationId: api_v1_task_recurrences_enable_create
      description: 'Manage an existing recurring-task series (the template''s recurrence).


        Creation happens implicitly when a task is created with a ``recurrence``

        block (see ``TaskSerializer``); this surface is for reading the series,

        editing its schedule / default assignee for *future* occurrences, and

        pausing / resuming it. Hard-scoped to the caller''s company via the

        queryset — a leaked UUID can''t reach another tenant''s series.'
      summary: Resume a recurring-task series
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskRecurrence'
          description: ''
  /api/v1/tasks/:
    get:
      operationId: api_v1_tasks_list
      description: 'ViewSet for managing tasks.


        Tasks can be attached to entities (companies) or standalone.

        MoR users can only see tasks for companies they manage.'
      summary: List tasks
      parameters:
      - name: page
        required: false
        in: query
        description: A page number within the paginated result set.
        schema:
          type: integer
      - name: page_size
        required: false
        in: query
        description: Number of results to return per page.
        schema:
          type: integer
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTaskList'
          description: ''
    post:
      operationId: api_v1_tasks_create
      description: 'ViewSet for managing tasks.


        Tasks can be attached to entities (companies) or standalone.

        MoR users can only see tasks for companies they manage.'
      summary: Create a task
      tags:
      - Tasks
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Task'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Task'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/Task'
        required: true
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Task'
          description: ''
  /api/v1/tasks/{uuid}/:
    get:
      operationId: api_v1_tasks_retrieve
      description: 'ViewSet for managing tasks.


        Tasks can be attached to entities (companies) or standalone.

        MoR users can only see tasks for companies they manage.'
      summary: Get a task
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Task'
          description: ''
    put:
      operationId: api_v1_tasks_update
      description: 'ViewSet for managing tasks.


        Tasks can be attached to entities (companies) or standalone.

        MoR users can only see tasks for companies they manage.'
      summary: Update a task
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Task'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Task'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/Task'
        required: true
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Task'
          description: ''
    patch:
      operationId: api_v1_tasks_partial_update
      description: 'ViewSet for managing tasks.


        Tasks can be attached to entities (companies) or standalone.

        MoR users can only see tasks for companies they manage.'
      summary: Partially update a task
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedTask'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PatchedTask'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PatchedTask'
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Task'
          description: ''
    delete:
      operationId: api_v1_tasks_destroy
      description: 'ViewSet for managing tasks.


        Tasks can be attached to entities (companies) or standalone.

        MoR users can only see tasks for companies they manage.'
      summary: Delete a task
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '204':
          description: No response body
  /api/v1/tasks/{uuid}/attachments/:
    get:
      operationId: api_v1_tasks_attachments_retrieve
      description: 'ViewSet for managing tasks.


        Tasks can be attached to entities (companies) or standalone.

        MoR users can only see tasks for companies they manage.'
      summary: List task attachments
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskAttachment'
          description: ''
    post:
      operationId: api_v1_tasks_attachments_create
      description: 'ViewSet for managing tasks.


        Tasks can be attached to entities (companies) or standalone.

        MoR users can only see tasks for companies they manage.'
      summary: List task attachments
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TaskAttachment'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TaskAttachment'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TaskAttachment'
        required: true
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskAttachment'
          description: ''
  /api/v1/tasks/{uuid}/attachments/{attachment_uuid}/:
    delete:
      operationId: api_v1_tasks_attachments_destroy
      description: 'ViewSet for managing tasks.


        Tasks can be attached to entities (companies) or standalone.

        MoR users can only see tasks for companies they manage.'
      summary: Delete a task attachment
      parameters:
      - in: path
        name: attachment_uuid
        schema:
          type: string
        required: true
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '204':
          description: No response body
  /api/v1/tasks/{uuid}/plan/approve/:
    post:
      operationId: api_v1_tasks_plan_approve_create
      description: 'ViewSet for managing tasks.


        Tasks can be attached to entities (companies) or standalone.

        MoR users can only see tasks for companies they manage.'
      summary: Approve the pending agent plan (version-pinned)
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TaskPlanApprove'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TaskPlanApprove'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TaskPlanApprove'
        required: true
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskPlan'
          description: ''
  /api/v1/tasks/{uuid}/plan/reject/:
    post:
      operationId: api_v1_tasks_plan_reject_create
      description: 'ViewSet for managing tasks.


        Tasks can be attached to entities (companies) or standalone.

        MoR users can only see tasks for companies they manage.'
      summary: Reject the pending agent plan (task returns to humans, agent unassigned)
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TaskPlanReject'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TaskPlanReject'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TaskPlanReject'
        required: true
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskPlan'
          description: ''
  /api/v1/tasks/{uuid}/repeat/:
    post:
      operationId: api_v1_tasks_repeat_create
      description: "Make an existing task recurring, change its rule, or stop it repeating.\n\n- ``POST`` with a recurrence config: if the task already belongs to a\n  series, update that series' rule; otherwise promote it in place (mint a\n  template, make this task occurrence #1).\n- ``DELETE``: \"Does not repeat\" — stop the series (occurrences survive)."
      summary: Set, update, or clear a task's recurrence
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Task'
          description: ''
    delete:
      operationId: api_v1_tasks_repeat_destroy
      description: "Make an existing task recurring, change its rule, or stop it repeating.\n\n- ``POST`` with a recurrence config: if the task already belongs to a\n  series, update that series' rule; otherwise promote it in place (mint a\n  template, make this task occurrence #1).\n- ``DELETE``: \"Does not repeat\" — stop the series (occurrences survive)."
      summary: Set, update, or clear a task's recurrence
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '204':
          description: No response body
  /api/v1/tasks/{uuid}/route/:
    post:
      operationId: api_v1_tasks_route_create
      description: Reassign a task routed to 'Opply' to the resolved worker for the given role (account_manager / mor_agent / buyer_agent / return_to_buyer). The backend resolves the concrete user; agent targets are dispatched via a fresh run. Router-agent (or MoR-side current assignee) only.
      summary: Route a MoR-routed task to a worker (by role)
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RouteTaskInput'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/RouteTaskInput'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/RouteTaskInput'
        required: true
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Task'
          description: ''
  /api/v1/tasks/{uuid}/route-targets/:
    get:
      operationId: api_v1_tasks_route_targets_retrieve
      description: Which account manager / MoR agents / buyer agents this routed task can be routed to. Router-agent (or MoR-side current assignee) only.
      summary: List the routable targets for a MoR-routed task
      parameters:
      - in: path
        name: uuid
        schema:
          type: string
        required: true
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RouteTargetsResponse'
          description: ''
  /api/v1/tasks/me/:
    get:
      operationId: api_v1_tasks_me_retrieve
      description: 'List tasks assigned to the current user.


        Returns tasks from two sources:

        1. Task records (activities app) - where assignee is current user

        2. OrderActivity records (app_orders) - where task_assignee is current user


        Both are merged into a unified response format.'
      summary: List tasks assigned to current user
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Task'
          description: ''
  /api/v1/tasks/related-search/:
    get:
      operationId: api_v1_tasks_related_search_list
      description: 'Unified "Related to" search across the caller''s orders, suppliers,

        contracts, ingredients and tasks. Returns a flat list grouped client-side

        by ``type``; empty without a `search` query (except for MoR callers).'
      summary: Search linkable related items
      parameters:
      - in: query
        name: exclude_task
        schema:
          type: string
        description: UUID of the task currently being edited, excluded from task results so it can't be related to itself.
      - in: query
        name: search
        schema:
          type: string
        description: Search text used to match linkable related items (orders, suppliers, contracts, ingredients, tasks). Results are empty without it.
      tags:
      - Tasks
      security:
      - tokenAuth: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/RelatedTarget'
          description: ''
components:
  schemas:
    MessageRead:
      type: object
      properties:
        uuid:
          type: string
          format: uuid
          readOnly: true
        author:
          allOf:
          - $ref: '#/components/schemas/UserMinimal'
          readOnly: true
        body:
          type: string
          readOnly: true
        body_plain:
          type: string
          readOnly: true
        mentioned_users:
          type: array
          items:
            $ref: '#/components/schemas/UserMinimal'
          readOnly: true
        reactions:
          type: array
          items:
            $ref: '#/components/schemas/MessageReactionSummary'
          readOnly: true
        created:
          type: string
          format: date-time
          readOnly: true
        modified:
          type: string
          format: date-time
          readOnly: true
        is_unread:
          type: boolean
          description: 'Whether this message is unread *for the caller* — drives the FE''s

            "new messages" divider.


            Unread = created after the caller''s read cursor AND not authored by

            them (mirrors the ``unread_chat_count`` annotation in ``views/tasks``).

            The viewset''s ``list`` passes ``viewer_id`` + ``unread_after`` (the

            caller''s ``last_read_at``, or ``None`` when they''ve never opened the

            chat → every message is unread). When the context is absent (the create

            response, schema generation) nothing is unread.'
          readOnly: true
        is_own:
          type: boolean
          description: 'Whether the CALLER authored this message — computed against the raw

            ``author_id`` BEFORE any routed-task masking, and leaking nothing (it''s

            true only for the caller''s own rows).


            Exists because masking collapses every agent/MoR author into one

            "Opply" payload with the router shadow''s uuid: a masked reader — most

            importantly the chat-phase agent reading its transcripts via

            ``get_my_task`` — cannot otherwise tell its OWN earlier replies apart

            from other actors'' messages.'
          readOnly: true
        attachments:
          type: array
          items:
            $ref: '#/components/schemas/MessageAttachmentRef'
          readOnly: true
      required:
      - attachments
      - author
      - body
      - body_plain
      - created
      - is_own
      - is_unread
      - mentioned_users
      - modified
      - reactions
      - uuid
    MessageAttachmentRef:
      type: object
      description: 'One attachment ref carried on a message''s ``metadata["attachments"]``

        (SC-4146). Channel-neutral and reusable by **any** message serializer (agent

        chat today; task chat / private notes next) — nest it with ``many=True,

        required=False`` so a message that carried no attachments omits the key.


        Read-only projection of the dicts written by

        :func:`~apps.files.services.message_attachments.resolve_and_gate_attachments`;

        carries no bytes / URL — the FE mints a short-TTL presigned URL from ``uuid``

        when it renders a preview. ``disposition``''s enum name is pinned via

        ``ENUM_NAME_OVERRIDES`` (``MessageAttachmentDispositionEnum``) so the shared

        component doesn''t collide in the generated OpenAPI schema.'
      properties:
        uuid:
          type: string
          format: uuid
          readOnly: true
        filename:
          type: string
          readOnly: true
        mime:
          type: string
          readOnly: true
        disposition:
          allOf:
          - $ref: '#/components/schemas/MessageAttachmentDispositionEnum'
          readOnly: true
      required:
      - disposition
      - filename
      - mime
      - uuid
    TaskRecurrence:
      type: object
      description: Read/update surface for an existing series (the template's recurrence).
      properties:
        uuid:
          type: string
          format: uuid
          readOnly: true
        task:
          type: string
          readOnly: true
        is_enabled:
          type: boolean
          readOnly: true
          description: When false the series is paused — the beat skips it ('Turn off repeat').
        frequency:
          $ref: '#/components/schemas/TaskRecurrenceFrequencyEnum'
        interval:
          type: integer
          minimum: 1
        weekdays:
          type: array
          items:
            $ref: '#/components/schemas/TaskRecurrenceWeekdayEnum'
          description: 'Weekly recurrences only: weekdays the series fires on (iCal codes MO..SU).'
        day_of_month:
          type:
          - integer
          - 'null'
          maximum: 31
          minimum: 1
        monthly_mode:
          allOf:
          - $ref: '#/components/schemas/TaskRecurrenceMonthlyModeEnum'
          description: 'Monthly recurrences: fire on a fixed day-of-month, or on the Nth weekday.


            * `day_of_month` - Day of month

            * `nth_weekday` - Nth weekday'
        weekday_ordinal:
          type:
          - integer
          - 'null'
          maximum: 32767
          minimum: -32768
          description: 'Monthly nth_weekday mode: which occurrence of weekdays[0] to fire on (1-4, or -1 for the last). Signed, so -1 fits.'
        cron_expression:
          type:
          - string
          - 'null'
          description: 'frequency=cron: standard 5-field cron expression (min hour dom mon dow). Evaluated with croniter in the recurrence timezone; the interval/weekday/day-of-month fields are ignored. Materialised by the every-minute materialize_due_cron_recurrences beat (~1-min effective granularity).'
          maxLength: 120
        starts_at:
          type: string
          format: date-time
          description: rrule dtstart anchor. The first slot is the first occurrence >= this moment.
        timezone:
          type: string
        ends_mode:
          $ref: '#/components/schemas/TaskRecurrenceEndsModeEnum'
        ends_on:
          type:
          - string
          - 'null'
          format: date
          description: 'ends_mode=on_date: no occurrence is materialised after this date.'
        ends_after_count:
          type:
          - integer
          - 'null'
          maximum: 2147483647
          minimum: 0
          description: 'ends_mode=after_count: stop after this many occurrences have been materialised.'
        occurrences_created:
          type: integer
          readOnly: true
          description: Occurrences materialised so far (enforces ends_after_count).
        next_run_at:
          type: string
          format: date-time
          readOnly: true
          description: Next slot the beat will materialise. The beat's hot-query column.
        last_run_at:
          type:
          - string
          - 'null'
          format: date-time
          readOnly: true
        overlap_policy:
          allOf:
          - $ref: '#/components/schemas/TaskRecurrenceOverlapPolicyEnum'
          description: 'What to do at a new slot when a prior occurrence is still open.


            * `skip` - Skip


# --- truncated at 32 KB (69 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/opply/refs/heads/main/openapi/opply-tasks-api-openapi.yml