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

# List run reports

> List the graded reports for every run you own, both conformance runs and charging journeys, with each run's status, OCPI version and pass or fail summary.



## OpenAPI

````yaml /openapi/public-api.json get /testing/runs
openapi: 3.1.0
info:
  title: ChargerDojo public API
  version: 1.0.0
  description: >-
    Automate ChargerDojo with a cdojo_ API key: register partner endpoints, run
    conformance suites and charging journeys, and read the graded reports.
servers:
  - url: https://chargerdojo.com/api/v1
security:
  - apiKey: []
tags:
  - name: Connections
  - name: Testing
  - name: Reports
  - name: Usage
  - name: Journeys
paths:
  /testing/runs:
    get:
      tags:
        - Reports
      summary: List owned run reports (conformance and journeys)
      description: >-
        List the graded reports for every run you own, both conformance runs and
        charging journeys, with each run's status, OCPI version and pass or fail
        summary.
      operationId: runs_list
      parameters:
        - name: connectionId
          in: query
          required: false
          description: >-
            Return reports for this owned connection or its stable target
            identity.
          schema:
            type: string
        - name: status
          in: query
          required: false
          description: Return reports with this run status.
          schema:
            type: string
            enum:
              - queued
              - running
              - recovering
              - recovery_required
              - completed
              - failed
              - cancelled
              - interrupted
        - name: ocpiVersion
          in: query
          required: false
          description: Return reports for this OCPI version.
          schema:
            type: string
            enum:
              - 2.1.1
              - '2.2'
              - 2.2.1
              - 2.3.0
        - name: limit
          in: query
          required: false
          description: Maximum reports to return. Omit for 20.
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 20
        - name: cursor
          in: query
          required: false
          description: The opaque nextCursor from the previous report page.
          schema:
            type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReportList'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - apiKey: []
