> ## 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.

# CarrierShipmentTracker

> Tracking for one package of a label bought with purchaseCarrierShipment. 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.

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

<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`).

      <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-scan">CarrierShipmentTrackerScan!</a>} required>
          The item at this edge.
        </ResponseField>
      </Expandable>
    </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`.

      <Expandable title="fields" lazyRender>
        <ResponseField name="city" type="String">
          The city where the scan occurred, if reported.
        </ResponseField>

        <ResponseField name="country" type="String">
          The country where the scan occurred, if reported.
        </ResponseField>

        <ResponseField name="message" type="String">
          The carrier's scan message, if any.
        </ResponseField>

        <ResponseField name="occurredAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
          When the carrier recorded this scan.
        </ResponseField>

        <ResponseField name="postalCode" type="String">
          The postal code where the scan occurred, if reported.
        </ResponseField>

        <ResponseField name="state" type="String">
          The state or province where the scan occurred, if reported.
        </ResponseField>

        <ResponseField name="statusDetail" type="String">
          The carrier's raw status detail, if any.
        </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>

<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>


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