Changelog
This page contains the changelog of the current API version. For the past changelog, please refer to this page.
2026-07 (2026-07-09)
1. General
| CHANGE | BEFORE | AFTER |
|---|---|---|
| Base URL | https://api.aftership.com/commerce/2026-01 | https://api.aftership.com/commerce/2026-07 |
2. Location Resource
2.1 Added Location Resource
The new Location resource represents an organization-level warehouse, store, or other physical place used for fulfillment, order processing, and pickup settings.
New Endpoints
POST /locationsGET /locationsGET /locations/{id}PATCH /locations/{id}
Notes
- Location resources are organization-level resources and do not require the
as-store-idheader. sourceindicates whether a location was created manually through Commerce API (manual) or imported from an ecommerce platform (platform).POST /locationscreates manual locations only. The required request fields arenameandaddress.- Custom IDs for manual locations must be unique within the organization and cannot start with the reserved prefix
app-. - Platform-sourced location IDs are returned in the format
app-<platform>-<app_key>-<external_id>. - Platform-sourced locations can only patch
address.email,address.phone,timezone_identifier,opening_hours, andorder_processing. - The
idreturned by every Location endpoint is the canonical identifier to use elsewhere in Commerce API — for example as thelocation_idinsideorder.pickup_locationandfulfillment.ship_from_location/fulfillment.pickup_location. See §3. address.first_nameandaddress.last_nameare joined into one contact name on write; on read, the full contact name is returned asaddress.first_nameandaddress.last_nameis empty.address.typeis accepted by the schema for compatibility with the standard address shape but is not used for Location resources — omit it on write; on read it is always empty.- When
pickup_setting.enabled = true, omittedaddress.coordinatevalues are auto-filled from the postal address (geocoded by AfterShip). Coordinates explicitly provided by the caller are preserved as-is.
Response Example
preparing...
3. Order & Fulfillment Resource Changes
3.1 pickup_location.location_id / ship_from_location.location_id now accepts the Location ID only
pickup_location.location_id / ship_from_location.location_id now accepts the Location ID onlyFrom 2026-07, the location_id field on order.pickup_location, fulfillment.pickup_location, and fulfillment.ship_from_location would only accept the public Location ID returned by the new Location Resource (§2), in either form:
- A merchant-defined custom ID (e.g.
"warehouse_1") forsource = manuallocations. - A platform composite ID
app-<platform>-<app_key>-<external_id>forsource = platformlocations.
Affected Endpoints (Request Body)
POST /orders(request_body.pickup_location.location_id)POST /fulfillments(request_body.pickup_location.location_id,request_body.ship_from_location.location_id)PATCH /fulfillments/{id}(request_body.pickup_location.location_id,request_body.ship_from_location.location_id)
| BEFORE (2026-01) | AFTER (2026-07) |
|---|---|
location_id required the ID from admin.aftership.com/organization/warehouses, which was not exposed by any Commerce API endpoint. | location_id accepts the Location resource's public id (GET /locations) only, previous ID would be rejected. |
Recommended Flow
- Call
GET /locations(or remember theidreturned byPOST /locations). - Pass that
idas thelocation_idon order/fulfillment requests.
If the supplied location_id does not match any Location under the organization, the endpoint returns 422 Unprocessable Entity with info: "The location does not exist." on the corresponding request_body.*.location_id path.