Releases: AfterShip/tracking-sdk-java
Release list
12.0.1
What's Changed
- Bump org.bouncycastle:bcprov-jdk18on from 1.78 to 1.84 by @dependabot[bot] in #23
- chore: bump version to 12.0.1 by @1415003719 in #24
Full Changelog: 12.0.0...12.0.1
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.