# List sales

GET https://api.oletapp.com/your-store/v1/sales

A delta-sync polling list: poll with the returned `next_cursor` to see only what changed.

Excludes open (parked) sales by default; `status=open` is refused. A refund is a sale carrying `parent_sale_id`. `include_deleted` is not applicable (sales are never deleted) and is refused if set.

**Requires scope:** `sales:read`

Required scope: `sales:read`

## Parameters

| Name | In | Type | Required |
|---|---|---|---|
| `limit` | query | integer | no |
| `cursor` | query | string | no |
| `order` | query | "asc" | "desc" | no |
| `include_deleted` | query | boolean | no |
| `status` | query | "completed" | "partially_refunded" | "refunded" | "voided" | no |
| `outlet_id` | query | string | no |
| `customer_id` | query | string | no |
| `completed_from` | query | string | no |
| `completed_to` | query | string | no |
| `parent_sale_id` | query | string | no |

## Response (200)

```
{
  data: { ... }[]
  has_more: boolean
  next_cursor: string | null
}
```

Errors follow the standard error envelope: https://getolet.com/resources/developers/errors.md

## Example

```bash
curl -X GET "https://api.oletapp.com/your-store/v1/sales" \
  -H "Authorization: Bearer olet_live_YOUR_API_KEY"
```
