Tovább a tartalomhoz
This guide is designed specifically for developers.

API errors

Ez a tartalom még nem érhető el a jelenlegi nyelven.

Every error response of the Globe API has the same JSON body with a stable error code. This page lists each code with its HTTP status, its cause, whether a retry helps, and the extra fields it carries.


{
"error": {
"code": "insufficient_scope",
"message": "This API key is missing the `labels:print` scope.",
"details": {
"retry": "no",
"next_action": "none",
"required_scope": "labels:print"
},
"request_id": "req_k3J9xQ2mT7vA",
"doc_url": "https://docs.globe.appfleece.com/reference/api-errors#insufficient_scope"
}
}
FieldDescription
codeStable, machine-readable code. Branch on it. New codes are an API change
messageText for people. The wording can change at any time
detailsFields specific to the code, listed below. Missing when there is nothing to add
request_idID of this request (req_…). The same value is in the X-Request-Id header
doc_urlLink to the code’s section on this page

internal_error never carries details and its message never contains the underlying exception.

Errors that can end a label creation carry details.retry and details.next_action. A few endpoints set a different value than the default listed for a code; the value in the response wins.

retrynext_actionWhat to do
nononeSending the same request again will not succeed
after_fixfix_and_retryFix the cause (the order, the store’s settings or the request), then send it again
laterretry_laterNothing to fix. Send it again after Retry-After
manualmanual_checkA person has to check the shipment at the carrier and decide

Every response, successful or not, carries X-Request-Id. When you contact support about a failed call, send the request_id. It is the only way to find the request in Globe’s logs, because request bodies and query strings are never logged.

  • An error from POST /labels means this call created no shipment.
  • If the call got as far as creating a label creation record, the error names it in details.label_creation_id. That creation is failed and its Idempotency-Key is released, so the same key starts a new attempt. idempotency_conflict, and label_exists for a key bound to an abandoned creation, name that earlier creation instead.
  • GET /label-creations/{id} answers 200 for a failed creation. The code is in error.code, and next_action says what to do.
  • Some codes come from the carrier step, after the API already answered 202. You see them on the next poll, on a repeat of the request with the same key, or as errorCode in the label_creation.updated webhook.

The origin never answers 502 or 504. If you get one, or no response at all, the outcome of a POST /labels is unknown: send the same request again with the same Idempotency-Key. It joins or replays the first attempt and never books a second shipment.


The request has no bearer credential: no Authorization header, a different scheme, or Bearer with no key. The message tells a missing header apart from a header that is not a bearer credential.

Send Authorization: Bearer glb_live_…. The word Bearer and a space come before the key. Pasting the bare key into a header field is the most common setup mistake.

The key is unknown, malformed, revoked or expired. The API does not say which.

Check that the key is copied in full. A rotated key stops working when its overlap ends. Create a new key in Settings → API if needed.


API access is not enabled for the store, or the Globe app is not installed on it. The API is in beta and support enables it per store.

Ask in the support chat in the Globe admin.

DetailDescription
how_to_enableHow to request access. Not present when the app is not installed
support_emailSupport contact

Globe support paused API access for the store. Every key of the store is refused, and no key is revoked. The store has no switch for it.

Ask in the support chat in the Globe admin to resume access.

DetailDescription
how_to_enableHow to ask for access to resume
support_emailSupport contact

The store has no active Globe subscription and no free access.

Start or restore a subscription in Globe.

details.retry: no · next_action: none

The endpoint writes, and the store’s write access is off. This covers POST /labels (dry runs included), POST /labels/{id}/printed and resolve. Reads keep working.

Ask support to enable label creation for the store.

details.retry: no · next_action: none

The key does not carry the scope the endpoint requires. include: ["document"] on POST /labels also needs labels:print.

Create a key with the permission that includes the scope. See Permissions and scopes.

DetailDescription
required_scopeThe missing scope

The endpoint does not exist, or the label, label creation, carrier account or order does not exist in this store. An ID that belongs to another store or is malformed gets the same answer. GET /orders/{order_id}/label-document also answers not_found when the order has no current outbound label. GET /label-documents answers it when any one of the IDs is unknown.

Check the ID and the path. IDs keep their prefix (lbl_…, lcr_…, ca_…).

DetailDescription
order_idOnly for an order without a current outbound label

