# List a purchase order's history

```http
GET https://secure.yoprint.com/v1/api/store/{team_slug}/purchase_order/{hash_id}/history
```

- API version: v1
- Operation ID: `v1_public_purchase_order_history`
- Section: Purchasing › [Purchase orders](https://developer.yoprint.com/reference/purchase-orders.md)
- Web page: https://developer.yoprint.com/reference/purchase-orders/v1-purchase-order-history/
- Authentication: `Authorization: Bearer YOUR_API_KEY`

Lists the activity recorded on a purchase order, newest first: who changed what, and when. The list is paged: `pagination` gives `total`, `count`, `perPage`, `currentPage` and `totalPages`. Ask for the next page with `page`; the page size is the team's setting (50 unless changed), and `per_page` is ignored.

## Permission

Any member of the team.

## Path parameters

- `team_slug` (string, required): Your team slug, shown as Team ID next to your API key in Profile. Example `your-team`.
- `hash_id` (string, required): The purchase order's id (not its number, such as `PO0042`). A hash id from an earlier answer; unique keys and document numbers (such as `PO0042`) don't work here. Example `EDhVUaC6jbLbed`.

## Query parameters

- `page` (integer, optional): The page to return. Pages hold the team's page size (`pagination_per_page` in team settings: 50 unless changed, 5 to 100). `per_page` is not read here. Default `1`. Minimum 1. Example `1`.

## Request body

This operation takes no request body.

### Example request

```bash
curl 'https://secure.yoprint.com/v1/api/store/your-team/purchase_order/EDhVUaC6jbLbed/history' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Accept: application/json' \
  -H 'X-Yoprint-Decimal-Format: exact-v1'
```

## Response

`200` Successful response.

Fields:

- `data` (array of objects, required)
  - Each item:
    - `action` (string | null, required): What happened to it.
    - `created_at` (string (date-time), required)
    - `id` (string, required)
    - `object` (object | array | null, required): The details recorded for this change, free-form by `type` and `action`, plus `user` (`id`, `name`, `avatar_url`) when a person made it.
    - `type` (string | null, required): What kind of record changed.
    - `message_key` (string | null, optional): The key of the sentence the web app shows for it.
    - `team` (object, optional)
      - `id` (string, optional)
      - `name` (string, optional)
      - `slug` (string, optional)
- `status` (integer, required)
- `success` (boolean, required)
- `pagination` (object, optional)
  - `count` (integer, required)
  - `currentPage` (integer, required)
  - `links` (object | array of any, required): Links to the neighbouring pages: `previous` and `next`, each present only when that page exists. An empty list, `[]`, when there is only one page.
    - `next` (string (uri), optional): The next page.
    - `previous` (string (uri), optional): The previous page.
  - `perPage` (integer, required)
  - `total` (integer, required)
  - `totalPages` (integer, required)

Example response:

```json
{
  "data": [
    {
      "action": "purchase_order_changes",
      "created_at": "2026-11-01T09:00:00+00:00",
      "id": "31fxd6nKDhY683",
      "message_key": "purchase_order.purchase_order_changes",
      "object": {
        "changes": [
          {
            "key": "name",
            "new": "Fall restock",
            "old": null,
            "type": "string"
          }
        ],
        "purchase_order": {
          "id": "12vR7n9WUYn1CJ",
          "scoped_id": "PO0042"
        },
        "team": {
          "id": "GxZz8zgogK5dkh",
          "name": "Example Print Shop"
        },
        "user": {
          "avatar_url": "https://example.com/avatars/alex.png",
          "id": "lOURnovd3hkIQI",
          "name": "Alex Rivera"
        }
      },
      "team": {
        "id": "g9NXwcqzTRIABH",
        "name": "Example Print Shop",
        "slug": "your-team"
      },
      "type": "purchase_order"
    }
  ],
  "pagination": {
    "count": 1,
    "currentPage": 1,
    "links": [],
    "perPage": 50,
    "total": 1,
    "totalPages": 1
  },
  "status": 200,
  "success": true
}
```

## Errors

- `401` The API key is missing or wrong (`unauthenticated`).
- `403` You are not allowed to do this. `api_access_not_in_plan`: your team's plan doesn't include API access (Pro and above, with an active subscription or trial), so every request answers this until the team upgrades. When your role lacks the permission the operation needs, the body is only `{"message": "Insufficient Permission"}`. Other refusals use the error envelope, with `unauthorized` or `user_is_not_authorized`.
- `404` Not found. `page_not_found`: the team slug is unknown, you are not a member of the team, or an id in the path is not one of this team's. `code: null`, with a message that starts "No query results for": there is no record with that id.
  - When: No purchase order with this id in the team. `error.code` is null and `error.message` names the record type. Fix: Check the id.

## Related

- [Export purchase orders by issue date](https://developer.yoprint.com/reference/purchase-orders/v1-purchase-order-export.md): `POST /v1/api/store/{team_slug}/purchase_order/export`
