Procurify purchase-orders API

The purchase-orders API from Procurify — 7 operation(s) for purchase-orders.

Operations 7

PUT /api/v2/purchase_order/revise/{procurify_PO}/ Revise a Purchase Order #
GET /api/v2/purchase_orders/{id}/ Get Purchase Order by ID (with items) #
GET /api/v2/purchase_orders/{role}/{status}/ Get Purchase Orders by Role & Status #
PUT /api/v3/purchase-orders/{procurify_PO}/ Update a Purchase Order #
POST /api/v3/purchase-orders/{procurify_PO}/close/ Close a Purchase Order #
POST /api/v3/purchase-orders/{procurify_PO}/reopen/ Reopen a Purchase Order #
GET /api/v3/purchase-orders/billing-history/ View billing history of a Purchase Order #

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/procurify-purchase-orders-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

procurify-purchase-orders-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Procurify API Documentation account-codes Purchase Orders API
  version: '1.0'
  description: '

    # Disclaimer


    - Procurify’s API is evolving and is subject to change at any time. Additionally, aspects of the API are undocumented, including certain methods, events, and properties. Given that both documented and undocumented aspects of the Procurify API may change at any time, the client relies on the API at their own risk.

    - Client (and/or client’s representative) is responsible for building, testing, and maintaining any API connection between Procurify and any other tool.  Procurify’s responsibility strictly involves providing support on clarifications in regards to the issued API document.

    - Procurify’s API is offered on an “as is” and “as available” basis, without warranties of any kind. By accepting this agreement, you agree that you have read the current API documentation, and accept the API functionality in its current state including current limitations. For questions and clarification around the documentation, please contact support@procurify.com.

    - In accordance with Section 2.(b) of our Subscription Services Agreement, Procurify reserves the right to deny access to our API at any time. If your API requests are too large and time out, contact us immediately to avoid possible suspension of access.

    - You may not attempt to reverse engineer or otherwise derive source code, trade secrets, or know-how in the Procurify API or portion thereof. You may not use the Procurify API to replicate or compete with core products or services offered by Procurify.

    '
servers:
- url: https://{user_domain}.procurify.com
  description: Your Procurify domain
  variables:
    user_domain:
      default: your-domain
      description: Your procurify domain