The path exists but does not accept this HTTP method. The Allow header lists the methods it accepts.

DetailDescription
allowed_methodsMethods the path accepts

details.retry: no · next_action: none. With state: in_flight: later · retry_later

The Idempotency-Key is already bound to a different request. On POST /labels the key binds to its label creation for 30 days, and the body is compared after normalization.

Use a new key for a new operation. Send the identical body to get the original answer back.

On POST /labels/{id}/printed, state: in_flight means the first request with this key is still running. The response carries Retry-After: 2. Send the same request again after it to get the first answer.

DetailDescription
idempotency_keyThe key you sent
label_creation_idPOST /labels: the creation the key belongs to
statein_flight when the first request is still running

The request used Idempotency-Key: auto and an identical request ran less than 60 seconds ago, so it was not repeated. Only POST /labels/{id}/printed accepts auto.

Wait for Retry-After, or change the request if you mean a separate action.

DetailDescription
ran_seconds_agoWhen the identical request ran
retry_after_secondsSeconds until the same request is accepted again

The label is not finished yet, so it has no document. PPL labels wait for the carrier’s shipment number. Labels created through the API wait for their creation to finish.

Retry after Retry-After: 2 seconds for labels created through the API, 30 seconds otherwise. Do not create the label again.

DetailDescription
label_idThe label
label_creation_idThe creation, for labels created through the API

The label is ready but its PDF is not stored yet. This happens right after a label is created through the API, and for Packeta shipments through an external carrier until the carrier assigns its own number. The carrier is not called.

Retry after Retry-After: 2 seconds during the first 10 minutes after the label was created, 60 seconds after that. Do not create the label again.

DetailDescription
label_idThe label
label_creation_idThe creation, when it is still running

Globe renders this document at the carrier on demand. Either a render of the same label and format is already running (Retry-After: 2), or the store already has 3 renders running (Retry-After: 5).

Retry after Retry-After.

DetailDescription
label_idThe label, when the same label is being rendered
concurrency_limitThe store’s render limit, when that limit was reached

GET /orders/{order_id}/label-document found two current outbound labels that cover the same fulfillment order. Globe does not guess which one to print.

Let a person choose the labels, then download them with GET /label-documents?label_ids=….

DetailDescription
order_idThe order
current_label_idsThe order’s current outbound labels
conflicting_fulfillment_ordersFulfillment orders claimed by more than one of them (order for whole-order labels)

details.retry: no · next_action: none

Existing labels or an earlier creation block the target of POST /labels, and the request’s on_existing mode does not allow the result. details.reason says why. To replace the labels, send on_existing: "create_new" with replaces listing what blocks the target (the IDs below). A replaced label stays a valid, paid shipment at the carrier. See Existing labels.

reasonCause
existing_label_readyon_existing: "reject" and ready labels cover the target
order_has_labelPUT /orders/{order_id}/pickup-point: the order already has labels (label_ids). A label is made for one pickup point
existing_label_differson_existing: "return", and the request names a carrier account, service, COD, declared value or weight that differs from the existing label. Amounts are compared after the carrier’s rounding
existing_label_unverifiableon_existing: "return" with one of those values, but the existing label does not record it, or more than one label covers the target
existing_label_pendingA covering label is still pending at the carrier. reject and create_new get this while it is pending for less than 10 minutes. With return such a label is adopted instead; this reason then means it did not become ready within 5 minutes. A label pending for more than 10 minutes alerts support
partial_coverageExisting labels cover only part of the target
ambiguous_current_setTwo current labels of the order cover the same fulfillment order
existing_label_expiredA covering label is older than 60 days. Its document is gone, but it still blocks
existing_label_on_replaced_fulfillment_orderA label sits on a fulfillment order that an order edit replaced. Resolve it in the Globe admin
existing_label_coverage_unknownAn older label does not record which fulfillment orders it covers, so it cannot be ruled out
shipment_outside_globeAn earlier creation for this target is abandoned: the shipment exists and is handled outside Globe. Also the answer when the Idempotency-Key belongs to that creation
DetailDescription
reasonOne of the reasons above
existing_label_idsThe blocking labels
differencesexisting_label_differs: {field, requested, existing} per differing value
uncovered_fulfillment_order_idspartial_coverage: fulfillment orders without a label
label_creation_idsshipment_outside_globe: the abandoned creations
label_creation_idThe abandoned creation when the key belongs to it, otherwise this request’s creation

