Push a shipment tracking number

Push a tracking number from your OMS. Get Plus persists the shipment,
registers it with the carrier, and queues an outbound webhook delivery.

Duplicate-detection: shipments are unique per
(store, tracking_number, order_number). Pushing the same
order_number with the same tracking_number twice is rejected with
409 Conflict and the structured type
https://api.protectplus.io/errors/tracking-number-already-exists.
The existing shipment's identifiers are returned in the existing
problem-details extension so your OMS can recover without an extra
GET. Use PATCH /shipments/{tracking_number} (or
PATCH /shipments/by-id/{id}) to update editable fields on an
existing shipment.

Clubbed orders (one parcel, several orders): different orders
that ship together in one physical parcel may share a single
tracking_number. POST one shipment per order_number, all carrying
the same tracking_number — each becomes its own shipment record and
receives its own tracking updates and notifications. Because a shared
tracking number then maps to several shipments, it can no longer
identify one shipment for a PATCH by tracking number (see
PATCH /shipments/{tracking_number}409 and
PATCH /shipments/by-id/{id}).

Carrier token: lowercase letters, digits and underscores, 2–40
characters. The most common values are ups, usps, fedex and
dhl_express. Every accepted token:

TokenCarrierTracking availability
airterraAirterra
apc_postalAPC Postal
apgAPG
aramexAramex
asendia_usAsendia US
australia_postAustralia Post (also Startrack)Account required
axlehireJitsuAccount required
better_trucksBetterTrucksAccount required
borderguruBorderGuru
boxberryBoxberry
bringBring (also Posten Norge)
canada_postCanada PostGet Plus labels only
chronopostChronopost
colissimoColissimoGet Plus labels only
collect_plusCollectPlus
correios_brCorreios Brazil
correos_espanaCorreos EspañaAccount required
deutsche_postDeutsche PostGet Plus labels only
dhl_beneluxDHL Benelux
dhl_ecommerceDHL eCommerceGet Plus labels only
dhl_expressDHL Express
dhl_germanyDHL GermanyGet Plus labels only
dhl_germany_c2cDHL Germany C2C
dpd_deDPD Germany
dpd_ukDPD UKGet Plus labels only
estafetaEstafeta
fastway_australiaAramex Australia
fedexFedEx
globegisticsGlobegistics (now Asendia)
gls_usGLS USAccount required
gophrGophrAccount required
gsoGSOAccount required
hermes_germany_b2cHermes Germany B2C
hermes_ukEvri UKGet Plus labels only
hongkong_postHongkong PostAccount required
lasershipLaserShipGet Plus labels only
lsoLSOAccount required
mondial_relayMondial RelayAccount required
new_zealand_postNew Zealand Post (also Pace, CourierPost)Get Plus labels only
nippon_expressNippon Express
ontracOnTracGet Plus labels only
parcelforceParcelforce
passportPassportGet Plus labels only
pcfPCFAccount required
poste_italianePoste ItalianeAccount required
postiPosti
purolatorPurolatorAccount required
royal_mailRoyal Mail
royal_mail_sfRoyal Mail Storefeeder
rr_donnelleyePost Global
russian_postRussian Post
skypostalSkyPostal
stuartStuart
swyftSwyftAccount required
udsUDS (United Delivery Service)
upsUPS
uspsUSPS
vehoVeho

Tracking availability is blank when the carrier tracks any
tracking number you push. The two exceptions:

  • Account required — the carrier only releases tracking to holders of
    an account with them. Contact support before pushing these tokens;
    shipments are created either way, but no events arrive until the
    account is in place.
  • Get Plus labels only — the carrier only releases tracking for
    parcels whose label was bought through Get Plus. Tracking numbers
    pushed from your own OMS are accepted and stored, but the timeline
    stays empty. Use tracking_url to link customers to the carrier's
    own page for these.

The token is shape-checked rather than restricted to this list, so a
value that is not a real carrier token is still accepted. Where the
tracking number's own format identifies the carrier, Get Plus uses that
and tracking works anyway; otherwise the shipment is saved and the
response is 202, and no tracking events will arrive for it. Check the
token first if a shipment stays silent.

Rate limit: 600 requests per minute per store. This limit is
separate from the global per-IP limit and is not counted against it.

Tracking-only mode

If your OMS doesn't associate shipments with order numbers (e.g. you
track packages independently), omit order_number entirely. Get Plus
will create a standalone shipment record and track it through the
carrier lifecycle without linking it to an order.

Required fields for tracking-only mode: tracking_number, carrier.
All other fields are optional enrichment.

Note: Read endpoints for shipment lists (GET /shipments,
GET /shipments/:id) are not yet available via the public API. Use
GET /shipments/{tracking_number} to retrieve the tracking timeline
for a specific tracking number.

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Body Params
string
required
length ≤ 64
string
required
^[a-z0-9_]{2,40}$
string | null

Platform order number to associate with this shipment.
Optional. When omitted, the shipment is tracked
independently (tracking-only mode). Common for fulfilment
centres that push tracking numbers before order association.

string | null
date-time | null
date-time | null
items
array of objects | null

Line items shipped in this package. See ShipmentItem for the per-item shape.

items
servicelevel
object

Carrier service level. See ShipmentServiceLevel for the shape.

ship_to
object

Delivery address. Stored on the shipment and surfaced as address_to on responses.

return_label
object

Optional. Merchant-provided prepaid RETURN label for THIS package — the same payload shape as PUT /orders/{order_number}/return-label. Distinct from tracking_number above (that tracks the parcel going TO the customer; this is the label the customer uses to send the item BACK). Merchants like ShopLC only mint the return label at ship time, one physical copy per package, so they push it here with the shipment. Get Plus stores it on the shipment and the customer return flow renders it for the items that shipped in this package (USPS 6x3 replica when barcode_data + a USPS carrier are supplied, otherwise a label/QR/tracking view, or an in-package notice). Get Plus never generates or pays for this label. Use PATCH /shipments/{tracking_number} to amend it on an existing shipment.

Headers
string
enum
Defaults to application/json

Generated from available response content types

Allowed:
Responses

Language
Credentials
Bearer
JWT
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json
application/problem+json