tags:
- name: purchase-orders
paths:
  /api/v2/purchase_order/revise/{procurify_PO}/:
    put:
      operationId: purchase_order_revise_update
      description: Deprecated method for revising a purchase order. Pending removable after November 16, 2023. Use `PUT` on `/api/v3/purchase-orders/{id}` instead.
      summary: Revise a Purchase Order
      parameters:
      - in: query
        name: confirm_duplicate_external_po_number
        schema:
          type: string
          enum:
          - 'False'
          - 'True'
          default: 'False'
        description: Mechanism to check for duplicate custom PO number. If there is a duplicate, API will fail unless this query param is set to True.
      - in: query
        name: format
        schema:
          type: string
          enum:
          - csv
          - json
      - in: path
        name: procurify_PO
        schema:
          type: integer
          title: Procurify PO Number
        description: A unique integer value identifying this po.
        required: true
      tags:
      - purchase-orders
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PurchaseOrderUpdateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PurchaseOrderUpdateRequest'
          ? ''
          : schema:
              $ref: '#/components/schemas/PurchaseOrderUpdateRequest'
          application/xml:
            schema:
              $ref: '#/components/schemas/PurchaseOrderUpdateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PurchaseOrderUpdateRequest'
        required: true
      security:
      - RemoteAuthentication: []
      - M2MAuthentication: []
      - BasicAuthentication: []
      - cookieAuth: []
      deprecated: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PurchaseOrderDetailSerializerSingle'
            text/csv:
              schema:
                $ref: '#/components/schemas/PurchaseOrderDetailSerializerSingle'
          description: ''
  /api/v2/purchase_orders/{id}/:
    get:
      operationId: purchase_orders_retrieve
      description: '**Purchase Order State Codes**


        | Order Type          | Code      |

        |---------------------|-----------|

        | PURCHASED           | 0         |

        | CANCELLED           | 1         |

        | (legacy code)       | 2         |

        | CLOSED              | 3         |

        | PAID                | 4         |

        | REOPENED            | 5         |'
      summary: Get Purchase Order by ID (with items)
      parameters:
      - in: query
        name: format
        schema:
          type: string
          enum:
          - csv
          - json
      - in: path
        name: id
        schema:
          type: string
        description: Procurify PO or UUID
        required: true
      tags:
      - purchase-orders
      security:
      - RemoteAuthentication: []
      - M2MAuthentication: []
      - BasicAuthentication: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiNestedEditDeletePurchaseOrderDetail'
            text/csv:
              schema:
                $ref: '#/components/schemas/ApiNestedEditDeletePurchaseOrderDetail'
          description: ''
  /api/v2/purchase_orders/{role}/{status}/:
    get:
      operationId: purchase_orders_list
      summary: Get Purchase Orders by Role & Status
      parameters:
      - in: query
        name: account_code
        schema:
          type: integer
        description: Account Code
      - in: query
        name: contract
        schema:
          type: integer
        description: Contract
      - in: query
        name: currency
        schema:
          type: integer
        description: Currency
      - in: query
        name: date_0
        schema:
          type: string
          format: date
        description: 'YYYY-MM-DD (start date): Filter POs by Created Date range'
      - in: query
        name: date_1
        schema:
          type: string
          format: date
        description: 'YYYY-MM-DD (end date): Filter POs by Created Date range'
      - in: query
        name: expiry_date_0
        schema:
          type: string
          format: date
        description: Expiry Date
      - in: query
        name: expiry_date_1
        schema:
          type: string
          format: date
        description: Expiry Date
      - in: query
        name: has_blanket_order_items
        schema:
          type: boolean
      - in: query
        name: modified_date_0
        schema:
          type: string
          format: date
        description: 'YYYY-MM-DD (start date): Filter POs by Last Modified Date range'
      - in: query
        name: modified_date_1
        schema:
          type: string
          format: date
        description: 'YYYY-MM-DD (end date): Filter POs by Last Modified Date range'
      - in: query
        name: order_by
        schema:
          type: string
        description: Sort by field
      - in: query
        name: page
        schema:
          type: integer
      - in: query
        name: page_size
        schema:
          type: integer
      - in: query
        name: pref_vendor
        schema:
          type: integer
        description: ID of Vendor
      - in: query
        name: promise_date_0
        schema:
          type: string
          format: date
        description: 'YYYY-MM-DD (start date): Filter POs by Promise Date range'
      - in: query
        name: promise_date_1
        schema:
          type: string
          format: date
        description: 'YYYY-MM-DD (end date): Filter POs by Promise Date range'
      - in: query
        name: purchase_order
        schema:
          type: integer
        description: Purchase Order
      - in: query
        name: purchaser
        schema:
          type: integer
        description: Purchaser
      - in: query
        name: requester
        schema:
          type: integer
        description: Requester
      - in: path
        name: role
        schema:
          type: string
          enum:
          - purchased
          - receivable
        required: true
      - in: path
        name: status
        schema:
          type: string
          enum:
          - all
          - cancelled
          - closed
          - open
          - paid
          - partial
        required: true
      - in: query
        name: total_0
        schema:
          type: string
          format: decimal
          pattern: ^-?\d{0,17}(?:\.\d{0,2})?$
          title: Total Cost
        description: Total
      - in: query
        name: total_1
        schema:
          type: string
          format: decimal
          pattern: ^-?\d{0,17}(?:\.\d{0,2})?$
          title: Total Cost
        description: Total
      tags:
      - purchase-orders
      security:
      - RemoteAuthentication: []
      - M2MAuthentication: []
      - BasicAuthentication: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/POWithListPurchaseOrderDocs'
            text/csv:
              schema:
                $ref: '#/components/schemas/POWithListPurchaseOrderDocs'
          description: ''
  /api/v3/purchase-orders/{procurify_PO}/:
    put:
      operationId: purchase_orders_update
      summary: Update a Purchase Order
      parameters:
      - in: query
        name: format
        schema:
          type: string
          enum:
          - csv
          - json
      - in: path
        name: procurify_PO
        schema:
          type: integer
          title: Procurify PO Number
        description: A unique integer value identifying this po.
        required: true
      tags:
      - purchase-orders
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PurchaseOrderUpdateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PurchaseOrderUpdateRequest'
          ? ''
          : schema:
              $ref: '#/components/schemas/PurchaseOrderUpdateRequest'
          application/xml:
            schema:
              $ref: '#/components/schemas/PurchaseOrderUpdateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/PurchaseOrderUpdateRequest'
        required: true
      security:
      - RemoteAuthentication: []
      - M2MAuthentication: []
      - BasicAuthentication: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PurchaseOrderUpdateSerializerSingle'
            text/csv:
              schema:
                $ref: '#/components/schemas/PurchaseOrderUpdateSerializerSingle'
          description: ''
  /api/v3/purchase-orders/{procurify_PO}/close/:
    post:
      operationId: purchase_orders_close_create
      summary: Close a Purchase Order
      parameters:
      - in: query
        name: format
        schema:
          type: string
          enum:
          - csv
          - json
      - in: path
        name: procurify_PO
        schema:
          type: integer
          title: Procurify PO Number
        description: A unique integer value identifying this po.
        required: true
      tags:
      - purchase-orders
      security:
      - RemoteAuthentication: []
      - M2MAuthentication: []
      - BasicAuthentication: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PurchaseOrderReadDocsSerializerSingle'
            text/csv:
              schema:
                $ref: '#/components/schemas/PurchaseOrderReadDocsSerializerSingle'
          description: ''
  /api/v3/purchase-orders/{procurify_PO}/reopen/:
    post:
      operationId: purchase_orders_reopen_create
      summary: Reopen a Purchase Order
      parameters:
      - in: query
        name: format
        schema:
          type: string
          enum:
          - csv
          - json
      - in: path
        name: procurify_PO
        schema:
          type: integer
          title: Procurify PO Number
        description: A unique integer value identifying this po.
        required: true
      tags:
      - purchase-orders
      security:
      - RemoteAuthentication: []
      - M2MAuthentication: []
      - BasicAuthentication: []
      - cookieAuth: []
      responses:
        '200':
          description: No response body
  /api/v3/purchase-orders/billing-history/:
    get:
      operationId: purchase_orders_billing_history_retrieve
      summary: View billing history of a Purchase Order
      parameters:
      - in: query
        name: format
        schema:
          type: string
          enum:
          - csv
          - json
      tags:
      - purchase-orders
      security:
      - RemoteAuthentication: []
      - M2MAuthentication: []
      - BasicAuthentication: []
      - cookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PurchaseOrderBillingHistorySerializerList'
            text/csv:
              schema:
                $ref: '#/components/schemas/PurchaseOrderBillingHistorySerializerList'
          description: ''