details.retry: manual · next_action: manual_check

An earlier label creation for the same fulfillment order is in needs_attention. Globe does not know whether that shipment exists at the carrier. This blocks every on_existing mode, create_new included.

Check the shipment at the carrier and resolve the earlier creation with POST /label-creations/{id}/resolve. Unresolved, it becomes abandoned 24 hours after it entered needs_attention; a new label then needs on_existing: "create_new" with that creation’s ID in replaces. See needs_attention and resolve.

DetailDescription
label_creation_idThe first unresolved creation
label_creation_idsEvery unresolved creation that covers the target

details.retry: later · next_action: retry_later

Another label creation, or a label export from the Globe admin or Flow, holds the fulfillment order right now. Only on_existing: "reject" and "create_new" get this error. With "return" the creation waits for the holder instead. PUT /orders/{order_id}/pickup-point gets it while a label creation for the order is running (details.label_creation_id); change the point once it has finished.

Retry after Retry-After (5 seconds).

DetailDescription
held_bycreation (another API creation), export (admin or Flow) or unknown
label_creation_idThe holding creation, when it is one

details.retry: after_fix · next_action: fix_and_retry

on_existing: "create_new" was sent with a replaces list that does not match exactly what blocks the target today. The list can miss a blocking label, name a label that does not block, or miss an abandoned creation.

Send replaces equal to details.current_blocking. If the set changed since you last read it, check the labels before you replace them.

DetailDescription
current_blockingThe label (lbl_…) or creation (lcr_…) IDs that block the target now

details.retry: no · next_action: none

The label creation was already resolved with a different outcome, possibly by a concurrent request. Repeating the same outcome answers 200.

DetailDescription
label_creation_idThe creation
outcomeThe outcome it was resolved with

details.retry: no · next_action: none

The creation is not in needs_attention, or the request asked for not_created while attention.shipment_at_carrier is exists. The carrier has that shipment: find it by attention.carrier_reference, print the label from the carrier’s portal and resolve with shipment_exists.

DetailDescription
label_creation_idThe creation
statusThe creation’s status, when it is not needs_attention

details.retry: later · next_action: retry_later

outcome: "not_created" was sent less than 15 minutes after the creation reached the carrier. The carrier may still be processing the shipment.

Retry after Retry-After, or at resolve_allowed_at.

DetailDescription
label_creation_idThe creation
resolve_allowed_atThe earliest time not_created is accepted

The label is older than 60 days, so its document is never served again and the label cannot be marked printed. Its metadata stays readable through GET /labels.

If the parcel still has to ship, create a new label with on_existing: "create_new" and the old label in replaces.

DetailDescription
label_idThe label

The label’s document cannot be issued again: no copy is stored, and the carrier cannot render it again without a side effect, or refused to. DPD HU, DPD EasyShip and Pošta bez hranic labels without a stored copy get this answer.

A retry does not help. Print the label in the Globe admin.

DetailDescription
label_idThe label

details.retry: after_fix · next_action: fix_and_retry

A parameter, header or body is invalid. Examples: an unknown field (the POST /labels body is a closed schema), a wrong type, an amount in the wrong format or over the limit, a missing or too short Idempotency-Key (or auto on POST /labels), create_new without replaces, include together with dry_run, or a body over 256 KB.

The status is 400 instead of 422 when the API key is in the query string (?api_key=). Keys are only accepted in the Authorization header.

Fix the field named in details and send the request again.

DetailDescription
parameterThe invalid field or query parameter
headerThe invalid header, e.g. Idempotency-Key
receivedWhat was sent (shortened)
allowedAccepted values
maxUpper limit, where one applies (for cod.amount and declared_value.amount: "9999999.99")
max_bytesBody size limit, for a body that is too large

The Globe-Version header names a version that is not live.

Send one of allowed_versions, or leave the header out to use the version pinned on the key.

DetailDescription
requested_versionThe version you sent
allowed_versionsThe live versions

The document cannot be produced in the requested format. zpl is reserved for a later version. Some carriers offer only one of label and a4.

Use a format from details.supported, or from the label’s document.formats.

