Sendcloud Reporting API v3

Per-shipment cost reports and billing line items for back-office reconciliation.

Sendcloud Reporting API v3 is one of 20 APIs that Sendcloud publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

Tagged areas include Reporting and Billing. The published artifact set on APIs.io includes API documentation and an OpenAPI specification.

OpenAPI Specification

sendcloud-v3-reporting-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Reporting
  version: 3.0.0
  description: >-
    The Reporting API lets you generate and download CSV reports containing data
    related to your Sendcloud account for tracking and analysis purposes.
  contact:
    name: Sendcloud API Support
    url: https://www.sendcloud.dev
    email: [email protected]
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
  - url: https://panel.sendcloud.sc/api/v3
    description: Sendcloud Production
tags:
  - name: Reporting
    description: Generate data exports and reports.
paths:
  /reporting/parcels:
    post:
      tags:
        - Reporting
      summary: Create a parcels report
      description: >-
        Generate a CSV report containing information about outgoing or incoming
        parcels.
      x-mint:
        href: /api/v3/reporting/create-a-parcels-report
        content: >-
          The parcels included in the report are determined by the `filters` you
          send, and the columns are determined by the `fields` you select.


          Use this endpoint to create the report and obtain the report `id`,
          which you then poll with [Retrieve a parcels
          report](/api/v3/reporting/retrieve-a-parcels-report) until the CSV is
          ready for download.
      operationId: sc-public-v3-reporting-post-create_parcels_report
      security:
        - HTTPBasicAuth: []
        - OAuth2ClientCreds: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ParcelsReportRequest'
            examples:
              CreateParcelsReport:
                summary: Create a parcels report
                value:
                  fields:
                    - parcel_id
                    - tracking_number
                    - shipping_option_code
                    - status
                    - announced_at
                    - delivered_at
                  filters:
                    announced_after: '2025-04-01T00:00:00Z'
                    announced_before: '2025-04-30T23:59:59Z'
                    direction: outgoing
      responses:
        '202':
          description: Accepted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ParcelsReport'
              examples:
                ParcelsReportQueued:
                  summary: Report queued
                  value:
                    id: 419f3be0-2f49-434b-bee4-d8cff9cf7d01
                    organization_id: 12345
                    status: queued
                    status_message: The report is queued
                    fields:
                      - parcel_id
                      - tracking_number
                      - shipping_option_code
                      - status
                      - announced_at
                      - delivered_at
                    filters:
                      announced_after: '2025-04-01T00:00:00Z'
                      announced_before: '2025-04-30T23:59:59Z'
                      direction: outgoing
                    url: null
                    expires_at: null
                    updated_at: '2025-05-01T08:23:10.226265Z'
                    created_at: '2025-05-01T08:23:10.226265Z'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors'
              examples:
                RowLimitExceeded:
                  summary: Row limit exceeded
                  value:
                    errors:
                      - status: '400'
                        code: invalid
                        title: Bad Request
                        detail: >-
                          CSV export exceeds row limit of 100000, narrow the
                          date range or apply additional filters.
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors'
              examples:
                Unauthorized:
                  summary: Missing or invalid credentials
                  value:
                    errors:
                      - status: '401'
                        code: authentication_failed
                        title: Authentication Failed
                        detail: Unauthorized
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors'
              examples:
                Forbidden:
                  summary: Missing required feature access
                  value:
                    errors:
                      - status: '403'
                        code: forbidden
                        title: Forbidden
                        detail: Forbidden
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors'
              examples:
                InvalidField:
                  summary: Invalid field value
                  value:
                    errors:
                      - status: '422'
                        code: validation_error
                        title: Validation Error
                        detail: Input should be a valid datetime
                        source:
                          pointer: /data/attributes/filters/announced_after
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors'
              examples:
                UnknownError:
                  summary: Unexpected server error
                  value:
                    errors:
                      - status: '500'
                        code: unknown_error
                        title: Internal Server Error
                        detail: Something went wrong
  /reporting/parcels/{report_id}:
    get:
      tags:
        - Reporting
      summary: Retrieve a parcels report
      description: >-
        Retrieve a parcels report by id, including its current status and
        download URL when ready.
      x-mint:
        href: /api/v3/reporting/retrieve-a-parcels-report
        content: >-
          Use the `id` returned by [Create a parcels
          report](/api/v3/reporting/create-a-parcels-report). The report is
          generated asynchronously, so poll this endpoint until `status` is
          `ready`; the CSV is then available at the `url` field.


          Reports expire after a fixed period (see `expires_at`). Once expired,
          the download URL is no longer valid and the report must be
          regenerated.
      operationId: sc-public-v3-reporting-get-retrieve_parcels_report
      security:
        - HTTPBasicAuth: []
        - OAuth2ClientCreds: []
      parameters:
        - name: report_id
          in: path
          required: true
          description: Unique identifier of the report.
          schema:
            type: string
            format: uuid
            example: 419f3be0-2f49-434b-bee4-d8cff9cf7d01
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ParcelsReport'
              examples:
                ParcelsReportReady:
                  summary: Report ready
                  value:
                    id: 419f3be0-2f49-434b-bee4-d8cff9cf7d01
                    organization_id: 12345
                    status: ready
                    status_message: The report is ready
                    fields:
                      - parcel_id
                      - tracking_number
                      - shipping_option_code
                      - status
                      - announced_at
                      - delivered_at
                    filters:
                      announced_after: '2025-04-01T00:00:00Z'
                      announced_before: '2025-04-30T23:59:59Z'
                      direction: outgoing
                    url: >-
                      https://reporting-service.s3.eu-central-1.amazonaws.com/reports/parcels_v3/2025-05-01/419f3be0-2f49-434b-bee4-d8cff9cf7d01.csv
                    expires_at: '2025-05-01T08:38:10.226217Z'
                    updated_at: '2025-05-01T08:24:10.226265Z'
                    created_at: '2025-05-01T08:23:10.226265Z'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors'
              examples:
                Unauthorized:
                  summary: Missing or invalid credentials
                  value:
                    errors:
                      - status: '401'
                        code: authentication_failed
                        title: Authentication Failed
                        detail: Unauthorized
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors'
              examples:
                Forbidden:
                  summary: Missing required feature access
                  value:
                    errors:
                      - status: '403'
                        code: forbidden
                        title: Forbidden
                        detail: Forbidden
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/errors'
              examples:
                NotFound:
                  summary: Report not found
                  value:
                    errors:
                      - status: '404'
                        code: not_found
                        title: Not Found
                        detail: Not found
