TrackingMore API

TrackingMore provides a unified multi-carrier shipment tracking REST API supporting 1,300+ carriers globally. The API enables real-time parcel tracking, webhook notifications for shipment status changes, automated carrier detection, delivery analytics, and branded tracking page customization. Designed for D2C merchants, logistics platforms, and ecommerce integrations across Shopify, Amazon, eBay, WooCommerce, and Magento.

Documentation

Specifications

SDKs

Other Resources

OpenAPI Specification

trackingmore-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: TrackingMore API
  description: >-
    TrackingMore provides a unified multi-carrier shipment tracking REST API
    supporting 1,300+ carriers globally. The API enables real-time parcel
    tracking, webhook notifications for shipment status changes, automated
    carrier detection, delivery analytics, and branded tracking page
    customization. Designed for D2C merchants, logistics platforms, and
    ecommerce integrations across Shopify, Amazon, eBay, WooCommerce, and
    Magento.
  version: v4
  contact:
    url: https://support.trackingmore.com/
  termsOfService: https://www.trackingmore.com/terms-of-service.html
  license:
    name: Proprietary
    url: https://www.trackingmore.com/terms-of-service.html
servers:
  - url: https://api.trackingmore.com/v4
    description: TrackingMore API v4 (production)
security:
  - ApiKeyAuth: []
tags:
  - name: Trackings
    description: Create, retrieve, update, and delete shipment trackings
  - name: Couriers
    description: List available couriers and detect carrier from tracking number
  - name: Air Waybills
    description: Track air cargo using Master Air Waybill (MAWB) numbers
