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

# Upsert a per diem code

> Insert the per diem code, or update it when a row with a conflicting unique key already exists. `update` is required and lists which columns to overwrite on conflict.

Matching is by `id` — the one in the path. If the `code` you send already belongs to a different entry, the request is rejected with `409`.



## OpenAPI

````yaml /openapi.yaml put /per-diem-code/{id}
openapi: 3.0.3
info:
  title: BuildingSwell Public API
  version: 2.0.0
  description: >
    The BuildingSwell v2 public API. Every request needs an `X-API-Key` header,
    and

    every key is scoped to one organization, so you only ever see your own data.


    Base URL: `https://app.buildingswell.com/api/v2`


    Most resources share the same CRUD and query shape. Read the

    [standard endpoints](/guides/standard-endpoints) and

    [querying](/guides/querying) guides once and the rest of this reference
    follows

    the same rules. For what a delete actually removes, see

    [archiving and deleting](/guides/archiving-and-deleting).
servers:
  - url: https://{instance}/api/v2
    description: Your BuildingSwell instance
    variables:
      instance:
        default: app.buildingswell.com
        description: Your BuildingSwell host
security:
  - ApiKeyAuth: []
tags:
  - name: Projects
    description: Customer jobs, and the archive behavior they share with most resources.
  - name: Stages
    description: Reusable shop stations, scoped to a department.
  - name: Deliverables
    description: >-
      The work tree: orders, routes, phases, components, stages, steps, and QC
      steps.
  - name: Work sessions
    description: Time logged by one person against one deliverable.
  - name: Dependencies
    description: Scheduling links between deliverables.
  - name: Documents
    description: Files attached to orders.
  - name: QC
    description: QC templates and the inspection sets filled from them.
  - name: People (Workers)
    description: Your workforce roster. Called People in the app and `worker` in the API.
  - name: Timesheets
    description: Read-only view over attendance and work sessions.
  - name: Codes
    description: Cost, union, and per diem code lists. Referenced by value, not by id.
  - name: Roles
    description: Permission roles, and the statements that make them up.
  - name: Users
    description: >-
      People with a BuildingSwell login. Called Users in the app and
      `organization-member` in the API.
  - name: Concepts
    description: Deliverable writes with the nesting rules enforced.
  - name: Items
    description: Material and part definitions, purchasing units, and availability.
  - name: Item vendors
    description: Supplier SKUs linked to items.
  - name: Inventory stock
    description: Read-only quantities by item and location.
  - name: Inventory transactions
    description: The inventory ledger and its posting rules.
  - name: Inventory allocations
    description: Read-only reservations for orders and projects.
  - name: BOM lines
    description: Planned material inputs for routes, orders, and projects.
  - name: Production outputs
    description: Declarations of manufactured outputs.
  - name: Units of measure
    description: Reusable names and abbreviations for quantities.
  - name: Vendors
    description: Suppliers, manufacturers, and subcontractors.
  - name: Locations
    description: Department and project locations for storage and delivery.
  - name: Deliveries
    description: Inbound receipts, outbound trips, and transfers.
  - name: Delivery lines
    description: Material and ad-hoc manifest lines.
  - name: Trucks
    description: Fleet vehicles and their capacity.
  - name: Contacts
    description: Drivers, receivers, and other business contacts.
  - name: Project contacts
    description: Links between projects and contacts.
  - name: Teams
    description: Read-only department teams.
  - name: Shifts
    description: Read-only department shifts.
  - name: Departments (shops)
    description: Read-only departments, called shops in the API.
  - name: Custom properties
    description: Organization property definitions and values on orders.
