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

# Associate PR line items with a PO line item

> Associates the given purchase-request line items (comma-separated ids) with a purchase-order line item: each line item's status is set to "orderInProgress" and its associatedPurchaseOrderLineItemId to the given id, then each parent purchase request's status is recomputed from its line items. Ids the key has no read permission for are silently dropped. Returns the updated line items (envelope type "SupplierPurchaseRequestLineItem"). Not rate-limited.



## OpenAPI

````yaml /openapi/supplier.json patch /v1/supplier/inventory/purchase_request_line_items/associate_po_line_item/{ids}/{poLineItem}
openapi: 3.1.0
info:
  title: OpenWrench Supplier API
  version: 1.0.0
  description: >-
    External REST API for OpenWrench suppliers (service providers).


    ## Authentication

    Every request must carry a supplier API key in the `X-API-KEY` header. The
    key resolves to a supplier contact; all reads and writes are tenant-scoped
    to that contact's supplier facility/company. Missing or invalid keys are
    answered with 401.


    ## Rate limiting

    10 requests per 20-second window per API key. Requests beyond that are
    answered with 429 and the standard error envelope. (A few endpoints, noted
    in their descriptions, are not rate-limited.)


    ## Response envelope

    Single entity: `{"type": "<EntityName>", "data": {...}, "status": "ok"}`.
    Lists: `{"type": "<EntityName>", "data": [...], "count": <total>, "status":
    "ok"}`. count_by endpoints return the integer count in `data`. The `type`
    label is hard-coded on some endpoints (e.g. "WorkOrderNotes", "pingpong")
    and derived via Scala reflection on generic CRUD endpoints, where it may
    appear as the fully qualified server class name - treat it as informational.
    Errors: `{"message": "...", "type": "<ExceptionType>", "status": "error",
    "traceId": "..."}` with HTTP 400 (bad input, and also permission-denied
    reads/writes), 401 (missing/invalid key), 404 (not found), 429 (rate limit).


    ## Pagination

    List endpoints accept `offset`, `limit` (default 10, max 25 - the supplier
    locations list caps at 10), `sort_by` and `order` (`asc`|`desc`), plus
    entity-specific query-string filters on indexed columns.


    ## Data masking

    For third-party suppliers (keys whose supplier company is not a buyer's
    internal service team), work order, location and invoice responses are
    masked: buyer-private fields are blanked before the response is returned.


    ## Date formats

    Date-time fields serialize as strings in one of two shapes depending on the
    underlying type: ISO 8601 with offset (e.g. `2026-08-14T13:05:22.000-07:00`)
    for most timestamps, or `yyyy-MM-dd HH:mm:ss.S` (space-separated, no offset)
    for database timestamp fields. Plain dates are `yyyy-MM-dd`. When sending
    date-times, ISO 8601 is accepted.


    ## Required headers

    Every request must carry BOTH `X-API-KEY` (your API key) and `OW-KEY` (the
    OpenWrench shared secret issued with it). Requests missing either return
    401.
servers:
  - url: https://api.useopenwrench.com/api/external
security:
  - ApiKeyAuth: []
    OwKeyAuth: []
tags:
  - name: Ping
  - name: Buyer Companies
  - name: Locations
  - name: Regions
  - name: Asset Types
  - name: Assets
  - name: Asset Labels
    description: Read the asset label catalog and replace the labels applied to an asset.
  - name: Work Orders
  - name: Work Order Labels
    description: >-
      Read the work order label catalog visible to your key and replace the
      labels applied to a work order.
  - name: Service Calls
  - name: WrenchMode
    description: Read-only WrenchMode work logs and technician time analytics
  - name: Proposals
  - name: Invoices
  - name: Files
  - name: Purchase Requests
  - name: Purchase Orders
  - name: Purchase Order Receipts
  - name: Parts
  - name: Equipment Types
  - name: Stock Location Inventory
  - name: Vendors
  - name: Users
