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