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

# carrierShipmentTrackers

> List tracking for purchased packages, by shipment, tracking number, status, or recent change. Redo checks the carrier about every 4 hours until the package is delivered, returned, or cancelled, or 21 days after purchase. There are no tracking webhooks yet, so poll. Labels from carriers that only push updates (Sendcloud, WeGrow, NZ Post) keep the status they had at purchase. Selecting scans multiplies each tracker's query cost by the scan page size, so a large page with scans can exceed the query cost limit: poll without scans, then fetch scans only for trackers that changed.

**Required scopes:** [`shipping_read`](/docs/api-reference/v3/reference/scopes#scope-shipping_read)

## Arguments

<ResponseField name="after" type="String">
  Forward pagination cursor — returns trackers after it.
</ResponseField>

<ResponseField name="before" type="String">
  Backward pagination cursor — returns trackers before it.
</ResponseField>

<ResponseField name="first" type="Int">
  Forward pagination: returns the first N trackers (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
</ResponseField>

<ResponseField name="last" type="Int">
  Backward pagination: returns the last N trackers (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
</ResponseField>

<ResponseField name="orderBy" type={<a href="/docs/api-reference/v3/reference/shipping/carrier-shipment-tracker-sort-key">CarrierShipmentTrackerSortKey</a>}>
  Which key to sort by (defaults to the first key, newest-first). Combine with `reverse` to flip direction.
</ResponseField>

<ResponseField name="reverse" type="Boolean">
  Reverses the sort direction selected by `orderBy` (or its default).
</ResponseField>

<ResponseField name="shipmentId" type="ID">
  Only trackers for this shipmentId from purchaseCarrierShipment.
</ResponseField>

<ResponseField name="status" type={<a href="/docs/api-reference/v3/reference/shipping/carrier-shipment-tracker-status">CarrierShipmentTrackerStatus</a>}>
  Only trackers with this status. UNKNOWN also matches statuses Redo does not recognize.
</ResponseField>

<ResponseField name="trackingNumber" type="String">
  Only trackers with this carrier tracking number.
</ResponseField>

<ResponseField name="updatedAtAfter" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
  Only trackers whose status, status detail, latest scan, or delivery dates changed at or after this ISO-8601 instant. To poll only what changed, pass the start of your previous poll minus a few minutes and de-duplicate by id: a change can be stamped slightly before it becomes visible.
</ResponseField>

## Returns

<ResponseField name="carrierShipmentTrackers" type={<a href="/docs/api-reference/v3/pagination">CarrierShipmentTrackerConnection!</a>} required>
  A paginated list of CarrierShipmentTracker items.

  <Expandable title="fields" lazyRender>
    <ResponseField name="edges" type={<a href="/docs/api-reference/v3/pagination">[CarrierShipmentTrackerEdge!]!</a>} required>
      The list of edges (each a node plus its pagination `cursor`).

      <Expandable title="fields" lazyRender>
        <ResponseField name="cursor" type="String!" required>
          Opaque cursor for this item; pass to `after`/`before` to page from here.
        </ResponseField>

        <ResponseField name="node" type={<a href="/docs/api-reference/v3/reference/shipping/carrier-shipment-tracker">CarrierShipmentTracker!</a>} required>
          The item at this edge.

          <Expandable title="fields" lazyRender>
            <ResponseField name="carrier" type="String!" required>
              The carrier the label was bought from, as purchaseCarrierShipment returned it.
            </ResponseField>

            <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When tracking started, right after purchase.
            </ResponseField>

            <ResponseField name="deliveredAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
              When the package was delivered, if it has been.
            </ResponseField>

            <ResponseField name="estimatedDeliveryAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
              The carrier's estimated delivery time, if known.
            </ResponseField>

            <ResponseField name="id" type="ID!" required>
              The id of this carrier shipment tracker.
            </ResponseField>

            <ResponseField name="lastCheckedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
              When the carrier last returned tracking data to Redo. Null until it first does, even while Redo is checking.
            </ResponseField>

            <ResponseField name="scans" type={<a href="/docs/api-reference/v3/pagination">CarrierShipmentTrackerScanConnection!</a>} required>
              The package's carrier scans, newest first. Each tracker's query cost grows with the scan page size, so select scans only for trackers that changed.

              **Requires:** [`shipping_read`](/docs/api-reference/v3/reference/scopes#scope-shipping_read)

              <Expandable title="fields" lazyRender>
                **Arguments**

                <ResponseField name="after" type="String">
                  Forward pagination cursor — returns scans after it.
                </ResponseField>

                <ResponseField name="before" type="String">
                  Backward pagination cursor — returns scans before it.
                </ResponseField>

                <ResponseField name="first" type="Int">
                  Forward pagination: returns the first N scans (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
                </ResponseField>

                <ResponseField name="last" type="Int">
                  Backward pagination: returns the last N scans (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
                </ResponseField>
              </Expandable>
            </ResponseField>

            <ResponseField name="shipmentId" type="ID!" required>
              The shipmentId purchaseCarrierShipment returned for this package's shipment.
            </ResponseField>

            <ResponseField name="status" type={<a href="/docs/api-reference/v3/reference/shipping/carrier-shipment-tracker-status">CarrierShipmentTrackerStatus!</a>} required>
              The package's current delivery status. Usually PRE\_TRANSIT until the first carrier scan. Redo checks the carrier about every 4 hours until the package is delivered, returned, or cancelled, or 21 days after purchase. There are no tracking webhooks yet, so poll. Labels from carriers that only push updates (Sendcloud, WeGrow, NZ Post) keep the status they had at purchase.
            </ResponseField>

            <ResponseField name="statusDetail" type="String">
              The carrier's raw status detail, if any.
            </ResponseField>

            <ResponseField name="trackingNumber" type="String!" required>
              The carrier tracking number.
            </ResponseField>

            <ResponseField name="updatedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When the status, status detail, latest scan, or delivery dates last changed.
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="nodes" type={<a href="/docs/api-reference/v3/reference/shipping/carrier-shipment-tracker">[CarrierShipmentTracker!]!</a>} required>
      The nodes in this page, without the edge/cursor wrapper — a convenience over `edges`.

      <Expandable title="fields" lazyRender>
        <ResponseField name="carrier" type="String!" required>
          The carrier the label was bought from, as purchaseCarrierShipment returned it.
        </ResponseField>

        <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
          When tracking started, right after purchase.
        </ResponseField>

        <ResponseField name="deliveredAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
          When the package was delivered, if it has been.
        </ResponseField>

        <ResponseField name="estimatedDeliveryAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
          The carrier's estimated delivery time, if known.
        </ResponseField>

        <ResponseField name="id" type="ID!" required>
          The id of this carrier shipment tracker.
        </ResponseField>

        <ResponseField name="lastCheckedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
          When the carrier last returned tracking data to Redo. Null until it first does, even while Redo is checking.
        </ResponseField>

        <ResponseField name="scans" type={<a href="/docs/api-reference/v3/pagination">CarrierShipmentTrackerScanConnection!</a>} required>
          The package's carrier scans, newest first. Each tracker's query cost grows with the scan page size, so select scans only for trackers that changed.

          **Requires:** [`shipping_read`](/docs/api-reference/v3/reference/scopes#scope-shipping_read)

          <Expandable title="fields" lazyRender>
            **Arguments**

            <ResponseField name="after" type="String">
              Forward pagination cursor — returns scans after it.
            </ResponseField>

            <ResponseField name="before" type="String">
              Backward pagination cursor — returns scans before it.
            </ResponseField>

            <ResponseField name="first" type="Int">
              Forward pagination: returns the first N scans (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
            </ResponseField>

            <ResponseField name="last" type="Int">
              Backward pagination: returns the last N scans (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
            </ResponseField>

            **Fields**

            <ResponseField name="edges" type={<a href="/docs/api-reference/v3/pagination">[CarrierShipmentTrackerScanEdge!]!</a>} required>
              The list of edges (each a node plus its pagination `cursor`).
            </ResponseField>

            <ResponseField name="nodes" type={<a href="/docs/api-reference/v3/reference/shipping/carrier-shipment-tracker-scan">[CarrierShipmentTrackerScan!]!</a>} required>
              The nodes in this page, without the edge/cursor wrapper — a convenience over `edges`.
            </ResponseField>

            <ResponseField name="pageInfo" type={<a href="/docs/api-reference/v3/pagination">PageInfo!</a>} required>
              Pagination metadata for the current page.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="shipmentId" type="ID!" required>
          The shipmentId purchaseCarrierShipment returned for this package's shipment.
        </ResponseField>

        <ResponseField name="status" type={<a href="/docs/api-reference/v3/reference/shipping/carrier-shipment-tracker-status">CarrierShipmentTrackerStatus!</a>} required>
          The package's current delivery status. Usually PRE\_TRANSIT until the first carrier scan. Redo checks the carrier about every 4 hours until the package is delivered, returned, or cancelled, or 21 days after purchase. There are no tracking webhooks yet, so poll. Labels from carriers that only push updates (Sendcloud, WeGrow, NZ Post) keep the status they had at purchase.
        </ResponseField>

        <ResponseField name="statusDetail" type="String">
          The carrier's raw status detail, if any.
        </ResponseField>

        <ResponseField name="trackingNumber" type="String!" required>
          The carrier tracking number.
        </ResponseField>

        <ResponseField name="updatedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
          When the status, status detail, latest scan, or delivery dates last changed.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="pageInfo" type={<a href="/docs/api-reference/v3/pagination">PageInfo!</a>} required>
      Pagination metadata for the current page.

      <Expandable title="fields" lazyRender>
        <ResponseField name="endCursor" type="String">
          Cursor of the last edge in this page; pass to `after` to page forward.
        </ResponseField>

        <ResponseField name="hasNextPage" type="Boolean!" required>
          Whether more items exist after this page (drives forward pagination with `first`/`after`).
        </ResponseField>

        <ResponseField name="hasPreviousPage" type="Boolean!" required>
          Whether more items exist before this page (drives backward pagination with `last`/`before`).
        </ResponseField>

        <ResponseField name="startCursor" type="String">
          Cursor of the first edge in this page; pass to `before` to page backward.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

## Example

```graphql theme={null}
query {
  carrierShipmentTrackers(after: "...", before: "...", first: 10, last: 10, orderBy: CREATED_AT, reverse: true, shipmentId: "...", status: AVAILABLE_FOR_PICKUP, trackingNumber: "...", updatedAtAfter: "...") {
    nodes {
      carrier
      createdAt
      deliveredAt
      estimatedDeliveryAt
      id
      lastCheckedAt
      shipmentId
      status
      # ...
    }
    pageInfo { hasNextPage endCursor }
  }
}
```


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