Purchase Order Creation API
Purchase Order APIs
Purchase Order Creation API
Create purchase orders with line items, vendor details, and procurement settings
Purchase Order Creation API
Documentation Index
Fetch the complete documentation index at: https://docs.pazy.io/llms.txt
Use this file to discover all available pages before exploring further.
Authentication
All requests require an API key in the request headers. Headers:Request
Content-Type:application/json
Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
poNumber | string | Yes | Purchase order number to assign to the document (minimum 1 character) |
lineItems | array | Yes | List of line items that make up the purchase order (minimum 1 item required) |
poType | string | Yes | Indicates whether the purchase order is for goods or services. Valid values: GOODS, SERVICES |
matchingType | string | Yes | Specifies whether the purchase order follows a two-way or three-way match process. Valid values: TWO_WAY, THREE_WAY |
poDate | string | Yes | Purchase order date in ISO-8601 format (YYYY-MM-DD) |
vendorId | string | No | Identifier of the vendor that should be linked to the purchase order (minimum 1 character) |
gstin | string | No | GSTIN of the organization (minimum 1 character) |
description | string | No | Short description for the purchase order (1-255 characters) |
currency | string | No | ISO 4217 currency code that will be used for the purchase order amounts (3 characters, e.g., INR, USD) |
paymentTerms | string | No | Free form outline of the agreed payment terms (minimum 1 character) |
deliveryDate | string | No | Requested delivery date for the purchase order in ISO-8601 format (YYYY-MM-DD) |
termsAndConditions | string | No | Terms and conditions that must be displayed on the purchase order (minimum 1 character) |
additionalNotes | string | No | Additional notes to append to the purchase order document (minimum 1 character) |
state | string | No | Target state for the PO: DRAFTED or ACTIVE. When ACTIVE is requested the API validates all required fields. If they are all present the PO is created in active state; if anything is missing it falls back to DRAFTED and the response includes submitWarnings. Omitting this field defaults to DRAFTED. |
Fields Required for Active State (when state: "ACTIVE")
When state: "ACTIVE" is passed, the following fields must be present in addition to the schema-required fields for the PO to be activated:
| Field | Level | Requirement |
|---|---|---|
vendorId | PO | Vendor must be linked |
description | PO | Description must be non-empty |
paymentTerms | PO | Payment terms must be non-empty |
quantity | Each line item | Must be greater than 0 |
rate | Each line item | Must be greater than 0 |
submitWarnings in the response identifies exactly which fields were absent.
Line Items Object
Each item in thelineItems array must contain the following fields:
| Parameter | Type | Required | Description |
|---|---|---|---|
quantity | number | Yes | Quantity requested for the line item |
rate | number | Yes | Unit rate to be applied to the line item |
identifier | string | Yes | Free-text label for the line item (minimum 1 character) |
skuCode | string | Required for THREE_WAY | Item code of an existing SKU in your inventory. Used to link this line item to a SKU. Takes priority over skuName when both are provided |
skuName | string | Required for THREE_WAY | Name of an existing SKU in your inventory. Used to link this line item to a SKU when skuCode is not provided |
SKU matching (THREE_WAY): WhenmatchingTypeisTHREE_WAY, every line item must include eitherskuCodeorskuName, and it must resolve to an existing SKU in your inventory. If any line item is missing both fields, or if the provided code/name cannot be matched, the request is rejected with a400error and the purchase order is not created. See Bulk SKU Creation to pre-populate your inventory.
PO Type Values
ThepoType field accepts the following values:
GOODS: Purchase order for physical goods or productsSERVICES: Purchase order for services
Matching Type Values
ThematchingType field accepts the following values:
TWO_WAY: Purchase order matching based on purchase order and invoice (2-way match)THREE_WAY: Purchase order matching based on purchase order, invoice, and goods receipt note (3-way match)
Code Examples
Success Response
HTTP Status:200 OK
Response Fields:
| Field | Type | Description |
|---|---|---|
ok | boolean | Indicates whether the request was successful |
data | object | Contains the purchase order creation response data |
data.poId | string | Unique slug identifier for the purchase order (use this to retrieve or update the PO) |
data.state | string | State the PO was created in — DRAFTED or APPROVED (active) |
data.skuMatchWarnings | array | Not applicable for THREE_WAY POs (unmatched SKUs are rejected). Reserved for future use |
data.submitWarnings | object | Present only when submit: true was passed but required fields were missing. The PO is still created in draft state |
skuMatchWarnings Object
| Field | Type | Description |
|---|---|---|
lineItemIdentifier | string | The identifier value of the unmatched line item |
skuCode | string | The skuCode that was provided (if applicable) |
skuName | string | The skuName that was provided (if applicable) |
message | string | Human-readable description of why the SKU could not be matched |
submitWarnings Object
| Field | Type | Description |
|---|---|---|
po | array of strings | PO-level fields that were missing (e.g. "vendorId", "description", "paymentTerms") |
lineItems | object | Map of line item identifier to an array of missing fields (e.g. "quantity", "rate") |
Response Example — draft (no state field or state: "DRAFTED")
Response Example — active (state: "ACTIVE", all fields present)
Response Example — draft despite state: "ACTIVE" (fields missing)
Response Example — state: "ACTIVE" with SKU warnings
Error Responses
Missing Required Fields
HTTP Status:400 Bad Request
Invalid Procurement Type
HTTP Status:400 Bad Request
Invalid Matching Type
HTTP Status:400 Bad Request
Invalid Date
HTTP Status:400 Bad Request
Invalid Expected Delivery Date
HTTP Status:400 Bad Request
SKU Required (THREE_WAY match)
HTTP Status:400 Bad Request
SKU Not Found (THREE_WAY match)
HTTP Status:400 Bad Request
Invalid Line Items
HTTP Status:400 Bad Request
400 Bad Request
400 Bad Request
Invalid Currency
HTTP Status:400 Bad Request
Invalid Description Length
HTTP Status:400 Bad Request
Vendor Not Found
HTTP Status:404 Not Found
Invalid GSTIN
HTTP Status:400 Bad Request
Invalid State
HTTP Status:400 Bad Request
Authentication Errors
HTTP Status:401 Unauthorized
Permission Errors
HTTP Status:403 Forbidden
Purchase Order Creation Errors
HTTP Status:500 Internal Server Error
Internal Error
HTTP Status:500 Internal Server Error
Best Practices
Purchase Order Creation
- Ensure all required fields (
poNumber,lineItems,poType,matchingType,poDate) are provided - Use ISO 8601 date format (YYYY-MM-DD) for all date fields
- Provide at least one line item with valid
quantity,rate, andidentifiervalues - Use
INRfor thecurrencyfield (only INR is currently supported) - Choose the appropriate
matchingTypebased on your procurement process:- Use
TWO_WAYfor simpler matching between PO and invoice - Use
THREE_WAYwhen goods receipt verification is required
- Use
- Link the purchase order to a vendor using
vendorIdif available - Include
gstinfor tax compliance in Indian markets - Keep
descriptionconcise (max 255 characters) for better readability - Use
termsAndConditionsto specify important contractual terms - Add
additionalNotesfor delivery instructions or special requirements
Activating a PO on Creation
Passstate: "ACTIVE" when the PO is complete and ready to be activated immediately:
- The response
statewill beACTIVEif all required fields are present, orDRAFTEDif anything was missing - Check
submitWarningsin the response — it lists exactly which PO-level or line item fields prevented activation - A PO created in
DRAFTEDstate can be activated later by calling the update API withstate: "ACTIVE" - Omitting
state(or passingstate: "DRAFTED") always creates in draft, regardless of what fields are present
Line Items
- Ensure each line item has a unique
identifier - Use positive numbers for
quantityandrate