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

# List transactions

> Charging sessions, newest first. Every transaction of a charger at a site your team owns, and the whole
history of a charger in a user's own account while your integration has a grant on it with
`sessions:read`. One still charging is `active`, with the energy so far; poll to follow it.

The card is a hash: the same card gives the same `card` for your integration, so you can tell your
users' cards apart, but you can't read the card id and another integration gets a different hash.




## OpenAPI

````yaml api-reference/sdk/sdk-v1.openapi.yaml GET /transactions
openapi: 3.1.0
info:
  title: Plugchoice SDK API
  version: '2026-10-07'
  summary: Connect EV chargers to Plugchoice from your own app.
  description: >
    The API of the Plugchoice SDK. Your server creates client sessions, which
    say who Link (the SDK's

    onboarding feature) acts for and what it may reach; it reads the link
    sessions Link opened with them, and

    the chargers and what each can do. The `/session` endpoints are used only by
    Link's hosted flow at

    `connect.plugchoice.com`.


    Errors are RFC 9457 problem details; times are RFC 3339 UTC; ids are UUIDs.


    **Versions** are dates. Pin one with the `Plugchoice-Version` request
    header; without it you get the newest.

    Every response says which version answered in the same header. An unknown
    version is

    `400 unknown-version`. The only version is `2026-10-07`.
  contact:
    name: Plugchoice
    url: https://developer.plugchoice.com/sdk
    email: support@plugchoice.com
servers:
  - url: https://api.plugchoice.com/sdk/v1
    description: Production
security: []
tags:
  - name: Client sessions
    description: >-
      Say who Link acts for, and what it may reach, for an hour. Integrations
      and Plugchoice users.
  - name: Link sessions
    description: >-
      Read the outcome of a link session, one time through Link. Integrations
      and Plugchoice users.
  - name: Chargers
    description: >-
      Read chargers and what they can do (`capabilities`). Integrations and
      Plugchoice users.
  - name: Transactions
    description: >-
      Read the charging sessions of your chargers, and of your users' chargers
      they let you read. Integrations only.
  - name: Session
    description: Link's hosted flow only. Opens and runs one link session.
paths:
  /transactions:
    get:
      tags:
        - Transactions
      summary: List transactions
      description: >
        Charging sessions, newest first. Every transaction of a charger at a
        site your team owns, and the whole

        history of a charger in a user's own account while your integration has
        a grant on it with

        `sessions:read`. One still charging is `active`, with the energy so far;
        poll to follow it.


        The card is a hash: the same card gives the same `card` for your
        integration, so you can tell your

        users' cards apart, but you can't read the card id and another
        integration gets a different hash.
      operationId: listTransactions
      parameters:
        - $ref: '#/components/parameters/PlugchoiceVersion'
        - name: charger_id
          in: query
          required: false
          schema:
            type: string
            format: uuid
        - name: site_id
          in: query
          required: false
          schema:
            type: string
            format: uuid
        - name: external_user_id
          in: query
          required: false
          description: The transactions of one of your users' chargers.
          schema:
            $ref: '#/components/schemas/ExternalUserId'
        - name: status
          in: query
          required: false
          schema:
            type: string
            enum:
              - active
              - completed
        - name: from
          in: query
          required: false
          description: Started at or after this moment.
          schema:
            type: string
            format: date-time
        - name: to
          in: query
          required: false
          description: Started before this moment.
          schema:
            type: string
            format: date-time
        - $ref: '#/components/parameters/Limit'
        - $ref: '#/components/parameters/Cursor'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionPage'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '422':
          $ref: '#/components/responses/ValidationFailed'
      security:
        - integrationToken: []