DetailDescription
label_idThe label, when the carrier is the limit
requested_formatThe format you asked for
supportedFormats that work for this label

The label has no document Globe can serve.

reasonCause
no_labelThe record is a Packeta claim or a DPD pickup, not a shipment label
label_failedThe label failed at the carrier
carrier_excludedMagyar Posta, DPD SK, DPD LV, DPD LT, DPD EE or UPS. The API never produces these documents; for Magyar Posta, printing closes the shipment manifest at the carrier. Print them in the Globe admin
not_isolatedAn older DPD HU label whose stored file may contain other labels of the same batch
DetailDescription
label_idThe label
reasonOne of the reasons above

details.retry: after_fix · next_action: fix_and_retry

The carrier refused the shipment. This comes from the carrier step, so you usually see it on the label creation, not on the first response. The carrier’s own text is never returned, because carriers echo addresses in it.

PPL can also refuse a shipment at import, after it accepted the batch. The label then becomes failed with failure_reason: carrier_import_rejected, and the creation fails with this code and reason: other, also from needs_attention.

Fix the cause on the order or the carrier account, then send POST /labels again. The same key starts a new attempt. The same shipment refused 3 times within 60 minutes is blocked as repeated_rejection.

reasonCause
address_invalidThe carrier did not accept the address
postcode_invalidThe carrier did not accept the postcode
service_not_availableThe service is not available for this shipment
weight_out_of_rangeThe weight is outside the service’s range
cod_limitThe COD amount is over the carrier’s limit
pickup_point_invalidThe carrier did not accept the pickup point
credentials_invalidThe carrier refused the account’s login
account_not_permittedThe carrier account is not allowed to use this service
otherA recognized refusal without a more specific reason
DetailDescription
reasonOne of the reasons above
label_creation_idThe creation

details.retry: after_fix · next_action: fix_and_retry

The carrier refused this exact shipment 3 times within 60 minutes, or refused shipments for this fulfillment order 30 times within 24 hours. Globe did not call the carrier this time. A change to what goes to the carrier (address, pickup point, service, weight, COD, declared value, options) or to the carrier account counts as a new shipment and starts from zero. Creating the label in the Globe admin stays possible.

DetailDescription
scopefingerprint (the same shipment) or fulfillment_order_daily (the daily cap)
blocked_untilWhen the block ends
carrier_rejectedThe reason of the last refusal
label_creation_idThe creation

details.retry: after_fix · next_action: fix_and_retry. With cod_dropped_by_carrier_module: no · none

The shipment failed the checks Globe runs before it calls the carrier. Nothing was sent. The checks run when the request arrives and again in the worker right before the carrier call. A refusal in the worker ends the creation failed with this code, never needs_attention.

Fix the order or the carrier account settings. Each entry of details.issues is {code, field?, raw?}.

IssueCause
pickup_point_requiredThe service needs a pickup point and the order has none
pickup_point_malformedThe order’s pickup point does not belong to the carrier’s network or cannot be read
cod_not_supportedThe service cannot collect cash on delivery. Send cod.amount "0" to ship without it
cod_metafield_invalidAn order metafield that decides COD holds an invalid value. field names it: globe/cod_value, globe/currency, or custom.converted_value (Packeta) when it is zero or not a number
cod_dropped_by_carrier_moduleThe carrier would receive a COD above zero as zero, for example after its rounding or a converted amount. The parcel would ship without collecting it
packeta_foreign_pickup_pointPacketa: the pickup point belongs to a different network than the service
pickup_point_id_missingPacketa: the pickup point ID is missing
cod_packet_currency_mismatchPacketa: the COD would go out in a currency other than the packet currency, usually because only some of the custom.converted_* and custom.packet_value metafields are set. details.cod_currency and details.packet_currency show both
cod_bank_account_missingPPL: the carrier account has no IBAN for paying out the COD
cod_variable_symbol_missingPPL: the order name has no digits, and PPL needs them as the COD variable symbol
missing_phoneMyGLS with a pickup point needs the recipient’s phone number. For other carriers a missing phone is only a warning
psd_requires_gls_pointMyGLS: the PSD service needs a GLS pickup point
account_config_incompleteThe carrier account settings are incomplete. Checks without their own issue code also report this, with the internal code in raw
email_invalidDPD CZ: the recipient’s email is invalid
cod_foreign_pickup_pointDPD CZ: COD to a pickup point of another network