components:
  schemas:
    OrderItemTypeEnum:
      enum:
      - 0
      - 1
      - 2
      type: integer
      description: '* `0` - One Time

        * `1` - Recurring

        * `2` - Blanket'
    UnoptimizedBranchRead:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        external_id:
          type:
          - string
          - 'null'
          description: External id
          maxLength: 100
        name:
          type: string
          maxLength: 150
        url:
          type:
          - string
          - 'null'
          format: uri
          maxLength: 200
        logo:
          type: string
        language:
          allOf:
          - $ref: '#/components/schemas/LanguageEnum'
          minimum: -2147483648
          maximum: 2147483647
        multipleLocations:
          type: boolean
        locationTimezone:
          oneOf:
          - $ref: '#/components/schemas/LocationTimezoneEnum'
          - $ref: '#/components/schemas/BlankEnum'
          - $ref: '#/components/schemas/NullEnum'
          type:
          - integer
          - 'null'
        userLimit:
          type: integer
          maximum: 4294967295
          minimum: 0
          format: int64
        budgetOvertureToggle:
          type: boolean
        purchase_filtering:
          type: boolean
        catalog_permission:
          type: boolean
        separate_expense_approval:
          type: boolean
        standalone_travel_approval:
          type: boolean
        phoneOne:
          type: string
          maxLength: 20
        phoneTwo:
          type:
          - string
          - 'null'
          maxLength: 20
        fax:
          type:
          - string
          - 'null'
          maxLength: 20
        email:
          type:
          - string
          - 'null'
          format: email
          maxLength: 254
        fiscalYearEndDay:
          type:
          - integer
          - 'null'
          maximum: 4294967295
          minimum: 0
          format: int64
        fiscalYearEndMonth:
          type:
          - integer
          - 'null'
          maximum: 4294967295
          minimum: 0
          format: int64
        timezone:
          allOf:
          - $ref: '#/components/schemas/TimezoneEnum'
          exclusiveMinimum: -10000
          exclusiveMaximum: 10000
        beginDate:
          type:
          - string
          - 'null'
          format: date-time
          readOnly: true
        ported:
          type: boolean
        port_date:
          type:
          - string
          - 'null'
          format: date-time
        active:
          type: boolean
        fields_cache:
          type:
          - string
          - 'null'
        activated:
          type: boolean
        setup_stage:
          $ref: '#/components/schemas/SetupStageEnum'
        localCurrency:
          type: integer
        contactPerson:
          type:
          - integer
          - 'null'
        buyerAddress:
          type:
          - integer
          - 'null'
        shippingAddress:
          type:
          - integer
          - 'null'
      required:
      - localCurrency
      - name
      - phoneOne
    PurchaseOrderDetail:
      type: object
      properties:
        number:
          type: string
          readOnly: true
        uuid:
          type: string
          format: uuid
        purchaser:
          $ref: '#/components/schemas/UserSummary'
        procurify_PO:
          type: integer
          readOnly: true
          title: Procurify PO Number
        PO_Num:
          type:
          - string
          - 'null'
          title: PO Number
          maxLength: 30
        date:
          type: string
          format: date-time
          readOnly: true
          title: PO Date
        buyer_name:
          type: string
          maxLength: 100
        buyer_contact:
          type: string
          maxLength: 100
        buyer_addressLineOne:
          type: string
          title: Address line
          maxLength: 300
        buyer_postalCode:
          type: string
          title: Postal Code
          maxLength: 20
        buyer_city:
          type: string
          maxLength: 50
        buyer_state_province:
          type: string
          title: State/Province
          maxLength: 40
        buyer_country:
          type: string
          title: Country
          maxLength: 80
        buyer_address:
          $ref: '#/components/schemas/AddressSummary'
        receiver_name:
          type: string
          maxLength: 100
        receiver_contact:
          type: string
          maxLength: 100
        receiver_addressLineOne:
          type: string
          title: Address line
          maxLength: 300
        receiver_postalCode:
          type: string
          title: Postal Code
          maxLength: 20
        receiver_city:
          type: string
          maxLength: 50
        receiver_state_province:
          type: string
          title: State/Province
          maxLength: 40
        receiver_country:
          type: string
          title: Country
          maxLength: 80
        receiver_address:
          $ref: '#/components/schemas/AddressSummary'
        pref_vendor:
          $ref: '#/components/schemas/VendorRead'
        vendor_name:
          type:
          - string
          - 'null'
          maxLength: 150
        vendor_contact:
          type:
          - string
          - 'null'
          maxLength: 100
        vendor_addressLineOne:
          type:
          - string
          - 'null'
          title: Address line
          maxLength: 300
        vendor_postalCode:
          type:
          - string
          - 'null'
          title: Postal Code
          maxLength: 20
        vendor_city:
          type:
          - string
          - 'null'
          maxLength: 50
        vendor_state_province:
          type:
          - string
          - 'null'
          title: State/Province
          maxLength: 40
        vendor_country:
          type:
          - string
          - 'null'
          title: Country
          maxLength: 80
        payment_terms:
          type: string
          maxLength: 100
        shipping_terms:
          type: string
          maxLength: 100
        shipping_method:
          $ref: '#/components/schemas/ShippingMethod'
        promise_date:
          type: string
          format: date-time
        subtotal:
          type: string
          format: decimal
          pattern: ^-?\d{0,17}(?:\.\d{0,2})?$
        freight:
          type:
          - string
          - 'null'
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,6})?$
        tax:
          allOf:
          - $ref: '#/components/schemas/PriceModifierDocs'
          readOnly: true
        discount:
          allOf:
          - $ref: '#/components/schemas/PriceModifierDocs'
          readOnly: true
        other:
          type:
          - string
          - 'null'
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,6})?$
        total:
          type: string
          format: decimal
          pattern: ^-?\d{0,17}(?:\.\d{0,2})?$
          title: Total Cost
        comment:
          type:
          - string
          - 'null'
          title: Notes
        purchased_currency:
          $ref: '#/components/schemas/CurrencySummary'
        purchased_currency_rate:
          type:
          - string
          - 'null'
          format: decimal
          pattern: ^-?\d{0,9}(?:\.\d{0,6})?$
        active:
          type: boolean
        state:
          minimum: -2147483648
          maximum: 2147483647
          oneOf:
          - $ref: '#/components/schemas/PurchaseOrderStateEnum'
          - $ref: '#/components/schemas/NullEnum'
          type:
          - integer
          - 'null'
        fulfilment_status:
          $ref: '#/components/schemas/FulfilmentStatusEnum'
        disclaimer_description:
          type:
          - string
          - 'null'
          maxLength: 100
        disclaimer_text:
          type:
          - string
          - 'null'
        recorded_date:
          type:
          - string
          - 'null'
          format: date-time
        closed_date:
          type:
          - string
          - 'null'
          format: date-time
        last_modified:
          type: string
          format: date-time
          readOnly: true
        staged_for_export:
          type: boolean
        version:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
        item_count:
          type: integer
          readOnly: true
        most_recent_version:
          type: integer
          maximum: 2147483647
          minimum: -2147483648
          readOnly: true
        punchout_system:
          type:
          - integer
          - 'null'
          readOnly: true
        purchase_agreement:
          type:
          - integer
          - 'null'
          readOnly: true
        purchase_agreement_status:
          allOf:
          - $ref: '#/components/schemas/PurchaseAgreementStatusEnum'
          readOnly: true
          type:
          - object
          - 'null'
        punchout_vendor_reference:
          type:
          - integer
          - 'null'
          readOnly: true
        punchout_supplier_icon:
          type:
          - string
          - 'null'
          readOnly: true
        punchout_supplier_name:
          type:
          - string
          - 'null'
          readOnly: true
        has_blanket_order_items:
          type: boolean
          readOnly: true
        expiry_date:
          type:
          - string
          - 'null'
          format: date-time
        contract:
          $ref: '#/components/schemas/PurchaseOrderContract'
        order_items:
          type: array
          items:
            $ref: '#/components/schemas/PurchaseOrderLineItemRead'
        creditcard_is_editable:
          type: boolean
        custom_fields:
          type: array
          items:
            $ref: '#/components/schemas/CustomFieldValueRead'
          readOnly: true
        creditcard:
          allOf:
          - $ref: '#/components/schemas/CreditCardRead'
          type:
          - object
          - 'null'
        payment_term:
          $ref: '#/components/schemas/PaymentTerm'
        shipping_term:
          $ref: '#/components/schemas/ShippingTerm'
        cost_details:
          allOf:
          - $ref: '#/components/schemas/CostDetails'
          readOnly: true
          type:
          - object
          - 'null'
        punchout_is_retriable:
          type: boolean
          readOnly: true
      required:
      - buyer_address
      - buyer_addressLineOne
      - buyer_city
      - buyer_contact
      - buyer_country
      - buyer_name
      - buyer_postalCode
      - contract
      - creditcard
      - creditcard_is_editable
      - order_items
      - payment_term
      - payment_terms
      - pref_vendor
      - promise_date
      - purchased_currency
      - purchaser
      - receiver_address
      - receiver_addressLineOne
      - receiver_city
      - receiver_contact
      - receiver_country
      - receiver_name
      - receiver_postalCode
      - shipping_method
      - shipping_term
      - shipping_terms
      - subtotal
      - total
      - uuid
    PaymentTerm:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 100
        description:
          type:
          - string
          - 'null'
        active:
          type: boolean
      required:
      - name
    CategoryEnum:
      enum:
      - 0
      - 1
      type: integer
      description: '* `0` - Physical

        * `1` - Virtual'
    PaymentMethodTypeEnum:
      enum:
      - 0
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      type: integer
      description: '* `0` - OTHER

        * `1` - CHECK

        * `2` - ACH

        * `3` - EFT

        * `4` - WIRE

        * `5` - PROCURIFY_CHECK

        * `6` - PROCURIFY_ACH

        * `7` - PROCURIFY_WIRE

        * `8` - AIRWALLEX'
    NullEnum:
      enum:
      - null
    PurchaseOrderContract:
      type: object
      properties:
        id:
          type: integer
        uuid:
          type: string
        name:
          type: string
      required:
      - id
      - uuid
    OrderItemAttachment:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        attachment:
          type: string
        upload_datetime:
          type: string
          format: date-time
          readOnly: true
        name:
          type: string
          maxLength: 100
        type:
          $ref: '#/components/schemas/OrderItemAttachmentTypeEnum'
        user:
          type: integer
        item:
          type: integer
      required:
      - attachment
      - item
      - name
      - user
    PurchaseOrderCountsBreakdown:
      type: object
      properties:
        all:
          type: integer
        open:
          type: integer
        partial:
          type: integer
        closed:
          type: integer
        cancelled:
          type: integer
        page:
          type: integer
      required:
      - all
      - cancelled
      - closed
      - open
      - page
      - partial
    AllocationRead:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        amount:
          type: string
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,8})?$
          title: Allocated Amount
        account:
          $ref: '#/components/schemas/SpendAccountRead'
      required:
      - account
      - amount
    CostDetails:
      type: object
      properties:
        subtotal:
          type:
          - string
          - 'null'
          format: decimal
          pattern: ^-?\d{0,8}(?:\.\d{0,8})?$
        total_cost:
          type: string
          format: decimal
          pattern: ^-?\d{0,8}(?:\.\d{0,8})?$
        total_cost_in_base_currency:
          type: string
          format: decimal
          pattern: ^-?\d{0,8}(?:\.\d{0,8})?$
        tax_amount:
          type: string
          format: decimal
          pattern: ^-?\d{0,8}(?:\.\d{0,8})?$
      required:
      - tax_amount
      - total_cost
      - total_cost_in_base_currency
    PurchaseOrderUpdateRequest:
      type: object
      properties:
        order_items:
          type: array
          items:
            $ref: '#/components/schemas/OrderItemPurchaseEditRequest'
        custom_fields:
          type: array
          items:
            type: object
            additionalProperties: {}
          writeOnly: true
          default: []
        PO_Num:
          type:
          - string
          - 'null'
          title: PO Number
          maxLength: 30
        buyer_name:
          type: string
          minLength: 1
          maxLength: 100
        buyer_contact:
          type: string
          minLength: 1
          maxLength: 100
        buyer_addressLineOne:
          type: string
          minLength: 1
          title: Address line
          maxLength: 300
        buyer_postalCode:
          type: string
          minLength: 1
          title: Postal Code
          maxLength: 20
        buyer_city:
          type: string
          minLength: 1
          maxLength: 50
        buyer_state_province:
          type: string
          title: State/Province
          maxLength: 40
        buyer_country:
          type: string
          minLength: 1
          title: Country
          maxLength: 80
        buyer_address:
          type: integer
        comment:
          type:
          - string
          - 'null'
          title: Notes
        receiver_name:
          type: string
          minLength: 1
          maxLength: 100
        receiver_contact:
          type: string
          minLength: 1
          maxLength: 100
        receiver_addressLineOne:
          type: string
          minLength: 1
          title: Address line
          maxLength: 300
        receiver_postalCode:
          type: string
          minLength: 1
          title: Postal Code
          maxLength: 20
        receiver_city:
          type: string
          minLength: 1
          maxLength: 50
        receiver_state_province:
          type: string
          title: State/Province
          maxLength: 40
        receiver_country:
          type: string
          minLength: 1
          title: Country
          maxLength: 80
        receiver_address:
          type: integer
        promise_date:
          type: string
          format: date-time
        freight:
          type:
          - string
          - 'null'
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,6})?$
        discount:
          type: object
          additionalProperties: {}
        tax:
          type: object
          additionalProperties: {}
        other:
          type:
          - string
          - 'null'
          format: decimal
          pattern: ^-?\d{0,13}(?:\.\d{0,6})?$
        disclaimer_description:
          type:
          - string
          - 'null'
          maxLength: 100
        disclaimer_text:
          type:
          - string
          - 'null'
        payment_term_ref:
          type:
          - integer
          - 'null'
        shipping_term_ref:
          type:
          - integer
          - 'null'
        payment_method_ref:
          type:
          - integer
          - 'null'
        shipping_method_ref:
          type:
          - integer
          - 'null'
        creditcard:
          type:
          - integer
          - 'null'
        version:
          type: integer
        expiry_date:
          type:
          - string
          - 'null'
          format: date-time
        contract:
          type:
          - integer
          - 'null'
      required:
      - buyer_address
      - buyer_addressLineOne
      - buyer_city
      - buyer_contact
      - buyer_country
      - buyer_name
      - buyer_postalCode
      - discount
      - order_items
      - promise_date
      - receiver_address
      - receiver_addressLineOne
      - receiver_city
      - receiver_contact
      - receiver_country
      - receiver_name
      - receiver_postalCode
      - tax
      - version
    CatalogItemRead:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
          maxLength: 255
        image:
          type: string
        unitType:
          type: string
          maxLength: 30
        pref_vendor:
          $ref: '#/components/schemas/VendorRead'
        account_code:
          $ref: '#/components/schemas/AccountCodeRead'
        internalSKU:
          type: string
          maxLength: 50
        description:
          type:
          - string
          - 'null'
        product_url:
          type:
          - stri

# --- truncated at 32 KB (132 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/procurify/refs/heads/main/openapi/procurify-purchase-orders-api-openapi.yml