paths:
  /trackings/create:
    post:
      operationId: createTracking
      summary: Create a tracking
      description: >-
        Create a new shipment tracking. Requires a tracking number and courier
        code. Each unique tracking_number + courier_code pair consumes 1 credit.
      tags:
        - Trackings
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTrackingRequest'
            examples:
              basic:
                summary: Basic tracking creation
                value:
                  tracking_number: "9400111899223397576146"
                  courier_code: "usps"
      responses:
        '200':
          description: Tracking created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TrackingResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
  /trackings/batch:
    post:
      operationId: batchCreateTrackings
      summary: Batch create trackings
      description: >-
        Create up to 40 shipment trackings in a single API call. Each item
        requires a tracking_number and courier_code.
      tags:
        - Trackings
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/CreateTrackingRequest'
              maxItems: 40
            examples:
              batch:
                summary: Batch of two trackings
                value:
                  - tracking_number: "9400111899223397576146"
                    courier_code: "usps"
                  - tracking_number: "1Z999AA10123456784"
                    courier_code: "ups"
      responses:
        '200':
          description: Batch tracking creation result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchTrackingResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
  /trackings/get:
    get:
      operationId: getTrackingResults
      summary: Get tracking results
      description: >-
        Retrieve tracking results for one or more shipments. Supports filtering
        by courier code, tracking status, date range, and other parameters.
      tags:
        - Trackings
      parameters:
        - name: tracking_number
          in: query
          description: Tracking number to filter by
          schema:
            type: string
        - name: courier_code
          in: query
          description: Carrier/courier code to filter by
          schema:
            type: string
        - name: status
          in: query
          description: Shipment status to filter by (e.g., pending, transit, delivered, exception)
          schema:
            type: string
            enum:
              - pending
              - transit
              - delivered
              - exception
              - expired
              - notfound
              - undelivered
              - pickup
              - inforeceived
        - name: created_at_min
          in: query
          description: Filter by minimum creation date (Unix timestamp or ISO 8601)
          schema:
            type: string
        - name: created_at_max
          in: query
          description: Filter by maximum creation date (Unix timestamp or ISO 8601)
          schema:
            type: string
        - name: updated_at_min
          in: query
          description: Filter by minimum last updated date (Unix timestamp or ISO 8601)
          schema:
            type: string
        - name: updated_at_max
          in: query
          description: Filter by maximum last updated date (Unix timestamp or ISO 8601)
          schema:
            type: string
        - name: page
          in: query
          description: Page number for pagination (default 1)
          schema:
            type: integer
            minimum: 1
            default: 1
        - name: limit
          in: query
          description: Number of results per page (default 40, max 100)
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 40
        - name: lang
          in: query
          description: Language code for translated tracking messages
          schema:
            type: string
      responses:
        '200':
          description: List of tracking results
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TrackingListResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
  /trackings/update/{id}:
    put:
      operationId: updateTrackingById
      summary: Update a tracking
      description: >-
        Update metadata or custom fields for an existing tracking identified by
        its unique ID.
      tags:
        - Trackings
      parameters:
        - name: id
          in: path
          required: true
          description: Unique tracking identifier
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateTrackingRequest'
      responses:
        '200':
          description: Tracking updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TrackingResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
  /trackings/delete/{id}:
    delete:
      operationId: deleteTrackingById
      summary: Delete a tracking
      description: Permanently delete a shipment tracking by its unique ID.
      tags:
        - Trackings
      parameters:
        - name: id
          in: path
          required: true
          description: Unique tracking identifier
          schema:
            type: string
      responses:
        '200':
          description: Tracking deleted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
  /trackings/retrack/{id}:
    post:
      operationId: retrackTrackingById
      summary: Retrack a tracking
      description: >-
        Request a fresh tracking update for a shipment that has stopped
        updating. Useful for expired or stale trackings.
      tags:
        - Trackings
      parameters:
        - name: id
          in: path
          required: true
          description: Unique tracking identifier
          schema:
            type: string
      responses:
        '200':
          description: Retrack request submitted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TrackingResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
  /couriers/all:
    get:
      operationId: getAllCouriers
      summary: Get all couriers
      description: >-
        Retrieve the full list of supported carriers/couriers available on the
        TrackingMore platform (1,300+ globally).
      tags:
        - Couriers
      responses:
        '200':
          description: List of all supported couriers
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CourierListResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
  /couriers/detect:
    post:
      operationId: detectCourier
      summary: Detect courier
      description: >-
        Automatically detect which carrier(s) a tracking number belongs to
        based on pattern matching and heuristics.
      tags:
        - Couriers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DetectCourierRequest'
            examples:
              detect:
                summary: Detect courier for a tracking number
                value:
                  tracking_number: "9400111899223397576146"
      responses:
        '200':
          description: Detected courier(s) for the tracking number
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DetectCourierResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
  /awb:
    post:
      operationId: createAirWaybill
      summary: Track air waybill
      description: >-
        Track an air cargo shipment using a Master Air Waybill (MAWB) number
        in format XXX-XXXXXXXX. Each air waybill track consumes 50 credits.
      tags:
        - Air Waybills
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AirWaybillRequest'
            examples:
              awb:
                summary: Track an air waybill
                value:
                  awb_number: "020-12345678"
      responses:
        '200':
          description: Air waybill tracking result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AirWaybillResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Tracking-Api-Key
      description: >-
        API key for authentication. Obtainable from your TrackingMore account
        dashboard. Up to 4 API keys per account.
  schemas:
    CreateTrackingRequest:
      type: object
      required:
        - tracking_number
        - courier_code
      properties:
        tracking_number:
          type: string
          description: The shipment tracking number
          example: "9400111899223397576146"
        courier_code:
          type: string
          description: The carrier/courier code (e.g., usps, ups, fedex, dhl)
          example: "usps"
        title:
          type: string
          description: Custom title or label for this tracking
        customer_name:
          type: string
          description: Name of the customer associated with this shipment
        customer_email:
          type: string
          format: email
          description: Customer email for notifications
        order_id:
          type: string
          description: Your internal order ID
        order_id_url:
          type: string
          format: uri
          description: URL to your order management page for this order
        note:
          type: string
          description: Free-form note or comment about this tracking
        language:
          type: string
          description: Language code for translated tracking messages (e.g., en, zh-CN)
        destination_country:
          type: string
          description: ISO 3166-1 alpha-2 destination country code
        origin_country:
          type: string
          description: ISO 3166-1 alpha-2 origin country code
    UpdateTrackingRequest:
      type: object
      properties:
        title:
          type: string
          description: Updated title/label for the tracking
        customer_name:
          type: string
          description: Updated customer name
        customer_email:
          type: string
          format: email
          description: Updated customer email
        order_id:
          type: string
          description: Updated internal order ID
        note:
          type: string
          description: Updated note or comment
        language:
          type: string
          description: Updated language code for translated messages
    DetectCourierRequest:
      type: object
      required:
        - tracking_number
      properties:
        tracking_number:
          type: string
          description: The tracking number to detect the carrier for
          example: "9400111899223397576146"
    AirWaybillRequest:
      type: object
      required:
        - awb_number
      properties:
        awb_number:
          type: string
          description: Master Air Waybill number in format XXX-XXXXXXXX or XXXXXXXXXXX
          pattern: '^\d{3}[ -]?(\d{8})$'
          example: "020-12345678"
    Tracking:
      type: object
      properties:
        id:
          type: string
          description: Unique tracking identifier
        tracking_number:
          type: string
          description: Shipment tracking number
        courier_code:
          type: string
          description: Carrier/courier code
        order_id:
          type: string
          description: Associated order ID
        title:
          type: string
          description: Custom title/label for the tracking
        customer_name:
          type: string
          description: Customer name
        customer_email:
          type: string
          description: Customer email
        note:
          type: string
          description: Custom note
        status:
          type: string
          description: Current tracking status
          enum:
            - pending
            - inforeceived
            - transit
            - pickup
            - delivered
            - undelivered
            - exception
            - expired
            - notfound
        substatus:
          type: string
          description: More specific sub-status code
        origin_country:
          type: string
          description: ISO country code of origin
        destination_country:
          type: string
          description: ISO country code of destination
        created_at:
          type: string
          format: date-time
          description: Timestamp when this tracking was created
        updated_at:
          type: string
          format: date-time
          description: Timestamp of last update
        last_event:
          type: string
          description: Description of the most recent tracking event
        last_update_time:
          type: string
          format: date-time
          description: Time of the most recent carrier update
        origin_info:
          type: object
          description: Tracking events at the origin location
          properties:
            trackinfo:
              type: array
              items:
                $ref: '#/components/schemas/TrackingEvent'
        destination_info:
          type: object
          description: Tracking events at the destination location
          properties:
            trackinfo:
              type: array
              items:
                $ref: '#/components/schemas/TrackingEvent'
        tracking:
          type: object
          description: Combined tracking events object
    TrackingEvent:
      type: object
      properties:
        checkpoint_date:
          type: string
          format: date-time
          description: Date and time of this tracking checkpoint
        location:
          type: string
          description: Location description for this checkpoint
        checkpoint_status:
          type: string
          description: Status at this checkpoint
        substatus:
          type: string
          description: Detailed sub-status at this checkpoint
        details:
          type: string
          description: Human-readable description of the checkpoint event
    Courier:
      type: object
      properties:
        courier_code:
          type: string
          description: Unique carrier code used in API requests
          example: "usps"
        courier_name:
          type: string
          description: Human-readable carrier name
          example: "USPS"
        courier_url:
          type: string
          format: uri
          description: Carrier website URL
        phone:
          type: string
          description: Carrier customer service phone number
        country:
          type: string
          description: Country where this carrier primarily operates
        type:
          type: string
          description: Carrier type (e.g., express, postal, freight)
    AirWaybill:
      type: object
      properties:
        awb_number:
          type: string
          description: Master Air Waybill number
        airline:
          type: string
          description: Airline name
        origin:
          type: string
          description: Origin airport IATA code
        destination:
          type: string
          description: Destination airport IATA code
        status:
          type: string
          description: Shipment status
        events:
          type: array
          items:
            type: object
            properties:
              date:
                type: string
                format: date-time
              location:
                type: string
              description:
                type: string
    ApiResponse:
      type: object
      properties:
        code:
          type: integer
          description: Response code (200 = success)
        message:
          type: string
          description: Human-readable response message
        data:
          description: Response payload (varies by endpoint)
    TrackingResponse:
      allOf:
        - $ref: '#/components/schemas/ApiResponse'
        - type: object
          properties:
            data:
              $ref: '#/components/schemas/Tracking'
    BatchTrackingResponse:
      allOf:
        - $ref: '#/components/schemas/ApiResponse'
        - type: object
          properties:
            data:
              type: object
              properties:
                accepted:
                  type: array
                  items:
                    $ref: '#/components/schemas/Tracking'
                rejected:
                  type: array
                  items:
                    type: object
                    properties:
                      tracking_number:
                        type: string
                      courier_code:
                        type: string
                      error:
                        type: string
    TrackingListResponse:
      allOf:
        - $ref: '#/components/schemas/ApiResponse'
        - type: object
          properties:
            data:
              type: object
              properties:
                total:
                  type: integer
                  description: Total number of trackings matching the query
                trackings:
                  type: array
                  items:
                    $ref: '#/components/schemas/Tracking'
    CourierListResponse:
      allOf:
        - $ref: '#/components/schemas/ApiResponse'
        - type: object
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/Courier'
    DetectCourierResponse:
      allOf:
        - $ref: '#/components/schemas/ApiResponse'
        - type: object
          properties:
            data:
              type: array
              items:
                $ref: '#/components/schemas/Courier'
    AirWaybillResponse:
      allOf:
        - $ref: '#/components/schemas/ApiResponse'
        - type: object
          properties:
            data:
              $ref: '#/components/schemas/AirWaybill'
    ErrorResponse:
      type: object
      properties:
        code:
          type: integer
          description: Error code
        message:
          type: string
          description: Human-readable error message
        data:
          type: array
          items: {}
          description: Empty array for error responses
  responses:
    BadRequest:
      description: Bad request - missing or invalid parameters
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: 4000
            message: "Bad Request"
            data: []
    Unauthorized:
      description: Authentication failed - invalid or missing API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: 4001
            message: "Invalid API key."
            data: []
    NotFound:
      description: The requested resource was not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: 4004
            message: "Not found."
            data: []
    RateLimitExceeded:
      description: >-
        Rate limit exceeded. Wait 120 seconds before retrying.
        Pro plan limit is 10 req/s (3 req/s for create tracking).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            code: 4029
            message: "Too many requests."
            data: []