paths:
  /per-diem-code/{id}:
    put:
      tags:
        - Codes
      summary: Upsert a per diem code
      description: >-
        Insert the per diem code, or update it when a row with a conflicting
        unique key already exists. `update` is required and lists which columns
        to overwrite on conflict.


        Matching is by `id` — the one in the path. If the `code` you send
        already belongs to a different entry, the request is rejected with
        `409`.
      parameters:
        - $ref: '#/components/parameters/id'
        - $ref: '#/components/parameters/update'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CodeCreate'
      responses:
        '200':
          description: The upserted per diem code.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CodeSingleResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  parameters:
    id:
      name: id
      in: path
      required: true
      description: Record id.
      schema:
        type: string
        format: uuid
    update:
      name: update
      in: query
      required: true
      description: >-
        Columns to overwrite when the row already exists. Repeat the parameter
        for each column: a single comma-separated value is read as one column
        name and fails at the database. Without the parameter the request is
        rejected with `400`.
      schema:
        type: array
        items:
          type: string
      style: form
      explode: true
      example:
        - name
        - costCode
  schemas:
    CodeCreate:
      type: object
      required:
        - code
      properties:
        id:
          type: string
          format: uuid
          description: Unique id. Generated on create unless you supply one.
        code:
          type: string
          description: >-
            The code value itself, for example `LOC-123`. Trimmed on write and
            unique within your organization for this list.
          minLength: 1
        description:
          type: string
          description: What the code is for. Trimmed on write. Defaults to `null`.
          nullable: true
        isActive:
          type: boolean
          description: Whether the code is still offered for new work. Defaults to `true`.
          default: true
        createdAt:
          type: string
          format: date-time
          description: When the record was created.
        updatedAt:
          type: string
          format: date-time
          description: When the record last changed.
    CodeSingleResponse:
      type: object
      properties:
        value:
          $ref: '#/components/schemas/Code'
      required:
        - value
    Code:
      type: object
      description: >-
        One entry in a code list. Cost, union, and per diem codes are three
        separate lists that share this shape and behave identically.
      properties:
        id:
          type: string
          format: uuid
          description: Unique id. Generated on create unless you supply one.
        organizationId:
          type: string
          format: uuid
          description: >-
            Your organization. Taken from the API key, never from the request
            body.
        code:
          type: string
          description: >-
            The code value itself, for example `LOC-123`. Trimmed on write and
            unique within your organization for this list. This is the value
            that records reference, not the id.
          minLength: 1
        description:
          type: string
          description: What the code is for. Trimmed on write.
          nullable: true
        isActive:
          type: boolean
          description: >-
            Whether the code is still offered for new work. Inactive codes stay
            valid on records that already carry them, and are still returned by
            the list endpoint unless you filter them out.
          default: true
        createdAt:
          type: string
          format: date-time
          description: When the record was created.
        updatedAt:
          type: string
          format: date-time
          description: When the record last changed.
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            message:
              type: string
              description: What went wrong, in plain language.
            code:
              type: string
              enum:
                - BAD_REQUEST
                - UNAUTHORIZED
                - FORBIDDEN
                - NOT_FOUND
                - CONFLICT
                - VALIDATION
                - UNIQUE_VIOLATION
                - FK_VIOLATION
                - RATE_LIMITED
                - INTERNAL
              description: >-
                Stable machine-readable code. Branch on this rather than on the
                message text.
            requestId:
              type: string
              description: Id for this request. Quote it when you contact support.
            details:
              type: array
              items:
                type: object
                description: One field-level problem.
                properties:
                  path:
                    type: string
                    description: Field that failed, for example `data.stageId`.
                  message:
                    type: string
                    description: Why it failed.
                  code:
                    type: string
                    description: Validation code.
              description: Per-field problems. Present on validation failures only.
            missingPermissions:
              type: array
              items:
                type: string
                description: Permission name.
              description: Permissions your key is missing. Present on `403` only.
        context:
          type: object
          description: Extra context for the error. Usually empty.
          additionalProperties: true
  responses:
    BadRequest:
      description: >-
        The request was malformed or failed validation. Check `error.details`
        for the fields at fault.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: The `X-API-Key` header is missing or the key is invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: >-
        Your key lacks the permission for this call. `error.missingPermissions`
        lists what is needed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: No record with that id in your organization.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Conflict:
      description: >-
        The write conflicts with existing data: a duplicate unique value
        (`UNIQUE_VIOLATION`), or a related record that blocks it
        (`FK_VIOLATION`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: >-
        Too many requests. Read `RateLimit-Reset` for when to retry. This
        response also carries a top-level `message` alongside `error`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Organization-scoped API key. Create one in the BuildingSwell app under
        Organization settings, API keys.

````