Releases: AfterShip/tracking-sdk-java
Release list
12.0.0
What's New - AfterShip Tracking Java SDK v12.0.0
This release upgrades the SDK to the AfterShip Tracking API version 2026-07 (previously 2026-01). All endpoints now call /tracking/2026-07/.... See the 2026-07 Migration Guide for the underlying API changes.
There are no breaking changes — all 2026-07 API changes are additive. The major version bump reflects the API version upgrade only.
1. Shipment Direction and Linked Shipments
New read/write field shipment_direction (forward | return) on CreateTrackingRequest, UpdateTrackingByIdRequest, and the Tracking model, plus read-only links between forward and return shipments:
// Write
CreateTrackingRequest request = new CreateTrackingRequest();
request.setTrackingNumber("1234567890");
request.setSlug("usps");
request.setShipmentDirection(CreateTrackingRequestShipmentDirection.Return);
CreateTrackingResponse response = TrackingResource.createTracking()
.setCreateTrackingRequest(request)
.create();
// Read
GetTrackingByIdResponse res = TrackingResource.getTrackingById()
.setId(id)
.fetch();
Tracking tracking = res.getData();
tracking.getShipmentDirection(); // "forward" | "return"
tracking.getReturnShipment(); // linked return shipment: id, tracking_number, slug
tracking.getForwardShipment(); // linked forward shipment: id2. Multi-Piece Shipment Info
New read-only multi_piece_info field on the Tracking model:
if (tracking.getMultiPieceInfo() != null) {
tracking.getMultiPieceInfo().getType(); // "master" | "child"
for (TrackingMultiPieceInfoPieces piece : tracking.getMultiPieceInfo().getPieces()) {
// piece.getTrackingId(), piece.getTrackingNumber(), piece.getType(), piece.getTrackable()
}
}3. Customer ID
New read/write id field on customers[], for storing the customer identifier from your merchant or platform (e.g. Shopify) system:
CreateTrackingRequestCustomers customer = new CreateTrackingRequestCustomers();
customer.setEmail("customer@example.com");
customer.setId("shopify-customer-123");
request.setCustomers(List.of(customer));4. Proof of Delivery, Shipment Dimensions, Checkpoint Hash
New read-only fields on the Tracking model:
tracking.getProofOfDelivery(); // POD records (type, url); feature must be enabled
tracking.getShipmentDimensions(); // unit, length, width, height
tracking.getCheckpoints().get(0).getHash(); // unique hash per checkpoint event, for deduplication5. 10 New Delivery Sub-statuses
The API may now return the following new subtag values. subtag is a plain string in the SDK, so no code change is required:
| Sub-status | Message |
|---|---|
Delivered_005 |
Delivered to neighbor |
Exception_016 |
Delayed (Processing issue) |
Exception_017 |
Delayed (Extreme weather) |
Exception_018 |
Incorrect missing documents |
Exception_019 |
Delayed (Late flight) |
Exception_020 |
Shipment cancelled |
Exception_021 |
Shipment disposed |
InTransit_011 |
Import customs clearance completed |
InTransit_012 |
Import customs clearance started |
InTransit_013 |
Drop off for carrier pickup |
Full Changelog: 11.0.0...12.0.0
10.0.3
What's Changed
- Bump org.bouncycastle:bcprov-jdk18on from 1.78 to 1.84 by @dependabot[bot] in #21
New Contributors
- @dependabot[bot] made their first contribution in #21
Full Changelog: 10.0.2...10.0.3
11.0.0
10.0.2
10.0.1
10.0.0
Breaking Changes - AfterShip Tracking Java SDK v10.0.0
1. Main Class Renamed
Main Class Change
// v9
import com.aftership.AfterShip;
// v10
import com.aftership.tracking.TrackingSdk;
// Initialization methods remain the same
AfterShip.init(apiKey); // v9
TrackingSdk.init(apiKey); // v10Impact: All initialization and configuration code must update class references
2. Package Structure Complete Refactor
Package Structure Comparison
// v9 - Top-level package structure
import com.aftership.tracking.TrackingResource;
import com.aftership.courier.CourierResource;
import com.aftership.model.*;
// v10 - Nested package structure
import com.aftership.tracking.tracking.TrackingResource;
import com.aftership.tracking.courier.CourierResource;
import com.aftership.tracking.model.*;Impact: All import statements need updating, with deeper package hierarchy
3. Response Structure Complete Refactor
v9 direct property access
// v9 - Direct property access
CreateTrackingResponse response = creator.create();
String id = response.getId();
String trackingNumber = response.getTrackingNumber();v10 must access through getData()
// v10 - Access through getData()
CreateTrackingResponse response = creator.create();
Tracking data = response.getData();
String id = data.getId();
String trackingNumber = data.getTrackingNumber();
// Can also access response headers
Meta responseHeader = response.getResponseHeader();Impact: All API response handling code needs rewriting to access actual data through getData() method
4. Model Name Changes - Prefix Naming Convention
Model classes changed from suffix naming to prefix naming
// v9 - Suffix naming
import com.aftership.model.CourierEstimatedDeliveryDateTracking;
import com.aftership.model.ShipmentWeightTracking;
import com.aftership.model.AftershipEstimatedDeliveryDateTracking;
import com.aftership.model.CarbonEmissionsTracking;
import com.aftership.model.CustomEstimatedDeliveryDateTracking;
import com.aftership.model.FirstEstimatedDeliveryTracking;
import com.aftership.model.FirstMileTracking;
import com.aftership.model.LastMileTracking;
import com.aftership.model.CustomersTracking;
// v10 - Prefix naming
import com.aftership.tracking.model.TrackingCourierEstimatedDeliveryDate;
import com.aftership.tracking.model.TrackingShipmentWeight;
import com.aftership.tracking.model.TrackingAftershipEstimatedDeliveryDate;
import com.aftership.tracking.model.TrackingCarbonEmissions;
import com.aftership.tracking.model.TrackingCustomEstimatedDeliveryDate;
import com.aftership.tracking.model.TrackingFirstEstimatedDelivery;
import com.aftership.tracking.model.TrackingFirstMile;
import com.aftership.tracking.model.TrackingLastMile;
import com.aftership.tracking.model.TrackingCustomers;Impact: All nested Tracking model class names need updating, from XxxTracking to TrackingXxx
5. Enum Member Name Changes
Tag enum member names changed to PascalCase
| v9 | v10 |
|---|---|
Tag.Inforeceived |
Tag.InfoReceived |
Tag.Intransit |
Tag.InTransit |
Tag.Outfordelivery |
Tag.OutForDelivery |
Tag.Attemptfail |
Tag.AttemptFail |
Tag.Availableforpickup |
Tag.AvailableForPickup |
Impact: Code using these enum members needs name updates
6. String to Enum Changes
Several string fields changed to enum types (following API documentation)
Request Models (Input)
// 1. CreateTrackingRequest.DeliveryType
// v9
CreateTrackingRequest request = new CreateTrackingRequest();
request.setDeliveryType("pickup_at_store");
// v10
CreateTrackingRequest request = new CreateTrackingRequest();
request.setDeliveryType(CreateTrackingRequestDeliveryType.PickupAtStore);
// 2. UpdateTrackingByIdRequest.DeliveryType
// v9
updateRequest.setDeliveryType("door_to_door");
// v10
updateRequest.setDeliveryType(UpdateTrackingByIdRequestDeliveryType.DoorToDoor);
// 3. MarkTrackingCompletedByIdRequest.Reason
// v9
markRequest.setReason("DELIVERED");
// v10
markRequest.setReason(MarkTrackingCompletedByIdRequestReason.Delivered);7. Error Code Constants Simplified
v9 ErrorEnum detailed structure
// v9 - Contains detailed error information and methods
ErrorEnum.INVALID_API_KEY.getCode() // Returns numeric error code (e.g. 1)
ErrorEnum.INVALID_API_KEY.getMessage() // Returns error message (e.g. "Invalid API key")
ErrorEnum.INVALID_API_KEY.getStatusCode() // Returns status codev10 ErrorEnum simplified to enum names
// v10 - Simplified to pure enum with only name() method
ErrorEnum.INVALID_API_KEY.name() // Returns enum name string "INVALID_API_KEY"
// getCode(), getMessage(), getStatusCode() methods no longer available8. Reader → Fetcher Architecture Change
v9 uses Reader returning Page objects
// v9
import com.aftership.tracking.GetTrackingsReader;
import com.aftership.base.Page;
GetTrackingsReader reader = TrackingResource.getTrackings();
Page<Tracking> result = reader.read();
List<Tracking> trackings = result.getRecords();
String nextCursor = result.getNextCursor();v10 uses Fetcher returning Response objects
// v10
import com.aftership.tracking.tracking.GetTrackingsFetcher;
import com.aftership.tracking.model.GetTrackingsResponse;
GetTrackingsFetcher fetcher = TrackingResource.getTrackings();
GetTrackingsResponse response = fetcher.fetch();
List<Tracking> trackings = response.getData().getTrackings();
String nextCursor = response.getData().getPagination().getNextCursor();9.0.0
What's Changed
- support 2025-04 version by @1415003719 in #11
New Contributors
- @1415003719 made their first contribution in #11
Full Changelog: 8.0.0...9.0.0
8.0.0
- supported 2025-01 version.
- added response headers in error object.
7.1.0
7.0.0
- supporting 2024-10 version.
API and SDK Version
Each SDK version is designed to work with a specific API version. Please refer to the table below to identify the supported API versions for each SDK version, ensuring you select the appropriate SDK version for the API version you intend to use.
| SDK Version | Supported API Version | Branch |
|---|---|---|
| 7.x.x | 2024-10 | https://github.com/AfterShip/tracking-sdk-java/tree/2024-10 |
| 6.x.x | 2024-07 | https://github.com/AfterShip/tracking-sdk-java/tree/2024-07 |
| 5.x.x | 2024-04 | https://github.com/AfterShip/tracking-sdk-java/tree/2024-04 |
| 4.x.x | 2023-10 | https://github.com/AfterShip/aftership-sdk-java |
| <=3.x.x | Legacy API | https://github.com/AfterShip/aftership-sdk-java |