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

# Create or update a task

> Creates a new task or updates an existing one if a duplicate
is detected (same phone + type + status=open for the partner).




## OpenAPI

````yaml openapi.yaml post /task
openapi: 3.1.0
info:
  title: Thalamus Partner API
  description: >
    API for external systems (n8n, Zendesk connectors, etc.) to create and
    manage

    tickets, contacts, organizations, and comments in Thalamus.


    ## Authentication

    All endpoints require a Bearer token in the Authorization header.

    API keys are issued per partner and follow the format
    `nerds_{environment}_{random}`.

    The partner context (partner_uuid) is derived from the API key — no need to
    pass it in the request body.


    ## Conventions

    - All create/update endpoints are idempotent (upsert) — if the `id` already
    exists for the partner, the record is updated.

    - IDs in path parameters and request/response bodies refer to the canonical
    identifiers from the partner's source system (e.g., Zendesk ticket ID).

    - Timestamps use ISO 8601 format.

    - All responses follow `{ success, data?, message?, error? }` shape.

    - POST returns `201` when a new record is created, `200` when an existing
    record is updated.

    - Only provided fields are updated — omitted fields remain unchanged
    (partial update).
  version: 1.3.0
  contact:
    name: Thalamus Engineering
    email: development@nerds.nl
servers:
  - url: https://thalamus.nerds.nl/api/v1/partner
    description: Production
  - url: http://localhost:3001/api/v1/partner
    description: Local development
security:
  - BearerAuth: []
tags:
  - name: Tickets
    description: Create, update, and retrieve tickets
  - name: Comments
    description: Create comments on tickets
  - name: Contacts
    description: Create, update, and retrieve contacts
  - name: Organizations
    description: Create, update, and retrieve organizations
  - name: Tasks
    description: Create task records (callbacks, appointments, etc.)
  - name: References
    description: Manage reference data (statuses, types, groups, categories, agents)
paths:
  /task:
    post:
      tags:
        - Tasks
      summary: Create or update a task
      description: |
        Creates a new task or updates an existing one if a duplicate
        is detected (same phone + type + status=open for the partner).
      operationId: upsertTask
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TaskCreateBody'
      responses:
        '200':
          description: Task updated (duplicate)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskResponse'
        '201':
          description: Task created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  schemas:
    TaskCreateBody:
      type: object
      required:
        - type
        - phone
        - campaign_uuid
        - skill_uuid
      properties:
        type:
          type: string
          enum:
            - callback
            - appointment
            - ticket
            - chat
            - abandoned
          example: callback
        phone:
          type: string
          example: '+31612345678'
        campaign_uuid:
          type: string
          format: uuid
          example: 770e8400-e29b-41d4-a716-446655440000
        skill_uuid:
          type: string
          format: uuid
          example: 550e8400-e29b-41d4-a716-446655440000
        name:
          type: string
          nullable: true
          example: John Doe
        email:
          type: string
          format: email
          nullable: true
          example: john@example.com
        reference:
          type: string
          nullable: true
          description: Ticket ID to link to this queue record
          example: '328099'
        agent_uuid:
          type: string
          format: uuid
          nullable: true
          description: Assign to specific agent
        comment:
          type: string
          nullable: true
        datetime_start:
          type: string
          format: date-time
          nullable: true
    TaskResponse:
      type: object
      properties:
        success:
          type: boolean
          example: true
        data:
          type: object
          properties:
            uuid:
              type: string
              format: uuid
            id:
              type: string
            type:
              type: string
            phone:
              type: string
            name:
              type: string
              nullable: true
            email:
              type: string
              nullable: true
            status:
              type: string
            campaign_uuid:
              type: string
              format: uuid
            reference:
              type: string
              nullable: true
            datetime_start:
              type: string
              format: date-time
              nullable: true
            created_at:
              type: string
              format: date-time
        message:
          type: string
    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
            details:
              type: array
              nullable: true
              items:
                type: object
                properties:
                  field:
                    type: string
                  message:
                    type: string
  responses:
    BadRequest:
      description: Invalid request body or parameters
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: INVALID_REQUEST
              message: 'Validation failed: body is required'
    Unauthorized:
      description: Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error:
              code: UNAUTHORIZED
              message: Invalid or revoked API key
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: Partner API key (e.g. `nerds_live_a8f3d9k2m5n7p1q4r6t8v0w2x4y6z8`)

````