components:
  securitySchemes:
    HTTPBasicAuth:
      type: http
      description: >-
        Basic Authentication using API key and secrets is currently the main
        authentication mechanism.
      scheme: basic
    OAuth2ClientCreds:
      type: oauth2
      description: >-
        OAuth2 is a standardized protocol for authorization that allows users to
        share their private resources stored on one site with another site
        without having to provide their credentials. OAuth2 Client Credentials
        Grant workflow. This workflow is typically used for server-to-server
        interactions that require authorization to access specific resources.
      flows:
        clientCredentials:
          tokenUrl: https://account.sendcloud.com/oauth2/token/
          scopes:
            api: Default OAuth scope required to access Sendcloud API.
  schemas:
    ParcelDirection:
      type: string
      title: ParcelDirection
      description: The direction of the parcel.
      enum:
        - incoming
        - outgoing
      example: outgoing
    ReportStatus:
      type: string
      title: ReportStatus
      description: Current processing status of the report.
      enum:
        - queued
        - generating
        - ready
        - failed
        - expired
      example: ready
    ParcelsReportFields:
      type: string
      title: ParcelsReportFields
      description: A column that can be included in a parcels report.
      enum:
        - parcel_id
        - direction
        - carrier_code
        - carrier_name
        - from_address_company_name
        - contract_id
        - contract_type
        - from_address_city
        - from_address_postal_code
        - from_address_country_code
        - from_address_country_name
        - to_address_city
        - to_address_postal_code
        - to_address_country_code
        - to_address_country_name
        - order_number
        - tracking_number
        - announced_at
        - shipped_at
        - first_offer_at
        - delivered_at
        - shipping_option_code
        - total_cost
        - status
        - sub_status
        - integration_id
        - integration_type
        - weight
        - brand_id
        - brand_name
    ParcelsReportFilter:
      type: object
      title: ParcelsReportFilter
      description: Filters that determine which parcels are included in the report.
      properties:
        announced_after:
          type: string
          format: date-time
          description: >-
            Include only parcels announced on or after this time (ISO 8601, UTC
            default).
          example: '2025-04-01T00:00:00Z'
        announced_before:
          type: string
          format: date-time
          description: >-
            Include only parcels announced on or before this time (ISO 8601, UTC
            default).
          example: '2025-04-30T23:59:59Z'
        direction:
          $ref: '#/components/schemas/ParcelDirection'
        integration_id:
          type: integer
          minimum: 1
          description: Filter to parcels created by a specific shop integration id.
          example: 1
        brand_id:
          type: integer
          minimum: 1
          description: Filter to parcels created by a specific brand id.
          example: 1
        shipping_option_code:
          type: string
          minLength: 1
          maxLength: 256
          description: Filter to parcels shipped with the given shipping option code.
          example: postnl_standard
        updated_after:
          type: string
          format: date-time
          description: >-
            Include only parcels updated on or after this time (ISO 8601, UTC
            default).
          example: '2025-04-01T00:00:00Z'
        updated_before:
          type: string
          format: date-time
          description: >-
            Include only parcels updated on or before this time (ISO 8601, UTC
            default).
          example: '2025-04-30T23:59:59Z'
      required:
        - announced_after
        - announced_before
    ParcelsReportRequest:
      type: object
      title: ParcelsReportRequest
      description: Request body for creating a parcels report.
      properties:
        fields:
          type: array
          minItems: 1
          description: >-
            Columns to include in the CSV report, in the order they should
            appear.
          items:
            $ref: '#/components/schemas/ParcelsReportFields'
        filters:
          $ref: '#/components/schemas/ParcelsReportFilter'
      required:
        - fields
        - filters
    ParcelsReport:
      type: object
      title: ParcelsReport
      description: Represents a parcels report and its processing state.
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier of the report.
          example: 419f3be0-2f49-434b-bee4-d8cff9cf7d01
        organization_id:
          type: integer
          minimum: 1
          description: Identifier of the organization the report belongs to.
          example: 12345
        status:
          $ref: '#/components/schemas/ReportStatus'
        status_message:
          type: string
          description: Human-readable description of the current status.
          example: The report is ready
        fields:
          type: array
          description: Columns included in the report.
          items:
            $ref: '#/components/schemas/ParcelsReportFields'
        filters:
          $ref: '#/components/schemas/ParcelsReportFilter'
        url:
          type:
            - string
            - 'null'
          format: uri
          description: >-
            URL to download the CSV. `null` until the report status is `ready`,
            and again after expiry.
          example: >-
            https://reporting-service.s3.eu-central-1.amazonaws.com/reports/parcels_v3/2025-05-01/419f3be0-2f49-434b-bee4-d8cff9cf7d01.csv
        expires_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When the report (and its download URL) will expire. `null` until the
            report is `ready`.
          example: '2025-05-01T08:38:10.226217Z'
        updated_at:
          type: string
          format: date-time
          description: When the report was last updated.
          example: '2025-05-01T08:24:10.226265Z'
        created_at:
          type: string
          format: date-time
          description: When the report was created.
          example: '2025-05-01T08:23:10.226265Z'
      required:
        - id
        - organization_id
        - status
        - status_message
        - fields
        - filters
    ErrorObject:
      title: Error
      type: object
      description: Error in a JSON:API error format
      properties:
        id:
          type: string
          description: A unique identifier for the error.
        links:
          type: object
          description: >-
            A set of hyperlinks that provide additional information about the
            error.
          properties:
            about:
              type: string
              description: A URL that provides additional information about the error.
        status:
          type: string
          format: int32
          description: The HTTP status code of the error.
          minLength: 1
        code:
          type: string
          description: A unique error code for the error, in snake case format.
          minLength: 1
          enum:
            - unknown_field
            - invalid
            - forbidden
            - invalid_choice
            - min_value
            - 'null'
            - not_found
            - required
            - not_a_list
            - non_field_errors
            - authentication_failed
            - validation_error
            - parcel_announcement_error
        title:
          type: string
          description: A short, human-readable summary of the error.
          minLength: 1
        detail:
          type: string
          description: A human-readable explanation of the error.
          minLength: 1
        source:
          type: object
          description: >-
            An object that identifies the source of the error within the request
            payload.
          properties:
            pointer:
              type: string
              description: >-
                A `JSON` pointer to the location of the error within the request
                payload.
            parameter:
              type: string
              description: The name of the `query` parameter that caused the error.
            header:
              type: string
              description: The name of the `header` parameter that caused the error.
        meta:
          type: object
          description: Additional metadata about the error.
    errors:
      title: Errors
      type: object
      description: A standardized format for errors in JSON:API responses.
      properties:
        errors:
          type:
            - array
            - object
          items:
            type: object
            allOf:
              - $ref: '#/components/schemas/ErrorObject'
            required:
              - status
              - code
              - detail