# Get payment by ID

Returns the payment matching `id` for the practice identified by `X-Practice-Id`. The identifier is the same `id` returned when listing payments.
If no payment exists for that practice and `id`, the API responds with 404.

Endpoint: GET /payments/{id}
Version: 2026-01-01
Security: oauth2

## Security:

  - `oauth2` (unknown)
    oauth2 scopes: payment:read

## Path parameters:

  - `id` (string, required)
    Resource identifier to filter/find.

## Header parameters:

  - `X-Practice-Id` (string, required)
    UUID of the **practice** in whose context the request is executed. The API
uses this to resolve data the caller is permitted to access for that practice.

## Response 200:

  - `200` (unknown)
    Full details for one payment.

## Response 200 fields (application/json):

  - `data` (object, required)
    Money received against a patient account. A payment may be allocated in full or in part to invoices, deposits, or other account items. Until it is fully allocated, some of the amount remains unexplained.

  - `data.created_at` (string, required)
    When the resource was created (UTC, ISO 8601) in UTC.
    Example: 2024-01-15T09:30:00Z

  - `data.updated_at` (string, required)
    When the resource was last updated (UTC, ISO 8601) in UTC.
    Example: 2024-06-20T14:05:22Z

  - `data.id` (string, required)
    Unique identifier for the payment.
    Example: 3fa85f64-5717-4562-b3fc-2c963f66afa6

  - `data.patient_id` (string, required)
    Patient whose account received the payment.
    Example: 550e8400-e29b-41d4-a716-446655440004

  - `data.practitioner_id` (string)
    Practitioner linked to the payment when one was recorded.
    Example: 7c9e6679-7425-40de-944b-e07fc1f90ae7

  - `data.site_id` (string)
    Site where the payment was recorded.
    Example: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11

  - `data.fee_schedule_id` (string)
    Fee schedule the payment was recorded against. Dentally's user interface in the United Kingdom sometimes calls this a payment plan.
    Example: 6ba7b810-9dad-11d1-80b4-00c04fd430c8

  - `data.transaction_number` (string)
    External or card-terminal transaction identifier when one was captured for the payment.
    Example: txn_1NxyzAbCdEfGhIjK

  - `data.reference` (string, required)
    Human-readable payment number within the practice, zero-padded to at least five digits.
    Example: 00142

  - `data.method` (string, required)
    How the payment was taken. Common values include `Cash`, `Credit Card`, `Debit Card`, `BACS`, `Bank Transfer`, `Cheque`, `Stripe`, `Online Payment`, `Insurance`, and `Other`. Practices may also return region- or integration-specific methods.
    Example: Credit Card

  - `data.status` (string, required)
    Allocation state of the payment.
    Enum: "unexplained", "partially_explained", "paid"

  - `data.amount` (number, required)
    Total payment amount in the practice currency. Positive when money was received.
    Example: 85

  - `data.amount_unexplained` (number, required)
    Portion of `amount` not yet allocated to invoices, deposits, or other account items. Zero when the payment is fully explained.
    Example: 0

  - `data.dated_on` (string, required)
    Business date of the payment (ISO 8601 date).
    Example: 2026-01-18

  - `data.is_fully_explained` (boolean, required)
    Whether the full payment amount has been allocated. When `true`, `amount_unexplained` is zero and `status` is `paid`.
    Example: true

  - `data.notes` (string)
    Free-text notes recorded with the payment.
    Example: Paid at reception after examination