paths:
  /v1/supplier/inventory/purchase_request_line_items/associate_po_line_item/{ids}/{poLineItem}:
    patch:
      tags:
        - Purchase Requests
      summary: Associate PR line items with a PO line item
      description: >-
        Associates the given purchase-request line items (comma-separated ids)
        with a purchase-order line item: each line item's status is set to
        "orderInProgress" and its associatedPurchaseOrderLineItemId to the given
        id, then each parent purchase request's status is recomputed from its
        line items. Ids the key has no read permission for are silently dropped.
        Returns the updated line items (envelope type
        "SupplierPurchaseRequestLineItem"). Not rate-limited.
      operationId: associatePurchaseOrderLineItem
      parameters:
        - name: ids
          in: path
          required: true
          schema:
            type: string
          description: Comma-separated purchase-request line item ids
        - name: poLineItem
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: Purchase-order line item id to associate
      responses:
        '200':
          description: The updated purchase-request line items
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/SupplierPurchaseRequestLineItemListResponse
        '400':
          description: >-
            Bad input, validation failure, or the API key's contact could not be
            resolved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid X-API-KEY
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limit exceeded (10 requests per 20-second window)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    SupplierPurchaseRequestLineItemListResponse:
      type: object
      properties:
        type:
          type: string
          description: >-
            Entity type label, e.g. "SupplierPurchaseRequestLineItem". Endpoints
            that derive it via Scala reflection (most generic list/get
            endpoints) may return the fully qualified server class name instead
            (e.g. "models.workorder.WorkOrder"); treat this field as
            informational.
        data:
          type: array
          items:
            $ref: '#/components/schemas/SupplierPurchaseRequestLineItem'
        count:
          type: integer
          format: int64
          description: Total number of matching records (across all pages)
        status:
          type: string
          description: '"ok" on success'
          enum:
            - ok
      required:
        - type
        - data
        - count
        - status
    Error:
      type: object
      properties:
        message:
          type: string
          description: Human-readable error message
        type:
          type: string
          description: >-
            Exception type identifier. Known values (exact casing):
            "unauthorizedException", "authorizationException", "ParseException",
            "UnexpectedException", "NotFoundException", "BadRequestException",
            "PaymentRequiredException", "InvalidInputDataException",
            "ConflictException", "ForbiddenException", "InvalidInputException"
        status:
          type: string
          enum:
            - error
        traceId:
          type: string
          description: >-
            Server-generated trace identifier for support (11 alphanumeric
            characters)
      required:
        - message
        - type
        - status
        - traceId
      description: Standard error envelope returned for 4xx/5xx responses.
    SupplierPurchaseRequestLineItem:
      type: object
      properties:
        id:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        status:
          type: string
        supplierPurchaseRequestId:
          type: integer
          format: int64
        stockLocationId:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        locationId:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        isEquipmentLine:
          type: boolean
        partId:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        part:
          anyOf:
            - $ref: '#/components/schemas/Part'
            - type: 'null'
        partCatalogId:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        partQuantity:
          anyOf:
            - type: integer
            - type: 'null'
        partReceivedQuantity:
          anyOf:
            - type: integer
            - type: 'null'
        partUomId:
          type: integer
        partUnitCost:
          anyOf:
            - type: number
            - type: 'null'
        partCost:
          anyOf:
            - type: number
            - type: 'null'
        partCurrencyId:
          type: string
        equipmentTypeId:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        equipmentType:
          anyOf:
            - $ref: '#/components/schemas/EquipmentType'
            - type: 'null'
        equipmentCatalogId:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        equipmentQuantity:
          anyOf:
            - type: integer
            - type: 'null'
        equipmentReceivedQuantity:
          anyOf:
            - type: integer
            - type: 'null'
        equipmentUomId:
          type: integer
        equipmentUnitCost:
          anyOf:
            - type: number
            - type: 'null'
        equipmentCost:
          anyOf:
            - type: number
            - type: 'null'
        equipmentCurrencyId:
          type: string
        associatedPurchaseOrderLineItemId:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        glCodeForPurchaseOrderLineItem:
          anyOf:
            - type: string
            - type: 'null'
        supplierFacilityId:
          type: integer
        supplierCompanyId:
          type: integer
        createdAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
        updatedAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
        isDeleted:
          type: boolean
        deletedAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
      required:
        - status
        - supplierPurchaseRequestId
        - isEquipmentLine
        - partUomId
        - partCurrencyId
        - equipmentUomId
        - equipmentCurrencyId
        - supplierFacilityId
        - supplierCompanyId
        - isDeleted
      description: >-
        Purchase-request line item (hydrated catalog/currency/uom relation
        objects omitted).
      additionalProperties: true
    Part:
      type: object
      properties:
        id:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        partUUID:
          anyOf:
            - type: string
            - type: 'null'
        manufacturerId:
          anyOf:
            - type: string
            - type: 'null'
        manufacturerName:
          anyOf:
            - type: string
            - type: 'null'
        partNumber:
          anyOf:
            - type: string
            - type: 'null'
        aliasPartId:
          anyOf:
            - type: string
            - type: 'null'
        name:
          type: string
        images:
          type: array
          items:
            type: string
        description:
          anyOf:
            - type: string
            - type: 'null'
        cost:
          anyOf:
            - type: number
            - type: 'null'
        uomId:
          type: integer
          description: Unit-of-measure id
        defaultVendorId:
          anyOf:
            - type: integer
            - type: 'null'
        defaultVendor:
          anyOf:
            - $ref: '#/components/schemas/PartEquipmentVendor'
            - type: 'null'
        defaultPartCatalogId:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        assetTypeId:
          anyOf:
            - type: integer
            - type: 'null'
        assetModelId:
          anyOf:
            - type: integer
            - type: 'null'
        isActive:
          type: boolean
        glCode:
          anyOf:
            - type: string
            - type: 'null'
        partEquipmentVendorCount:
          type: integer
          format: int64
        isStocked:
          type: boolean
        labelIds:
          anyOf:
            - type: array
              items:
                type: integer
                format: int64
            - type: 'null'
        labels:
          anyOf:
            - type: array
              items:
                type: string
            - type: 'null'
        supplierCompanyId:
          type: integer
        createdAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
        updatedAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
        isDeleted:
          type: boolean
        deletedAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
      required:
        - name
        - uomId
        - isActive
        - isStocked
        - supplierCompanyId
        - isDeleted
      additionalProperties: true
    EquipmentType:
      type: object
      properties:
        id:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        equipmentTypeNumber:
          anyOf:
            - type: string
            - type: 'null'
        aliasEquipmentTypeNumber:
          anyOf:
            - type: string
            - type: 'null'
        manufacturerId:
          anyOf:
            - type: string
            - type: 'null'
        manufacturerName:
          anyOf:
            - type: string
            - type: 'null'
        modelName:
          type: string
        images:
          type: array
          items:
            type: string
        description:
          anyOf:
            - type: string
            - type: 'null'
        cost:
          anyOf:
            - type: number
            - type: 'null'
        defaultVendorId:
          anyOf:
            - type: integer
            - type: 'null'
        defaultVendor:
          anyOf:
            - $ref: '#/components/schemas/PartEquipmentVendor'
            - type: 'null'
        defaultEquipmentCatalogId:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        assetTypeId:
          anyOf:
            - type: integer
              format: int64
            - type: 'null'
        assetType:
          anyOf:
            - $ref: '#/components/schemas/AssetType'
            - type: 'null'
        isActive:
          type: boolean
        glCode:
          anyOf:
            - type: string
            - type: 'null'
        partEquipmentVendorCount:
          type: integer
          format: int64
        supplierFacilityId:
          type: integer
        supplierCompanyId:
          type: integer
        isAssociatedWithOtherEntities:
          anyOf:
            - type: boolean
            - type: 'null'
        createdAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
        updatedAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
        isDeleted:
          type: boolean
        deletedAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
      required:
        - modelName
        - isActive
        - supplierFacilityId
        - supplierCompanyId
        - isDeleted
    PartEquipmentVendor:
      type: object
      properties:
        id:
          anyOf:
            - type: integer
            - type: 'null'
        name:
          type: string
        vendorId:
          anyOf:
            - type: string
            - type: 'null'
        address:
          anyOf:
            - $ref: '#/components/schemas/Address'
            - type: 'null'
        currencyId:
          type: string
        email:
          anyOf:
            - type: string
            - type: 'null'
        logoUrl:
          anyOf:
            - type: string
            - type: 'null'
        phoneNumber:
          anyOf:
            - type: string
            - type: 'null'
        paymentTerms:
          anyOf:
            - type: string
            - type: 'null'
        shippingTerms:
          anyOf:
            - type: string
            - type: 'null'
        orderingEmails:
          anyOf:
            - type: array
              items:
                type: string
            - type: 'null'
        accountManagerEmails:
          anyOf:
            - type: array
              items:
                type: string
            - type: 'null'
        accountManagerContacts:
          anyOf:
            - type: array
              items:
                $ref: '#/components/schemas/VendorContact'
            - type: 'null'
        salesRepEmails:
          anyOf:
            - type: array
              items:
                type: string
            - type: 'null'
        salesRepContacts:
          anyOf:
            - type: array
              items:
                $ref: '#/components/schemas/VendorContact'
            - type: 'null'
        accountsPayableEmails:
          anyOf:
            - type: array
              items:
                type: string
            - type: 'null'
        accountsPayableContacts:
          anyOf:
            - type: array
              items:
                $ref: '#/components/schemas/VendorContact'
            - type: 'null'
        defaultWarrantyMonths:
          anyOf:
            - type: integer
            - type: 'null'
        notes:
          anyOf:
            - type: string
            - type: 'null'
        isActive:
          type: boolean
        supplierFacilityId:
          type: integer
        createdAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
        updatedAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
        isDeleted:
          type: boolean
        deletedAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
      required:
        - name
        - currencyId
        - isActive
        - supplierFacilityId
        - isDeleted
    AssetType:
      type: object
      properties:
        id:
          anyOf:
            - type: integer
            - type: 'null'
        name:
          type: string
        primarySpendCategory:
          anyOf:
            - type: integer
            - type: 'null'
        attachments:
          type: array
          items:
            $ref: '#/components/schemas/FileDetails'
        allProblemTypeIds:
          type: array
          items:
            type: integer
        allProblemTypeIdsAsString:
          type: string
        allProblemTypes:
          anyOf:
            - type: array
              items:
                $ref: '#/components/schemas/ProblemType'
            - type: 'null'
        allProblemTypesName:
          anyOf:
            - type: string
            - type: 'null'
        allSpendCategories:
          type: array
          items:
            type: integer
        depreciationClassId:
          anyOf:
            - type: integer
            - type: 'null'
        depreciationClassName:
          anyOf:
            - type: string
            - type: 'null'
        requiredFields:
          type: array
          items:
            type: object
            properties: {}
            additionalProperties: true
          description: FieldType objects
        optionalFields:
          type: array
          items:
            type: object
            properties: {}
            additionalProperties: true
          description: FieldType objects
        replaceMarkupOnOriginalCost:
          anyOf:
            - type: number
            - type: 'null'
        replacementThreshold:
          anyOf:
            - type: number
            - type: 'null'
        usesRefrigerant:
          type: boolean
        applianceCategory:
          anyOf:
            - type: string
            - type: 'null'
        refrigerantTypeCode:
          anyOf:
            - type: string
            - type: 'null'
        fullChargeLb:
          anyOf:
            - type: number
            - type: 'null'
        buyerCompanyId:
          type: integer
        createdAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
        updatedAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
        isDeleted:
          type: boolean
        deletedAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
      required:
        - name
        - usesRefrigerant
        - buyerCompanyId
        - isDeleted
      additionalProperties: true
    Address:
      type: object
      properties: {}
      description: Postal address object (shape abridged - model source not available).
      additionalProperties: true
    VendorContact:
      type: object
      properties:
        email:
          type: string
        name:
          type: string
        phoneNumber:
          anyOf:
            - type: string
            - type: 'null'
        vendorId:
          type: integer
        supplierFacilityId:
          type: integer
        createdAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
        updatedAt:
          anyOf:
            - type: string
              format: date-time
              description: ISO 8601 date-time
            - type: 'null'
      required:
        - email
        - name
        - vendorId
        - supplierFacilityId
    FileDetails:
      type: object
      properties:
        fileName:
          type: string
          description: Original file name (non-ASCII characters removed on upload)
        fileId:
          type: string
          description: Server-assigned file identifier; use with the file download endpoint
      required:
        - fileName
        - fileId
      description: >-
        Uploaded-file reference, as returned by the file upload endpoint and
        used in all attachment fields.
    ProblemType:
      type: object
      properties:
        id:
          anyOf:
            - type: integer
            - type: 'null'
        name:
          type: string
        buyerCompanyId:
          type: integer
        hasChildren:
          type: boolean
      description: >-
        Problem type (abridged - model source not available; fields inferred
        from controller usage).
      additionalProperties: true
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY
    OwKeyAuth:
      type: apiKey
      in: header
      name: OW-KEY
      description: >-
        OpenWrench shared secret. Required on every request alongside X-API-KEY;
        issued together with your API key.

````