details.retry: after_fix · next_action: fix_and_retry

The currency of cod or declared_value is not the currency the carrier receives for this shipment. Globe never converts amounts. The carrier’s currency is the label currency (the globe/currency metafield, otherwise the order currency). For Packeta it can be custom.converted_currency when the order has the converted metafields.

Send the amount in expected_currency.

DetailDescription
fieldcod or declared_value
expected_currencyThe currency the carrier receives

details.retry: after_fix · next_action: fix_and_retry

The order cannot get a label as requested.

reasonCause
order_not_foundNo order matches. The Shopify search index can lag a new order by a few seconds when you send order_name; retry or use order_id
order_cancelledThe order is cancelled. Also reported when it was cancelled after the request and before the carrier call
nothing_to_shipThe order has nothing left to ship, or the labels in replaces cover no fulfillment order
fulfillment_orders_not_readyNo fulfillment order can ship yet; they are scheduled or on hold
fulfillment_order_not_in_orderThe named fulfillment order belongs to another order
fulfillment_order_not_openThe named fulfillment order is not open for shipping, or it closed before the carrier call
fulfillment_order_not_parcelThe named fulfillment order is the in-store pickup, local delivery or retail part of a split order, or has no delivery method. It never travels as a carrier parcel. Name the shipping fulfillment order, or leave fulfillment_order_ids out. Also returned without fulfillment_order_ids when the order’s parcel already has a label and only its pickup, local delivery or retail part is left (existing_label_ids lists the labels). To re-ship the parcel, send on_existing: "create_new" with replaces
too_many_fulfillment_ordersThe order has more than 20 fulfillment orders. Use the Globe admin
order_fulfilledPUT /orders/{order_id}/pickup-point: the order is fulfilled; its pickup point can no longer change
no_pickup_point_methodPUT /orders/{order_id}/pickup-point: the order’s shipping method is not a pickup point method of any of your carriers
DetailDescription
reasonOne of the reasons above
order_idThe order
fulfillment_order_idThe fulfillment order the reason is about
delivery_methodfulfillment_order_not_parcel: its delivery method type
statusfulfillment_order_not_open: its status
existing_label_idsLabels of the order, where relevant
fulfillment_ordersfulfillment_orders_not_ready: the waiting fulfillment orders

details.retry: after_fix · next_action: fix_and_retry

order_name matches more than one order.

Send order_id instead.

DetailDescription
order_nameThe name you sent

details.retry: after_fix · next_action: fix_and_retry

PUT /orders/{order_id}/pickup-point cannot set this point on the order. Find a valid one with GET /orders/{order_id}/pickup-points.

reasonCause
carrier_not_offeredThe order’s shipping method does not map to this carrier. details.carriers lists the carriers it maps to
not_foundNo active point with this ID in the order’s shipping country
not_found_nearbyThe carrier’s points are read live from the carrier, and this one is not among the 50 nearest to the order’s shipping address
type_not_allowedThe order’s shipping method does not offer this type of point, for example a branch on a box-only rate
requires_customer_idThe point needs a customer ID the customer types in at selection (DHL Packstation, PPL ParcelBox in Germany)

details.retry: after_fix · next_action: fix_and_retry

The order has fulfillment orders to ship at more than one location, and the request named none.

Name one in fulfillment_order_ids, or send all_locations: true to ship all of them on one label.

DetailDescription
fulfillment_orders{id, status, assigned_location_name, existing_label_ids} per fulfillment order

details.retry: after_fix · next_action: fix_and_retry

Globe could not choose a carrier account and service for the order.

reasonCause
no_carrier_accountsThe store has no carrier accounts
no_matching_ruleNo account’s rules match the order. Send carrier_account_id and service_code
ambiguous_accountsMore than one account matches. Send carrier_account_id
service_unresolvedThe account has no service for this order, or service_code is not in its catalogue. Send a service_code from GET /carrier-accounts
carrier_account_not_foundThe account does not exist or belongs to another store. Also reported when the account was deleted before the carrier call
service_not_creatableThe service is a return product. The API creates outbound labels only
carrier_not_enabledLabel creation through the API is switched off for the account (api_creation: "not_enabled")
DetailDescription
reasonOne of the reasons above
carrier_account_idThe account the reason is about
service_codeThe service the reason is about
candidatesambiguous_accounts: {carrier_account_id, carrier} per matching account