## Response 400:

  - `400` (unknown)
    Malformed Request ([ProblemDetails](https://tools.ietf.org/html/rfc7807))

## Response 400 fields (application/problem+json):

  - `type` (string)
    A URI reference [[RFC3986](https://tools.ietf.org/html/rfc3986)] that
identifies the problem type. It should provide human-readable
documentation for the problem type. When this member is not present, its
value is assumed to be "about:blank".
    Example: https://httpstatuses.io/400

  - `title` (string)
    A short, human-readable summary of the problem type. It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization.
    Example: Bad Request

  - `status` (integer)
    The HTTP status code.
    Example: 400

  - `detail` (string)
    A human-readable explanation specific to this occurrence of the problem.
    Example: Missing required field 'address'

  - `instance` (string)
    A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if de-referenced.
    Example: /v2/sites

## Response 401:

  - `401` (unknown)
    Unauthorized - Provide proof of identity ([ProblemDetails](https://tools.ietf.org/html/rfc7807))

## Response 401 fields (application/problem+json):

  - `type` (string)
    A URI reference [[RFC3986](https://tools.ietf.org/html/rfc3986)] that
identifies the problem type. It should provide human-readable
documentation for the problem type. When this member is not present, its
value is assumed to be "about:blank".
    Example: https://httpstatuses.io/400

  - `title` (string)
    A short, human-readable summary of the problem type. It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization.
    Example: Bad Request

  - `status` (integer)
    The HTTP status code.
    Example: 400

  - `detail` (string)
    A human-readable explanation specific to this occurrence of the problem.
    Example: Missing required field 'address'

  - `instance` (string)
    A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if de-referenced.
    Example: /v2/sites

## Response 404:

  - `404` (unknown)
    Not Found - Could not find a matching entity ([ProblemDetails](https://tools.ietf.org/html/rfc7807))

## Response 404 fields (application/problem+json):

  - `type` (string)
    A URI reference [[RFC3986](https://tools.ietf.org/html/rfc3986)] that
identifies the problem type. It should provide human-readable
documentation for the problem type. When this member is not present, its
value is assumed to be "about:blank".
    Example: https://httpstatuses.io/400

  - `title` (string)
    A short, human-readable summary of the problem type. It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization.
    Example: Bad Request

  - `status` (integer)
    The HTTP status code.
    Example: 400

  - `detail` (string)
    A human-readable explanation specific to this occurrence of the problem.
    Example: Missing required field 'address'

  - `instance` (string)
    A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if de-referenced.
    Example: /v2/sites

## Response 4XX:

  - `4XX` (unknown)
    User Error ([ProblemDetails](https://tools.ietf.org/html/rfc7807))

## Response 4XX fields (application/problem+json):

  - `type` (string)
    A URI reference [[RFC3986](https://tools.ietf.org/html/rfc3986)] that
identifies the problem type. It should provide human-readable
documentation for the problem type. When this member is not present, its
value is assumed to be "about:blank".
    Example: https://httpstatuses.io/400

  - `title` (string)
    A short, human-readable summary of the problem type. It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization.
    Example: Bad Request

  - `status` (integer)
    The HTTP status code.
    Example: 400

  - `detail` (string)
    A human-readable explanation specific to this occurrence of the problem.
    Example: Missing required field 'address'

  - `instance` (string)
    A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if de-referenced.
    Example: /v2/sites

## Response 5XX:

  - `5XX` (unknown)
    Server Error ([ProblemDetails](https://tools.ietf.org/html/rfc7807))

## Response 5XX fields (application/problem+json):

  - `type` (string)
    A URI reference [[RFC3986](https://tools.ietf.org/html/rfc3986)] that
identifies the problem type. It should provide human-readable
documentation for the problem type. When this member is not present, its
value is assumed to be "about:blank".
    Example: https://httpstatuses.io/400

  - `title` (string)
    A short, human-readable summary of the problem type. It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization.
    Example: Bad Request

  - `status` (integer)
    The HTTP status code.
    Example: 400

  - `detail` (string)
    A human-readable explanation specific to this occurrence of the problem.
    Example: Missing required field 'address'

  - `instance` (string)
    A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if de-referenced.
    Example: /v2/sites

## Response 200 examples:

  - `Single payment` (unknown)
    Fully allocated card payment. `amount_unexplained` is zero and `status` is `paid`.

## Response 400 examples:

  - `Malformed or invalid request` (unknown)
    RFC 7807 problem details when validation fails (e.g. missing required field).

## Response 401 examples:

  - `Missing or invalid credentials` (unknown)
    RFC 7807 problem details when the caller is not authenticated.

## Response 404 examples:

  - `Resource not found` (unknown)
    RFC 7807 problem details when no resource matches the given identifier.

## Response 4XX examples:

  - `Generic client error response` (unknown)
    RFC 7807 problem details for a generic client error (e.g. conflict, unsupported media type).

## Response 5XX examples:

  - `Unexpected server error` (unknown)
    RFC 7807 problem details for an internal failure.