components:
  schemas:
    ReportList:
      type: object
      required:
        - success
        - data
      properties:
        success:
          type: boolean
        data:
          type: array
          items:
            $ref: '#/components/schemas/ReportView'
        meta:
          type: object
          description: Paging, on the operations that return a list.
          properties:
            limit:
              type: integer
            skip:
              type: integer
            nextCursor:
              type: string
          additionalProperties: true
    Error:
      type: object
      required:
        - success
        - message
      properties:
        success:
          type: boolean
          enum:
            - false
        message:
          type: string
        status:
          type: string
          enum:
            - error
        code:
          type: string
        timestamp:
          type: string
          format: date-time
        capability:
          type: string
          enum:
            - external-endpoints
            - ci-handoff
            - saved-presets
            - load-testing
            - direct-payment
            - bookings
            - scheduled-runs
        limit:
          type: object
          required:
            - id
            - used
            - cap
          properties:
            id:
              type: string
              enum:
                - connections
                - run-concurrency
            used:
              type: integer
            cap:
              type: integer
    ReportView:
      type: object
      additionalProperties: true
      required:
        - _id
        - status
        - ocpiVersion
      properties:
        _id:
          type: string
        runKind:
          type: string
          enum:
            - conformance
            - journey
        status:
          type: string
          enum:
            - queued
            - running
            - recovering
            - recovery_required
            - completed
            - failed
            - cancelled
            - interrupted
        ocpiVersion:
          type: string
        connectionLabel:
          type: string
        seed:
          type: string
          description: >-
            What this run was seeded with. Start another run with the same seed
            to send the same requests again. Absent from a shared report: a seed
            is caller-chosen, and pipelines name theirs after a branch or a
            customer.
        provenance:
          type: object
          description: >-
            What graded this run, stamped when it was admitted. Present on a
            shared report too, so a partner can check the verdict rather than
            take it on trust.
          properties:
            toolVersion:
              type: string
              description: >-
                The ChargerDojo build that ran the checks: the package version
                with the deployed commit as semver build metadata, for example
                1.4.0+7e6c796d.
            rosterHash:
              type: string
              description: >-
                Fingerprint of every check registered for this OCPI version in
                that build. Two reports with the same hash were graded against
                the same rules.
            specVersions:
              type: array
              items:
                type: string
              description: The OCPI versions that build could test.
        module:
          type: string
          description: >-
            The single OCPI module this run was scoped to. Absent means a sweep
            of every module the version advertises, less anything in
            withheldModules.
        withheldModules:
          type: array
          items:
            type: string
          description: >-
            Modules a sweep left out because the plan does not include them.
            Their checks did not run, so they contribute no failures: a zero in
            summary.failed is not a pass for these. Absent when nothing was
            withheld.
        draining:
          type: boolean
          description: >-
            The process carrying this run is being replaced by a release. The
            run keeps executing and finishes normally; only the answer is slower
            than usual. Absent once the run is finished.
        summary:
          $ref: '#/components/schemas/RunSummary'
        suites:
          type: array
          items:
            $ref: '#/components/schemas/SuiteResult'
          description: >-
            Per-suite results with every check and the exchange behind it.
            Absent on a list read, which omits it for size; fetch a run by id
            for the detail.
    RunSummary:
      type: object
      description: >-
        Graded counters. Absent on a run that never reached a verdict, such as
        one we interrupted: read status first, because a missing summary is not
        a summary of zeroes.
      properties:
        total:
          type: integer
          description: >-
            passed + failed + unobservable. warned is counted separately and
            overlaps the others, so it is not a fourth bucket.
        passed:
          type: integer
        failed:
          type: integer
        warned:
          type: integer
          description: >-
            Checks that declined something the spec only recommends. Counted
            independently of passed and failed, so a check that breaks a SHALL
            and declines a SHOULD lands in both. Never a reason to fail a build:
            gate on failed.
        unobservable:
          type: integer
          description: >-
            Checks that graded nothing. Neither a pass nor a failure, and what
            turns a verdict into partial coverage.
    SuiteResult:
      type: object
      required:
        - suiteId
        - module
        - total
        - passed
        - failed
        - warned
        - checks
      properties:
        suiteId:
          type: string
        module:
          type: string
        total:
          type: integer
        passed:
          type: integer
          description: >-
            Checks that ran and the partner satisfied. Excludes unobservable, so
            this only ever counts rules actually tested against them.
        failed:
          type: integer
        warned:
          type: integer
          description: >-
            Checks that diverged from something the spec only recommends.
            Counted independently, so a check can be both failed and warned.
            Never a reason to fail a build on its own.
        unobservable:
          type: integer
          description: >-
            Checks that graded nothing, because the response carried nothing to
            grade or no request was sent. Not a pass and not a failure.
        checks:
          type: array
          items:
            $ref: '#/components/schemas/Check'
    Check:
      type: object
      required:
        - testId
        - name
        - passed
        - expectedStatus
        - actualStatus
        - validations
      properties:
        testId:
          type: string
        name:
          type: string
        passed:
          type: boolean
          description: >-
            False only when a rule the spec REQUIRES was broken. A declined
            recommendation lands in warnings and leaves this true.
        expectedStatus:
          type: array
          items:
            type: integer
          description: >-
            Every HTTP status this check accepts, not just the first. A create
            the spec lets answer 201 or 200 accepts both.
        actualStatus:
          type: integer
        unreached:
          type: string
          enum:
            - dependency
            - transport
          description: >-
            Why this check has no response. dependency: an earlier step did not
            produce a value it needed, so nothing was sent. transport: it was
            sent and nothing came back, which says nothing about the partner.
        transportKind:
          type: string
          enum:
            - DNS
            - TLS
            - timeout
            - connection refused
            - transport
          description: >-
            Which layer refused, present only when unreached is transport. The
            same word your connection page shows for the identical failure on a
            registration call.
        unobservable:
          type: boolean
          description: >-
            The check graded nothing. passed stays true so no compliant partner
            is failed, and this is what stops the result being read as evidence.
        validations:
          type: array
          items:
            $ref: '#/components/schemas/Validation'
        warnings:
          type: array
          items:
            $ref: '#/components/schemas/Validation'
          description: Rules the spec only RECOMMENDS that this partner does not follow.
        references:
          type: array
          items:
            $ref: '#/components/schemas/SpecCitation'
          description: >-
            Where the specification governs the request this check makes, as
            authored on the check. Absent on checks nobody has written one for
            yet, which is most of them today. The clause a particular rule was
            graded against is on that rule, in validations[].references, and is
            never copied up to here.
        sourceCitations:
          type: array
          items:
            $ref: '#/components/schemas/SpecCitation'
          description: >-
            Chapters cited in this check's source, harvested from its comments.
            A weaker claim than references: one of these may govern the request,
            or one specific rule, or neither. It says only that somebody cited
            this chapter while writing this check.
        provenBy:
          type: array
          items:
            $ref: '#/components/schemas/MutantAttribution'
          description: >-
            Present only on a failed check: the deliberate defects in our own
            build that named this check id in advance and then reddened it.
            Absent on a check no mutation may name, which is permanent for the
            checks that grade only that a partner accepted something the spec
            also lets them refuse.
        exchange:
          $ref: '#/components/schemas/Exchange'
    Validation:
      type: object
      required:
        - passed
        - message
      properties:
        name:
          type: string
        passed:
          type: boolean
        message:
          type: string
        required:
          type: boolean
        severity:
          type: string
          enum:
            - shall
            - should
          description: >-
            The clause's normative strength. Absent means shall. A validation
            with required: false must declare should.
        unobservable:
          type: boolean
        references:
          type: array
          items:
            $ref: '#/components/schemas/SpecCitation'
          description: >-
            The clause this rule graded the partner against. Absent where nobody
            has written one yet; present does not mean every rule on the check
            has one.
        details: {}
    SpecCitation:
      type: object
      required:
        - path
        - section
      description: >-
        A pointer into the specification text this product is built from. path
        and section are always present; the rest depends on how the citation was
        written.
      properties:
        path:
          type: string
          description: >-
            The vendored chapter, as a repository path, for example
            vendor/ocpi-spec/2.2.1/credentials.asciidoc.
        section:
          type: string
          description: The chapter's own name for the section.
        anchor:
          type: string
          description: >-
            The section anchor in the chapter's source, so the citation survives
            the document being re-vendored.
        documentTitle:
          type: string
          description: >-
            Set instead of a quote for a module published as a standalone PDF,
            where the licence does not permit reproducing the text.
        page:
          type: integer
          description: PDF page, for a citation into a standalone document.
        strength:
          type: string
          enum:
            - SHALL
            - SHOULD
            - MAY
          description: >-
            How strongly the clause binds. Absent means the citation is an
            address somebody recorded, not a clause somebody read: no strength
            has been established, and none is guessed.
        quote:
          type: string
          description: >-
            The clause word for word. Verbatim or absent, never a paraphrase,
            and checked against the vendored text on every build.
    MutantAttribution:
      type: object
      required:
        - id
        - breaks
      description: >-
        One deliberate defect that proved a check can fail. We run our own OCPI
        server with exactly one rule broken, and each of those mutations names
        the check ids that must turn red before our build passes. It does not
        claim the mutation broke the very rule this check grades: that is a
        reading, and only the naming and the reddening are enforced.
      properties:
        id:
          type: string
          description: The mutation's own id, for example no-pagination-headers.
        breaks:
          type: string
          description: >-
            What that mutation breaks, in the words of the chapter it breaks, as
            the mutation itself declares it.
    Exchange:
      type: object
      required:
        - request
      description: >-
        The request sent and the response received. Credentials tokens are
        scrubbed where the exchange is captured, before it is stored.
      properties:
        request:
          type: object
          required:
            - method
            - url
            - headers
          properties:
            method:
              type: string
            url:
              type: string
            headers:
              type: object
              additionalProperties:
                type: string
            headersTruncated:
              type: boolean
            body: {}
            bodyTruncated:
              type: boolean
        response:
          type: object
          required:
            - status
          properties:
            status:
              type: integer
            headers:
              type: object
              additionalProperties:
                type: string
            headersTruncated:
              type: boolean
            body: {}
            bodyTruncated:
              type: boolean
        latencyMs:
          type: integer
        error:
          type: string
          description: >-
            Why no response came back, on a check that never got one. The field
            a transport failure is read through.
        errorTruncated:
          type: boolean
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: A cdojo_... API key created in the app under Settings.

````