details.retry: after_fix · next_action: fix_and_retry

The request sends a parameter the carrier account does not take:

  • carrier_options contains a key the account does not declare. Use only the keys in the account’s options from GET /carrier-accounts.
  • declared_value is sent to a carrier whose services have declared_value.supported: false in GET /carrier-accounts. Send the request without declared_value. See Declared value.
DetailDescription
parametercarrier_options.<key> or declared_value
carrier_account_iddeclared_value: the carrier account

details.retry: later · next_action: retry_later

A rate limit is exhausted. Nothing was created and no Idempotency-Key was bound. The response carries Retry-After and the X-RateLimit-* headers of the refusing bucket.

Wait for Retry-After. The limits are listed under Rate limits.

DetailDescription
bucketThe exhausted bucket
scopekey or shop
limitThe bucket’s limit
window_secondsThe bucket’s window. null for write_queue_depth
retry_after_secondsSame as Retry-After
bucketLimit
read_key_per_second, read_key_per_minuteReads per key
document_key_per_minute, document_shop_per_minuteStored documents per key and per store
render_shop_per_minuteDocuments rendered at the carrier per store
dry_run_key_per_second, dry_run_key_per_minute, dry_run_shop_per_minuteDry runs
write_key_per_second, write_shop_per_minutePOST /labels requests
write_shop_per_dayLabel creations per store and day
create_new_dailyon_existing: "create_new" creations per store and day
write_queue_depthCreations waiting in the store’s queue. Retry-After is the time the queue needs to drain (5 to 120 seconds)
resolve_key_per_second, resolve_shop_per_hourResolve requests
print_key_per_second, print_shop_per_minutePOST /labels/{id}/printed

shopify_budget and render_concurrency are reserved bucket names.


Something failed on Globe’s side. The response has no details.

Send the request_id to support. For POST /labels, a 500 usually means the call failed before a creation record existed. Send the same request again with the same Idempotency-Key: if a creation does exist, the repeat joins it instead of creating a second one.


details.retry: later · next_action: retry_later

The carrier, or a service Globe needs for the operation, is not available right now. Document responses carry Retry-After (5 seconds).

reasonWhereCause
timeoutDocumentsThe carrier did not render the document in time
carrier_errorDocumentsThe carrier refused the render
render_errorDocumentsThe render failed on Globe’s side
storage_errorDocumentsThe stored copy could not be read, and the carrier cannot render it again
circuit_openLabel creationThe carrier account had several unclear results in a row. New creations for it fail for 5 minutes without calling the carrier
account_rejectingLabel creationThe carrier refused the account 5 times within 10 minutes (invalid credentials or a missing permission). retry is after_fix: fix the account. Creating labels in the Globe admin stays possible

Rendered documents also get this code, without a reason, when Globe cannot count renders. Globe then refuses the render instead of running it unmetered.

DetailDescription
reasonOne of the reasons above
label_idDocuments: the label
retry_after_secondscircuit_open: seconds until the account is tried again
label_creation_idLabel creation: the creation

details.retry: later · next_action: retry_later

Globe could not read the order from Shopify: Shopify throttled or refused the read, or the store has no usable Shopify session. Nothing was created.

Retry after Retry-After (5 seconds). If it keeps failing, contact support with the request_id.

DetailDescription
whatWhich read failed
throttledtrue when Shopify throttled the read

details.retry: later · next_action: retry_later

Globe cannot accept writes right now. Either the counters behind the write limits are unavailable (Retry-After: 5), or the label creation queue of the whole platform is full (Retry-After: 30). Nothing was created.

Retry after Retry-After.

details.retry: later · next_action: retry_later

The label creation did not reach the carrier within 5 minutes after it was created, so Globe never sent it. Nothing exists at the carrier. The creation is failed and its Idempotency-Key is released.

Send POST /labels again. The same key starts a new attempt.


This code is never an HTTP response. It is the error.code of a creation that a person resolved with outcome: "not_created". Its retry is later, so next_action is retry_later: send POST /labels again to create the label, with the same key or a new one.