Retrieve a purchase request
Operation ID: getPurchaseRequest
Group: Accounting › Purchase Requests
Open in the interactive reference
GET /accounting/purchase-requests/{id}
Read-only: Reads and returns; changes nothing.
Retrieves a purchase request. Use the purchase request's id, not its purchaseRequestNumber.
A purchase request is an internal request to buy. The response has the request's lines and approval decisions.
POST accounting/purchase-requests/search returns the same fields for many requests, except approvals. GET accounting/purchase-requests returns requests without their lines.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Api-Version |
header | string · v1 | yes | The API version this request targets, named by its public identifier. Required on every request; omitting it, or naming a version this company does not have, is answered with 400. This document describes version v1. |
id |
path | string | yes | The unique identifier of the purchase request you want to retrieve. Example: "c464128b-71f9-4de8-973c-14e2c8b3eaac". |
Response
200 Success
Under data (getPurchaseRequestOutput):
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | yes | The unique identifier for the purchase request. |
purchaseRequestNumber |
string | no | The purchase request number, for example 'PR-1', unique across purchase requests. Absent until one has been assigned. |
description |
string | no | A description of what is being requested. It is shown to the vendor. |
internalDescription |
string | no | Internal notes on the request, not shown to the vendor. |
externalMemo |
string | no | A memo intended for the vendor. |
status |
string | no | The lifecycle and approval state, in one field. Possible values: 'pendingApproval', 'approved', 'rejected', 'closed'. This resource has no separate approvalStatus. |
currency |
string | no | The currency the request is denominated in. Format ISO 4217, for example 'USD'. Governs totalAmount and every line amount. |
totalAmount |
decimal | no | The total requested amount, the sum of the line totals, in the request currency. |
startDate |
date | no | The first day of the period the request covers. Format YYYY-MM-DD. |
endDate |
date | no | The last day of the period the request covers. Format YYYY-MM-DD. |
needByDate |
date | no | The date the goods or services are needed by. Format YYYY-MM-DD. |
paymentTerms |
string | no | The payment-terms key requested for the resulting order, for example 'net30'. |
externalId |
string | no | The identifier this request has in the upstream system that produced it. It is not unique. |
vendorId |
string | no | The vendor this request is directed at. See id on GET accounting/vendors/:id. Absent when no vendor has been chosen yet. |
vendorName |
string | no | The name of the vendor this request is directed at. |
entityId |
string | no | The legal entity this request belongs to. See id on GET base/entities. |
entityName |
string | no | The name of the legal entity this request belongs to. |
departmentId |
string | no | The department raising the request. See id on GET people/departments/:id. |
departmentName |
string | no | The name of the department raising the request. |
lastModifiedDate |
date-time | yes | The date and time the purchase request last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |
approvals |
array<object> | no | The approval decisions on this request, oldest first. An empty array when no approval policy has matched the request. |
approvals[].decision |
string | yes | What was decided. Values include 'approve' and 'reject'. |
approvals[].employeeName |
string | no | The name of the employee who decided. |
approvals[].message |
string | no | The reviewer's note, where one was given. |
approvals[].decidedAt |
date-time | yes | The date and time the decision was recorded, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. |
lines |
array<object> | no | The request line items, in their order on the request. An empty array when the request has none. |
lines[].id |
string | yes | The unique identifier for the line item. |
lines[].lineNumber |
string | no | The line number, for example 'PRL-1'. Unique across purchase request lines. |
lines[].description |
string | no | A description of the line item. |
lines[].isItem |
boolean | no | Whether the line references an inventory item. True for an item line, false for a free-text expense line. It is the item-versus-expense discriminator. There is no itemType field on this resource. |
lines[].quantity |
decimal | no | The quantity requested, as a decimal. |
lines[].price |
decimal | no | The unit price, in the request currency. Set on item lines. On expense lines the amount is on editableAmount instead. |
lines[].editableAmount |
decimal | no | The directly entered line amount, in the request currency. Used on expense lines, where there is no unit price to multiply. |
lines[].total |
decimal | no | The line total, in the request currency. price times quantity on an item line, editableAmount on an expense line. |
lines[].currency |
string | no | The currency of the line. Format ISO 4217, for example 'USD'. Always the request currency, on each line so the line is self-describing. |
lines[].status |
string | no | The delivery state of the line. Possible values: 'undelivered', 'delivering', 'delivered'. It is a delivery status, not an approval status. |
lines[].priority |
string | no | The requested priority of the line. Possible values: 'high', 'medium', 'low'. |
lines[].needByDate |
date | no | The date this line is needed by, when it differs from the header. Format YYYY-MM-DD. |
lines[].deliveryDate |
date | no | The date this line was delivered. Format YYYY-MM-DD. |
lines[].estimatedDeliveryDate |
date | no | The expected delivery date for this line. Format YYYY-MM-DD. |
lines[].startDate |
date | no | The first day of the period this line covers. Format YYYY-MM-DD. |
lines[].endDate |
date | no | The last day of the period this line covers. Format YYYY-MM-DD. |
lines[].unitOfMeasure |
string | no | The name of the unit of measure for the quantity. |
lines[].unitOfMeasureId |
string | no | The unit of measure for the quantity. See id on GET inventory/unit-of-measures/:id. |
lines[].itemId |
string | no | The item this line orders. See id on GET inventory/items/:id. Present only on an item line. |
lines[].departmentId |
string | no | The department this line is charged to. See id on GET people/departments/:id. |
{
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"purchaseRequestNumber": "<purchaseRequestNumber>",
"description": "<description>",
"internalDescription": "<internalDescription>",
"externalMemo": "<externalMemo>",
"status": "<status>",
"currency": "<currency>",
"totalAmount": "19.99",
"startDate": "2026-01-15",
"endDate": "2026-01-15",
"needByDate": "2026-01-15",
"paymentTerms": "<paymentTerms>",
"externalId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"vendorId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"vendorName": "<vendorName>",
"entityId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"entityName": "<entityName>",
"departmentId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"departmentName": "<departmentName>",
"lastModifiedDate": "2026-01-15T09:30:00.000Z",
"approvals": [
{
"decision": "<decision>",
"employeeName": "<employeeName>",
"message": "<message>",
"decidedAt": "2026-01-15T09:30:00.000Z"
}
],
"lines": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"lineNumber": "<lineNumber>",
"description": "<description>",
"isItem": true,
"quantity": "19.99",
"price": "19.99",
"editableAmount": "19.99",
"total": "19.99",
"currency": "<currency>",
"status": "<status>",
"priority": "<priority>",
"needByDate": "2026-01-15",
"deliveryDate": "2026-01-15",
"estimatedDeliveryDate": "2026-01-15",
"startDate": "2026-01-15",
"endDate": "2026-01-15",
"unitOfMeasure": "<unitOfMeasure>",
"unitOfMeasureId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"itemId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"departmentId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
]
},
"diagnostics": [
{
"code": "<code>",
"message": "<message>",
"severity": "error",
"path": [
"<path>"
],
"details": "<details>"
}
]
}
Errors
| Code | Status |
|---|---|
NOT_FOUND |
400 |
Statuses
400— Invalid request or business failure. Codes: NOT_FOUND401— The request carries no valid access token.403— Not authorized404— Not found429— Too many requests from this client address. The response has no body and noRetry-Afterheader.500— Internal server error