---
search:
  tags:
    - sales
    - GET
seo:
  description: >-
    Minimum role: STAFF. One event per payment movement reported by the gateway…
    Reference for the GET /sales/{id}/attempts endpoint in the FreeTicket B2B
    API.
sidebar:
  label: List a sale's payment attempt history
  badge: GET
title: List a sale's payment attempt history
type: openapi-operation
---
Minimum role: `STAFF`. One event per payment movement reported by the gateway (approved, declined, or a later refund), ordered from newest to oldest. It exists to answer "why didn't this sale go through?" without leaving the API: `Sale.status` only reflects the final outcome, and from `GET /sales/{id}` a `CANCELLED`/`ABANDONED` sale with `confirmedAt: null` is indistinguishable from an order that simply expired — see the derived `failureReason`/`paymentStatus`/`declineCode` fields on `SaleDetail`.

`GET /sales/{id}/attempts`
