# Retrieve a purchase request

Operation ID: `getPurchaseRequest`

Group: Accounting › Purchase Requests

[Open in the interactive reference](https://docs.api.lensing.ai/lensing/v1/endpoints/getPurchaseRequest)

`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. |

```json
{
  "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_FOUND
- `401` — The request carries no valid access token.
- `403` — Not authorized
- `404` — Not found
- `429` — Too many requests from this client address. The response has no body and no `Retry-After` header.
- `500` — Internal server error
