Record a label bought elsewhere
AI agents: read /llms.txt; add .md to any page URL. This page as Markdown: /reference/shipping-labels/v2-shipment-label-create-external.md. Index of every page and the rules for every call: /llms.txt. Guides and concepts in one file: /llms-full.txt. OpenAPI: /openapi.json.
POST/
Records on a shipment a label you bought outside YoPrint (for example on the carrier's site), so the shipment has its tracking number. Nothing is bought and Shippo isn't called.
YoPrint stores the carrier and tracking number only: no cost, size, weight or label file. Returns the new package.
Business rules
- Only for sales orders: 422 "External labels can't be attached to a quote. Convert it to a sales order first."
- Unlike a Shippo label, the order doesn't have to be published.
- On a shipment linked to Shopify: 422
shopify_managed_shipment_locked,shopify_fulfilled_shipment_package_locked("This shipment has already been fulfilled to Shopify. Void fulfillment first to edit packages or create labels.") orshopify_broken_link_shipment_locked; 422 "Shipment label cannot be created because shipment contains items fulfilled by a third-party."; and 422 when the carrier differs from the carrier of the shipment's other packages (Shopify needs one carrier per fulfillment).
Side effects
- Creates a package with status
pending. For an order from Shopify with tracking sync on, sends the tracking to Shopify, which may email the customer. - Customer Portal pages the order's customer has open refresh.
Path parameters
Your team slug, shown as Team ID next to your API key in Profile.
- Example
your-team
- Example
The shipment's hash id (
id). Hash ids only: a unique key or a document number gives 404.- Example
MQyJUnd3oty75h
- Example
Request body
application/json, required.
The carrier.
upsandfedexset the carrier name for you.- One of:
"ups","fedex","other"
- One of:
The tracking number. Not checked for duplicates.
provider_namestringThe carrier name. Required when
provider_service_codeisother.
More examples (1)
A UPS label
curl -X POST 'https://secure.yoprint.com/v2/api/store/your-team/v2/shipment/MQyJUnd3oty75h/label/external' \ -H 'Authorization: Bearer YOUR_API_KEY' \ -H 'Accept: application/json' \ -H 'X-Yoprint-Decimal-Format: exact-v1' \ -H 'Content-Type: application/json' \ -d '{ "provider_service_code": "ups", "provider_tracking_number": "1Z0000000000000000" }'Response
200Successful response.
A package.
Child fields (36)
chargesinteger | number | string | nullThe label cost. For a multi-parcel label every package repeats the rate's full amount: read the master's value and don't add packages up. Null for external labels. Thousandths, an older encoding:
12500is 12.50. Usually a whole number; an amount finer than a thousandth comes back as a number with a fraction (1234.5is 1.2345), or as a string ("1234.5") when you sendX-Yoprint-Decimal-Format: exact-v1. See Money and quantities.created_atstring (date-time)from_addressanyThe address record behind
from_address_id, or null when it is not set.from_address_idstring | nullOlder packages only: the ship-from address record; null otherwise.
goshippoobjectShippo labels only: the Shippo details (shipment, rate, carrier, addresses, parcels).
Child fields (13)
address_fromanyThe ship-from address sent to Shippo.
The return address sent to Shippo.
address_toanyThe ship-to address sent to Shippo.
carrier_idstring | nullThe Shippo carrier account.
parcel_idstring | nullThe Shippo parcel.
parcelsanyThe parcels of the Shippo shipment.
providerstring | nullprovider_image_200string | nullprovider_image_75string | nullprovider_tracking_numberstring | nullrate_idstring | nullThe Shippo rate bought.
The Shippo shipment the rate came from.
shipment_idstring | nullThe Shippo shipment.
heightnumber | string | nullParcel size and weight as stored, in
length_unitandweight_unit. Null for external labels.idstringThe package.
is_masterbooleanThe first package of a label (the others have
parent_id).lengthnumber | string | nulllength_unitstring | nullShippo labels only, upper case.
order_external_idsarray of objectsThe order's links to external systems.
order_external_typestring | nullshopifywhen the order came from Shopify.order_idstringThe order.
order_object_typestring | nullorder_quotebooleanorder_scoped_idstring | nullparent_idstring | nullThe master package, for the other parcels of a multi-parcel label.
pdfarray of objectsNot on external labels: the label file.
labelanddescriptionare fixed texts that always say 4 x 6, whatever your label size setting.Fields of each item (3)
descriptionstringlabelstringurlstringFor a Shippo label, Shippo's signed link to the label file: don't publish it.
provider_namestring | nullThe carrier.
provider_saturday_deliverybooleanShippo labels only (absent on external labels); always false today.
provider_service_codestring | nullFor external labels,
ups,fedexorother. For Shippo labels it may be null: read the service fromprovider_service_name.provider_service_namestring | nullprovider_shipment_idstring | nullThe Shippo transaction id (Shippo labels).
provider_tracking_numberstring | nullshipment_external_typestring | nullshopifywhen the shipment is linked to Shopify.shipment_idstringThe shipment.
shipment_scoped_idstringShopify sync state of the shipment.
statusstring- One of:
"pending","ready-to-ship","shipped","delivered"
- One of:
to_addressanyThe address record behind
to_address_id, or null when it is not set.to_address_idstring | nullOlder packages only: the ship-to address record; null otherwise.
typestringgoshippoa label bought through Shippo;external_labela label recorded from elsewhere.- One of:
"goshippo","external_label","single_label"
- One of:
weightnumber | string | nullweight_unitstring | nullShippo labels only, upper case.
widthnumber | string | null
Errors
401The API key is missing or wrong (
unauthenticated).403You are not allowed to do this.
api_access_not_in_plan: your team's plan doesn't include API access (Pro and above, with an active subscription or trial), so every request answers this until the team upgrades. When your role lacks the permission the operation needs, the body is only{"message": "Insufficient Permission"}. Other refusals use the error envelope, withunauthorizedoruser_is_not_authorized.404Not found.
page_not_found: the team slug is unknown, you are not a member of the team, or an id in the path is not one of this team's.code: null, with a message that starts "No query results for": there is no record with that id.- When
- The shipment isn't your team's.
- Fix
- Check the shipment id.
422The request was refused and changed nothing.
validation_failedlists what to fix inerror.fields; other codes name a business rule, explained inerror.message. A few checks answer with only{"message": "..."}. An operation that calls another service (a payment provider, a carrier, an accounting app) can answerconnect_timeout("Please retry again") when that service does not answer in time: the change may or may not have happened there, so read the record back before you retry.- When
- A missing tracking number, an unknown
provider_service_code,otherwithoutprovider_name, a quote, or a Shopify or carrier conflict. - Fix
- Fix the named field or rule.
Related
- GETList the packages of a shipment
/v2/ api/ store/ {team_slug}/ v2/ shipment/ {hash_id}/ packages - PUTChange a package's status
/v2/ api/ store/ {team_slug}/ v2/ shipment_package/ {hash_id}
