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

# Create a shift

> Creates a new shift for the MDT.



## OpenAPI

````yaml /openapi.yaml post /mdts/{mdtId}/shifts
openapi: 3.1.0
info:
  title: Northca Partner API
  version: 1.1.0
  description: >-
    Partner-facing REST API for ER:LC and MC communities using Northca MDT.

    ## Response format

    All endpoints return JSON wrapped as:

    **Success**: `{ "ok": true, "data": ... }` **Error**: `{ "ok": false,
    "error": "..." }` 
servers:
  - url: https://api.northca.dev/v1
    description: Production (v1)
security:
  - PartnerKey: []
tags:
  - name: Link Requests
    description: >-
      Request and manage linking a Northca MDT to your ER:LC partner
      integration.
  - name: MDT Links
    description: List linked MDTs and unlink (owner-only) in a guild.
  - name: MDT Info
    description: Read public MDT configuration/info (map, departments, settings).
  - name: Calls
    description: Create, list, and update dispatch calls (CAD).
  - name: Scene Reports
    description: Create and list scene reports (incident summaries).
  - name: Shifts
    description: Create and list shifts (duty sessions).
  - name: Tickets
    description: Create and list unit tickets (tasks/citations/notes).
  - name: Active Units
    description: Upsert, list, delete active units, and trigger panic events (10-33).
paths:
  /mdts/{mdtId}/shifts:
    post:
      tags:
        - Shifts
      summary: Create a shift
      description: Creates a new shift for the MDT.
      parameters:
        - $ref: '#/components/parameters/MdtId'
        - $ref: '#/components/parameters/XDiscordGuild'
        - $ref: '#/components/parameters/XDiscordActor'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateShiftBody'
      responses:
        '201':
          description: Created shift.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/OkEnvelope'
                  - type: object
                    properties:
                      data:
                        $ref: '#/components/schemas/Shift'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/ServerError'
components:
  parameters:
    MdtId:
      name: mdtId
      in: path
      required: true
      schema:
        type: string
      description: MDT ID.
      example: 0c7f6a0c-2c4f-4f44-b16a-2b6b8d8fe2c2
    XDiscordGuild:
      name: x-discord-guild
      in: header
      required: true
      schema:
        type: string
      description: Discord Guild ID (server/guild context for the request).
      example: '123456789012345678'
    XDiscordActor:
      name: x-discord-actor
      in: header
      required: false
      schema:
        type: string
      description: Discord User ID for the acting user (optional; used for audit fields).
      example: '222222222222222222'
  schemas:
    CreateShiftBody:
      type: object
      additionalProperties: false
      properties:
        id:
          type: string
          description: Optional. If not provided, the server generates an ID.
        officer_name:
          type: string
          nullable: true
        officer_badge:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
          description: Optional. Defaults to "active".
        start_time:
          type: string
          format: date-time
          nullable: true
          description: Optional. Defaults to "now" if omitted.
        end_time:
          type: string
          format: date-time
          nullable: true
        duration_ms:
          type: integer
          nullable: true
        department:
          type: string
          nullable: true
      example:
        officer_name: B. Bubbleton
        officer_badge: '512'
        department: Patrol
        status: active
    OkEnvelope:
      type: object
      required:
        - ok
        - data
      properties:
        ok:
          type: boolean
          const: true
        data:
          description: Response payload.
          nullable: false
          type: object
          additionalProperties: true
    Shift:
      type: object
      description: Shift record.
      additionalProperties: true
      properties:
        id:
          type: string
        mdt_code:
          type: string
          nullable: true
        officer_name:
          type: string
          nullable: true
        officer_badge:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        start_time:
          type: string
          format: date-time
          nullable: true
        end_time:
          type: string
          format: date-time
          nullable: true
        duration_ms:
          type: integer
          nullable: true
        department:
          type: string
          nullable: true
        created_by_discord_id:
          type: string
          nullable: true
        updated_at:
          type: string
          format: date-time
          nullable: true
        created_at:
          type: string
          format: date-time
          nullable: true
    ErrorEnvelope:
      type: object
      required:
        - ok
        - error
      properties:
        ok:
          type: boolean
          const: false
        error:
          type: string
      additionalProperties: true
      example:
        ok: false
        error: Unauthorized
  responses:
    BadRequest:
      description: Invalid request body or parameters.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            ok: false
            error: Invalid JSON
    Unauthorized:
      description: Missing/invalid authentication or required headers.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            ok: false
            error: Unauthorized
    Forbidden:
      description: You do not have access to this resource in the provided guild context.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            ok: false
            error: MDT not linked to this guild
    ServerError:
      description: Internal server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  securitySchemes:
    PartnerKey:
      type: apiKey
      in: header
      name: x-partner-key
      description: Partner API key provided by Northca.

````