project44 Tracking API

The project44 Tracking API provides real-time multimodal shipment tracking, predictive ETAs, status updates, and exception alerts across truckload, LTL, ocean, rail, air, and parcel modes. Shippers and LSPs use it to integrate visibility into TMS, OMS, and customer-facing systems.

OpenAPI Specification

project44-tracking-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: project44 Tracking API
  description: >-
    project44 Tracking API provides real-time shipment tracking and visibility for
    multimodal freight including truckload (TL), LTL, ocean, rail, air, and parcel.
    APIs deliver shipment status updates, predictive ETAs, and exception alerts.
  version: 2.0.0
  contact:
    name: project44 Support
    url: https://support.project44.com
  license:
    name: project44 Terms of Service
    url: https://www.project44.com/legal/
servers:
  - url: https://api.project44.com/api/v4
    description: project44 Production API

security:
  - oauth2: []

tags:
  - name: Shipments
    description: Shipment tracking and management
  - name: Status
    description: Shipment status updates
  - name: Tracking
    description: Real-time position and event tracking
  - name: Webhooks
    description: Webhook subscription management

paths:
  /shipments:
    post:
      operationId: createShipment
      summary: Create a tracked shipment
      description: Creates a new shipment to track, associating it with carrier and identifier information.
      tags:
        - Shipments
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ShipmentCreate'
      responses:
        '201':
          description: Shipment created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Shipment'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
    get:
      operationId: listShipments
      summary: List tracked shipments
      description: Returns a paginated list of tracked shipments with current status.
      tags:
        - Shipments
      parameters:
        - name: status
          in: query
          description: Filter by shipment lifecycle status
          schema:
            type: string
            enum: [AT_STOP, IN_TRANSIT, COMPLETED, EXCEPTION, UNKNOWN]
        - name: mode
          in: query
          description: Transportation mode filter
          schema:
            type: string
            enum: [TL, LTL, OCEAN, AIR, RAIL, PARCEL, DRAY]
        - name: carrierId
          in: query
          description: Carrier SCAC code or project44 carrier ID
          schema:
            type: string
        - name: updatedSince
          in: query
          description: Return shipments updated after this ISO 8601 timestamp
          schema:
            type: string
            format: date-time
        - name: page
          in: query
          schema:
            type: integer
            default: 0
        - name: pageSize
          in: query
          schema:
            type: integer
            default: 50
            maximum: 200
      responses:
        '200':
          description: Shipment list
          content:
            application/json:
              schema:
                type: object
                properties:
                  shipments:
                    type: array
                    items:
                      $ref: '#/components/schemas/Shipment'
                  pageInfo:
                    $ref: '#/components/schemas/PageInfo'
        '401':
          $ref: '#/components/responses/Unauthorized'

  /shipments/{shipmentId}:
    get:
      operationId: getShipment
      summary: Get a shipment
      description: Returns current status, position, ETA, and event history for a shipment.
      tags:
        - Shipments
      parameters:
        - $ref: '#/components/parameters/ShipmentId'
      responses:
        '200':
          description: Shipment details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ShipmentDetail'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteShipment
      summary: Stop tracking a shipment
      description: Removes a shipment from active tracking.
      tags:
        - Shipments
      parameters:
        - $ref: '#/components/parameters/ShipmentId'
      responses:
        '204':
          description: Shipment deleted

  /shipments/{shipmentId}/status-updates:
    get:
      operationId: getShipmentStatusUpdates
      summary: Get shipment status updates
      description: Returns the timeline of status updates and events for a shipment.
      tags:
        - Status
      parameters:
        - $ref: '#/components/parameters/ShipmentId'
        - name: limit
          in: query
          schema:
            type: integer
            default: 50
      responses:
        '200':
          description: Status update history
          content:
            application/json:
              schema:
                type: object
                properties:
                  statusUpdates:
                    type: array
                    items:
                      $ref: '#/components/schemas/StatusUpdate'
        '404':
          $ref: '#/components/responses/NotFound'

  /shipments/{shipmentId}/positions:
    get:
      operationId: getShipmentPositions
      summary: Get shipment position history
      description: Returns GPS position history for a shipment.
      tags:
        - Tracking
      parameters:
        - $ref: '#/components/parameters/ShipmentId'
        - name: startTime
          in: query
          schema:
            type: string
            format: date-time
        - name: endTime
          in: query
          schema:
            type: string
            format: date-time
        - name: limit
          in: query
          schema:
            type: integer
            default: 100
      responses:
        '200':
          description: Position history
          content:
            application/json:
              schema:
                type: object
                properties:
                  positions:
                    type: array
                    items:
                      $ref: '#/components/schemas/Position'
        '404':
          $ref: '#/components/responses/NotFound'

  /webhooks/subscriptions:
    get:
      operationId: listWebhookSubscriptions
      summary: List webhook subscriptions
      description: Returns all active webhook subscriptions for the authenticated account.
      tags:
        - Webhooks
      responses:
        '200':
          description: Webhook subscription list
          content:
            application/json:
              schema:
                type: object
                properties:
                  subscriptions:
                    type: array
                    items:
                      $ref: '#/components/schemas/WebhookSubscription'
    post:
      operationId: createWebhookSubscription
      summary: Create webhook subscription
      description: Creates a new webhook subscription to receive shipment event notifications.
      tags:
        - Webhooks
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookSubscriptionCreate'
      responses:
        '201':
          description: Subscription created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookSubscription'
        '400':
          $ref: '#/components/responses/BadRequest'

  /webhooks/subscriptions/{subscriptionId}:
    delete:
      operationId: deleteWebhookSubscription
      summary: Delete webhook subscription
      description: Removes an active webhook subscription.
      tags:
        - Webhooks
      parameters:
        - name: subscriptionId
          in: path
          required: true
          schema:
            type: string
      responses:
        '204':
          description: Subscription deleted

