Procurify purchase-orders API
The purchase-orders API from Procurify — 7 operation(s) for purchase-orders.
The purchase-orders API from Procurify — 7 operation(s) for purchase-orders.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/procurify-purchase-orders-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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: 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