> ## Documentation Index
> Fetch the complete documentation index at: https://docs.yuko.so/llms.txt
> Use this file to discover all available pages before exploring further.

# List points transactions

> Retrieves a paginated list of points transactions for a customer, newest first.

Results are sorted by `created_at`, newest first. The list also includes the credit entry recorded when a customer redeems a store credit reward (`action_type` `store_credit`). For that entry, `points` is the store credit amount (rounded down to a whole number), not a number of points; the points spent appear as a separate `debit` entry.

<Info>Requires the `read:transactions` scope. See [Scopes](/developer/api/scopes).</Info>

## Query parameters

<ParamField query="customer_id" type="string" required>
  The platform customer ID, for example the Shopify customer ID.
</ParamField>

<ParamField query="entry_type" type="enum<string>">
  Return only transactions of this type. One of `credit`, `debit`.
</ParamField>

<ParamField query="per_page" type="integer" default={20}>
  The number of results per page. Must be between `1` and `100`.
</ParamField>

<ParamField query="page" type="integer" default={1}>
  The page number to retrieve. See [Classic pagination](/developer/api/classic-pagination).
</ParamField>

## Response

<ResponseField name="data" type="object[]">
  The transactions on this page.

  <Expandable title="transaction properties">
    <ResponseField name="id" type="string<uuid>">
      Unique identifier for the transaction.
    </ResponseField>

    <ResponseField name="customer_id" type="string<uuid>">
      The UUID of the customer this transaction belongs to.
    </ResponseField>

    <ResponseField name="entry_type" type="enum<string>">
      Whether points were added or removed. One of `credit`, `debit`.
    </ResponseField>

    <ResponseField name="points" type="integer">
      The number of points added or removed. Always a positive number; use `entry_type` to determine direction.
    </ResponseField>

    <ResponseField name="action_type" type="string">
      The action that generated this transaction, for example `purchase`, `signup`, `point_adjustment` (manual or REST API adjustments) or the reward type for redemptions.
    </ResponseField>

    <ResponseField name="status" type="enum<string>">
      The current status of the transaction. One of `active`, `on_hold`, `used`, `failed`.
    </ResponseField>

    <ResponseField name="description" type="string | null">
      A human-readable description of the transaction, if provided.
    </ResponseField>

    <ResponseField name="source" type="string | null">
      The source that created this transaction, for example `rest_api`.
    </ResponseField>

    <ResponseField name="transacted_at" type="string<date-time>">
      When the transaction occurred.
    </ResponseField>

    <ResponseField name="created_at" type="string<date-time>">
      When the transaction record was created.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="meta" type="object">
  <Expandable title="meta properties">
    <ResponseField name="pagination" type="object">
      Pagination details. See [Classic pagination](/developer/api/classic-pagination).

      <Expandable title="pagination properties">
        <ResponseField name="current_page" type="integer">The page returned.</ResponseField>
        <ResponseField name="per_page" type="integer">The number of records per page.</ResponseField>
        <ResponseField name="total" type="integer">The total number of records.</ResponseField>
        <ResponseField name="last_page" type="integer">The number of the last page.</ResponseField>
        <ResponseField name="has_more" type="boolean">`true` if there are more pages after this one.</ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

## Errors

| Status | Code | When |
| :- | :- | :- |
| `401` | `missing_token`, `invalid_token` | The API key is missing, wrong or revoked. |
| `403` | `insufficient_scope` | The key doesn't have `read:transactions`. |
| `404` | `not_found` | No customer matches `customer_id` (`Customer not found`). |
| `429` | | The key exceeded the [rate limit](/developer/api/rate-limits). |

<RequestExample>
  ```bash cURL theme={null}
  curl --request GET \
    --url "https://api.yukoapp.com/api/v1/public/customers/transactions?customer_id=9049402769586&entry_type=credit&per_page=20" \
    --header "Authorization: Bearer py_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  ```

  ```javascript JavaScript theme={null}
  const customerId = "9049402769586";
  const params = new URLSearchParams({ entry_type: "credit", per_page: 20 });

  const response = await fetch(
    `https://api.yukoapp.com/api/v1/public/customers/transactions?customer_id=${customerId}&${params}`,
    {
      method: "GET",
      headers: {
        Authorization: "Bearer py_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      },
    }
  );

  const data = await response.json();
  ```

  ```php PHP theme={null}
  $customerId = "9049402769586";
  $query = http_build_query(["entry_type" => "credit", "per_page" => 20]);

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, "https://api.yukoapp.com/api/v1/public/customers/transactions?customer_id={$customerId}&{$query}");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      "Authorization: Bearer py_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  ]);

  $response = curl_exec($ch);
  curl_close($ch);

  $data = json_decode($response, true);
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "data": [
      {
        "id": "d4e5f6a7-b8c9-0123-defa-b01234567890",
        "customer_id": "63a2c89a-9936-4bc0-9d5f-93db46110b76",
        "entry_type": "credit",
        "points": 100,
        "action_type": "purchase",
        "status": "active",
        "description": null,
        "source": null,
        "transacted_at": "2026-02-15T08:30:00+00:00",
        "created_at": "2026-02-15T08:30:00+00:00"
      },
      {
        "id": "e5f6a7b8-c9d0-1234-efab-c01234567890",
        "customer_id": "63a2c89a-9936-4bc0-9d5f-93db46110b76",
        "entry_type": "credit",
        "points": 50,
        "action_type": "signup",
        "status": "active",
        "description": null,
        "source": null,
        "transacted_at": "2024-06-01T10:00:00+00:00",
        "created_at": "2024-06-01T10:00:00+00:00"
      }
    ],
    "meta": {
      "pagination": {
        "current_page": 1,
        "per_page": 20,
        "total": 2,
        "last_page": 1,
        "has_more": false
      }
    }
  }
  ```

  ```json 404 theme={null}
  {
    "error": {
      "code": "not_found",
      "message": "Customer not found"
    }
  }
  ```

  ```json 401 theme={null}
  {
    "error": {
      "code": "invalid_token",
      "message": "Invalid or revoked API token"
    }
  }
  ```
</ResponseExample>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.