components:
  securitySchemes:
    oauth2:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://api.project44.com/api/v4/oauth2/token
          scopes:
            tracking.read: Read shipment tracking data
            tracking.write: Create and manage shipments
            webhooks.write: Manage webhook subscriptions

  parameters:
    ShipmentId:
      name: shipmentId
      in: path
      required: true
      description: project44 shipment identifier
      schema:
        type: string
        format: uuid

  responses:
    BadRequest:
      description: Invalid request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Authentication required
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'

  schemas:
    Shipment:
      type: object
      description: A tracked freight shipment
      properties:
        id:
          type: string
          format: uuid
          description: project44 internal shipment ID
        masterShipmentId:
          type: string
          description: Unique master shipment ID across modes
        mode:
          type: string
          enum: [TL, LTL, OCEAN, AIR, RAIL, PARCEL, DRAY]
        status:
          type: string
          enum: [AT_STOP, IN_TRANSIT, COMPLETED, EXCEPTION, UNKNOWN]
        carrierCode:
          type: string
          description: Carrier SCAC code
        carrierName:
          type: string
        proNumber:
          type: string
          description: PRO/tracking number
        bolNumber:
          type: string
          description: Bill of lading number
        poNumber:
          type: string
          description: Purchase order number
        origin:
          $ref: '#/components/schemas/ShipmentStop'
        destination:
          $ref: '#/components/schemas/ShipmentStop'
        estimatedDelivery:
          $ref: '#/components/schemas/ETAWindow'
        currentPosition:
          $ref: '#/components/schemas/Position'
        exceptions:
          type: array
          items:
            $ref: '#/components/schemas/ShipmentException'
        createDatetime:
          type: string
          format: date-time
        lastUpdateDatetime:
          type: string
          format: date-time

    ShipmentCreate:
      type: object
      required:
        - mode
        - carrierCode
        - identifiers
      properties:
        mode:
          type: string
          enum: [TL, LTL, OCEAN, AIR, RAIL, PARCEL, DRAY]
        carrierCode:
          type: string
          description: SCAC code
        identifiers:
          type: array
          description: At least one tracking identifier required
          items:
            type: object
            required:
              - type
              - value
            properties:
              type:
                type: string
                enum: [PRO, BOL, PO, TRACKING_NUMBER, CONTAINER_NUMBER, BOOKING_NUMBER]
              value:
                type: string
        stops:
          type: array
          items:
            $ref: '#/components/schemas/ShipmentStopInput'

    ShipmentDetail:
      allOf:
        - $ref: '#/components/schemas/Shipment'
        - type: object
          properties:
            stops:
              type: array
              items:
                $ref: '#/components/schemas/ShipmentStop'
            statusUpdates:
              type: array
              items:
                $ref: '#/components/schemas/StatusUpdate'

    ShipmentStop:
      type: object
      properties:
        stopNumber:
          type: integer
        stopType:
          type: string
          enum: [ORIGIN, DESTINATION, INTERMEDIATE]
        name:
          type: string
        address:
          type: string
        city:
          type: string
        state:
          type: string
        postalCode:
          type: string
        country:
          type: string
          maxLength: 3
        latitude:
          type: number
          format: double
        longitude:
          type: number
          format: double
        appointmentWindow:
          $ref: '#/components/schemas/TimeWindow'
        actualArrival:
          type: string
          format: date-time
          nullable: true
        actualDeparture:
          type: string
          format: date-time
          nullable: true

    ShipmentStopInput:
      type: object
      required:
        - stopNumber
        - stopType
      properties:
        stopNumber:
          type: integer
        stopType:
          type: string
          enum: [ORIGIN, DESTINATION, INTERMEDIATE]
        city:
          type: string
        state:
          type: string
        postalCode:
          type: string
        country:
          type: string
          maxLength: 3
        appointmentWindow:
          $ref: '#/components/schemas/TimeWindow'

    StatusUpdate:
      type: object
      properties:
        updateId:
          type: string
        timestamp:
          type: string
          format: date-time
        statusCode:
          type: string
        statusDescription:
          type: string
        city:
          type: string
        state:
          type: string
        country:
          type: string
          maxLength: 3
        isException:
          type: boolean
        exceptionCode:
          type: string
          nullable: true
        source:
          type: string
          enum: [CARRIER_EDI, CARRIER_API, TELEMATICS, MANUAL]

    Position:
      type: object
      properties:
        timestamp:
          type: string
          format: date-time
        latitude:
          type: number
          format: double
        longitude:
          type: number
          format: double
        heading:
          type: number
          format: double
          nullable: true
        speed:
          type: number
          format: double
          nullable: true
        speedUnit:
          type: string
          enum: [MPH, KPH]

    ETAWindow:
      type: object
      properties:
        estimatedAt:
          type: string
          format: date-time
        confidenceLow:
          type: string
          format: date-time
        confidenceHigh:
          type: string
          format: date-time
        predictedOnTime:
          type: boolean
        predictedLateMinutes:
          type: integer
          nullable: true

    TimeWindow:
      type: object
      properties:
        startDateTime:
          type: string
          format: date-time
        endDateTime:
          type: string
          format: date-time

    ShipmentException:
      type: object
      properties:
        exceptionCode:
          type: string
        description:
          type: string
        severity:
          type: string
          enum: [LOW, MEDIUM, HIGH, CRITICAL]
        timestamp:
          type: string
          format: date-time
        resolvedAt:
          type: string
          format: date-time
          nullable: true

    WebhookSubscription:
      type: object
      properties:
        id:
          type: string
        callbackUrl:
          type: string
          format: uri
        eventTypes:
          type: array
          items:
            type: string
        status:
          type: string
          enum: [ACTIVE, PAUSED, FAILED]
        createDatetime:
          type: string
          format: date-time

    WebhookSubscriptionCreate:
      type: object
      required:
        - callbackUrl
        - eventTypes
      properties:
        callbackUrl:
          type: string
          format: uri
          description: HTTPS URL to receive event notifications
        eventTypes:
          type: array
          description: Event types to subscribe to
          items:
            type: string
            enum: [SHIPMENT_CREATED, STATUS_UPDATE, POSITION_UPDATE, ETA_CHANGE, EXCEPTION, COMPLETED]
        secret:
          type: string
          description: HMAC secret for webhook signature verification

    PageInfo:
      type: object
      properties:
        page:
          type: integer
        pageSize:
          type: integer
        totalCount:
          type: integer
        hasNextPage:
          type: boolean

    Error:
      type: object
      properties:
        code:
          type: string
        message:
          type: string
        details:
          type: array
          items:
            type: object