components:
  parameters:
    PlugchoiceVersion:
      name: Plugchoice-Version
      in: header
      required: false
      description: >-
        The API version to answer with (`400 unknown-version` for one this API
        does not know). Every response carries the version that answered in the
        same header.
      schema:
        type: string
        enum:
          - '2026-10-07'
    Limit:
      name: limit
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 25
    Cursor:
      name: cursor
      in: query
      required: false
      description: '`next_cursor` from the previous page.'
      schema:
        type: string
  schemas:
    ExternalUserId:
      type: string
      description: Your own id for one of your users.
      minLength: 1
      maxLength: 200
      pattern: ^[A-Za-z0-9._:@-]+$
    TransactionPage:
      type: object
      required:
        - data
        - next_cursor
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Transaction'
        next_cursor:
          type:
            - string
            - 'null'
    Transaction:
      type: object
      required:
        - id
        - charger_id
        - connector_id
        - status
        - started_at
        - stopped_at
        - energy_kwh
        - stop_reason
        - card
        - imported
      properties:
        id:
          type: integer
        charger_id:
          type: string
          format: uuid
        connector_id:
          type:
            - integer
            - 'null'
          description: The connector number, as the charger numbers it.
        status:
          type: string
          enum:
            - active
            - completed
          description: '`active` while it charges, `completed` once it stopped.'
        started_at:
          type: string
          format: date-time
        stopped_at:
          type:
            - string
            - 'null'
          format: date-time
        energy_kwh:
          type:
            - number
            - 'null'
          description: >-
            Charged so far for an active one, in total once completed. Null
            before the first meter reading.
          examples:
            - 7.5
        stop_reason:
          type:
            - string
            - 'null'
          description: The OCPP stop reason, or `AutoClosed` when Plugchoice closed it.
          examples:
            - EVDisconnected
        card:
          type:
            - string
            - 'null'
          description: >-
            A hash of the card used, the same for the same card for your
            integration. Null without a card, or once the card id was removed.
          examples:
            - 3f9c1a0e5b7d4c2a8e6f0b1d9a7c5e3f
        imported:
          type: boolean
          description: >-
            Imported, from the charger brand's cloud when the charger came to
            Plugchoice or through the Plugchoice API, rather than reported by
            the charger.
    Problem:
      type: object
      description: RFC 9457 problem details.
      required:
        - type
        - title
        - status
      properties:
        type:
          type: string
          format: uri
          description: >-
            Stable identifier,
            `https://developer.plugchoice.com/sdk/errors/{code}`.
          examples:
            - https://developer.plugchoice.com/sdk/errors/identity-taken
        title:
          type: string
          examples:
            - Identity already registered
        status:
          type: integer
        detail:
          type: string
        code:
          $ref: '#/components/schemas/ErrorCode'
        errors:
          type: object
          description: Only for `validation-failed`. Field path → messages.
          additionalProperties:
            type: array
            items:
              type: string
        site:
          $ref: '#/components/schemas/SiteSummary'
          description: Only for `charger-at-other-site`.
        claimable:
          type: boolean
          description: >-
            Only for `identity-taken`. Whether `POST /session/claims` can be
            tried.
        sign_in_to_share:
          type: boolean
          description: >
            Only for `identity-taken`, in a link session for your user's own
            account before they signed in. The

            charger may already be in their account: once signed in, they share
            it (`POST /session/chargers/{charger_id}/share`).
        vendor_charger:
          type: object
          description: >-
            Only for problems connecting a Zaptec installation's chargers in the
            hosted flow. Which charger of the installation it is about.
          required:
            - id
            - serial
          properties:
            id:
              type: string
              description: The brand's id (`ZaptecCharger.id`).
            serial:
              type: string
    ErrorCode:
      type: string
      description: >-
        The last path segment of `type`, for switch statements. New codes may be
        added.
      enum:
        - unauthenticated
        - forbidden
        - scope-missing
        - sdk-access-required
        - profile-incomplete
        - sign-in-not-needed
        - sign-in-required
        - site-not-saved
        - sign-in-code-required
        - code-invalid
        - two-factor-not-needed
        - two-factor-invalid
        - two-factor-locked
        - not-found
        - validation-failed
        - rate-limited
        - unknown-version
        - unsupported-device-type
        - scope-required
        - client-session-expired
        - site-required
        - start-code-invalid
        - session-ended
        - consent-required
        - consent-not-needed
        - location-required
        - location-already-set
        - method-not-allowed
        - identity-taken
        - identity-busy
        - identity-not-taken
        - charger-at-other-site
        - handover-not-offered
        - control-held
        - pincode-invalid
        - claim-exists
        - claim-closed
        - charger-offline
        - plug-in-not-available
        - nothing-to-complete
        - vendor-sign-in-failed
        - vendor-sign-in-required
        - vendor-not-permitted
        - vendor-charger-offline
        - vendor-rate-limited
        - vendor-unavailable
        - vendor-error
        - bad-request
        - server-error
    SiteSummary:
      type: object
      required:
        - id
        - name
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
  responses:
    Unauthenticated:
      description: Missing, invalid or expired token (`unauthenticated`).
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    ValidationFailed:
      description: The body is invalid (`validation-failed`); `errors` lists the fields.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
  securitySchemes:
    integrationToken:
      type: oauth2
      description: >
        Your integration's client credentials (test or live). The token acts as
        your integration's team and

        lasts 1 hour; request a new one when it expires. Send `client_id`,
        `client_secret` and

        `grant_type=client_credentials`. No OAuth scopes are needed.
      flows:
        clientCredentials:
          tokenUrl: https://app.plugchoice.com/oauth/token
          scopes: {}

````

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