Pircel public API
Pircel provides you with APIs that you can use for processes involving your store and your partner carriers. For a procedure such as "Create Voucher", we provide you with an API call for all delivery companies.
How to send a request?
const response = await fetch("https://test-api.pircel.com", {
method: "POST",
mode: "cors",
headers: new Headers({
"Content-Type": "application/json",
// replace '1234' with your API key
apikey: "1234"
}),
body: JSON.stringify({
query: `mutation createVoucher(: String, : String!, : Int!, : Date){
createVoucher(notes: , orderId: , packagesQuantity: , pickupDate: ){
voucherPrintDocuments
vouchers
}
}`,
variables: {
notes: "Fragile packages",
orderId: "14317",
packagesQuantity: 2,
pickupDate: "2023-10-03",
}
})
});
With JavaScript, it is possible to just use a template literal and simplify the API call body.
const response = await fetch('https://test-api.pircel.com', {
method: 'POST',
mode: 'cors',
headers: new Headers({
'Content-Type': 'application/json',
// replace '1234' with your API key
apikey: '1234',
}),
body: JSON.stringify({
query: `mutation {
createVoucher(
notes: "Fragile",
orderId: "A1",
packagesQuantity: 1,
pickupDate: "2023-03-06",
) {
vouchers
voucherPrintDocuments
}
}`
}),
});
You can find a working example on codesandbox.
We are using GraphQL API.
GraphQL is a query language and server-side runtime for application programming interfaces (APIs) that prioritizes giving clients exactly the data they request and no more. GraphQL is designed to make APIs fast, flexible, and developer-friendly.
API are separate in two categories query & mutation:
query: When we want to read an information that is already stored.
structure:
{
field(arg: "value") {
subField
}
}
mutation: When we want to change information (create, update, delete).
structure:
mutation {
field (arg: "value") {
subField
}
}
You can go to https://test-api.pircel.com and have access to try all the queries/mutations (API) we provide to you.
To try any of the API first you should add a shipment.
Follow the link and run the default mutation that we provide to you. 
The following error messages were suggested:
'addShipment.invalidPostcode' ⇒ Μη έγκυρος ταχυδρομικός κώδικας
'addShipment.orderIdAlreadyExists' ⇒ Η παραγγελία υπάρχει ήδη
'authenticate.invalidToken' ⇒ Μη έγκυρο authentication token, παρακαλώ συνδεθείτε ξανά
'cancelVoucher.eshopNotFound' ⇒ Δεν βρέθηκε ηλεκτρονικό κατάστημα
'cancelVoucher.orderNotFound' ⇒ Δεν βρέθηκε η παραγγελία
'createPickupList.invalidDeliveryCompany' ⇒ Μη έγκυρη μεταφορική εταιρεία
'createPickupList.noShipmentsForSelectedDeliveryCompanies' ⇒ Δεν βρέθηκαν οι αποστολές για τις επιλεγμένες μεταφορικές εταιρείες
'createPickupList.noShipmentsFound' ⇒ Δεν βρέθηκαν οι αποστολές
'createPickupList.unprintedVouchers' ⇒ Βρέθηκαν μη εκτυπωμένα παραστατικά
'createVoucher.invalidDeliveryCompany' ⇒ Μη έγκυρη μεταφορική εταιρεία
'createVoucher.invalidPickupDate' ⇒ Μη έγκυρη ημερομηνία παραλαβής
'createVoucher.newArgsCancelFirstExistingVouchers' ⇒ Αδυναμία δημιουργίας ή λήψης νέου παραστατικού. Το παραστατικό έχει ήδη δημιουργηθεί για αυτή την παραγγελία. Παρακαλούμε για να προβείτε σε νέα δημιουργία ακυρώστε πρώτα το προηγούμενο παραστατικό.
'createVoucher.orderNotFound' ⇒ Δεν βρέθηκε παραγγελία
'forbidden'⇒ Απαγορεύεται η πρόσβαση
'invalidpickuDateType', ⇒ Μη έγκυρη μορφή ημερομηνίας παραλαβής
'login.userNotFound' ⇒ Δεν βρέθηκε ο χρήστης
'pintVoucher.canceledVouchersFound' ⇒ Βρέθηκαν ακυρωμένα παραστατικά
'printVoucher.orderNotFound' ⇒ Δεν βρέθηκε η παραγγελία
'printVoucher.vouchersNotFound' ⇒ Δεν βρέθηκαν παραστατικά
'updateShipment.invalidPostcode' ⇒ Μη έγκυρος ταχυδρομικός κώδικας
'updateShipment.orderIdCannotChange' ⇒ Ο κωδικός της παραγγελίας δεν μπορεί να αλλάξει
'updateShipment.shipmentCannotChange' ⇒ Η παραγγελία δεν μπορεί να αλλάξει γιατι έχουν ήδη δημιουργηθεί παραστατικά
'speedex.apiInaccessible' ⇒ Το API της Speedex δεν είναι διαθέσιμο
'speedex.cannotCreateSession' ⇒ Το API της Speedex δεν είναι διαθέσιμο
'createVoucher.speedex.invalidPostcode' ⇒ Μη έγκυρος ταχυδρομικός κώδικας
'speedex.noResponse' ⇒ Το API της Speedex δεν είναι διαθέσιμο
'printPickupList.speedex.noPickupListNumber' ⇒ Δεν υπάρχει αριθμός λίστας παραλαβής
'printVoucher.speedex.noVoucher' ⇒ Δεν βρέθηκε παραστατικό
API Endpoints
# Test (Currently offline):
https://test-api.pircel.com
# Production:
https://api.pircel.com
Headers
# Your API token from the dashboard. Must be included in all API calls.
apikey: <YOUR_TOKEN_HERE>
Queries
deliveryCompanies
Description
Get delivery companies with optional filtering
Response
Returns [DeliveryCompany]
Arguments
| Name | Description |
|---|---|
companies - [DeliveryCompanyIDOrSlugInput]
|
Specific delivery companies to retrieve by ID or slug |
eshopId - String
|
Filter delivery companies by eshop ID |
forCheckout - Boolean
|
Only return companies visible at checkout |
tags - [String]
|
Filter by tags |
withApiIntegration - Boolean
|
Only return companies with API integration |
Example
Query
query DeliveryCompanies(
$companies: [DeliveryCompanyIDOrSlugInput],
$eshopId: String,
$forCheckout: Boolean,
$tags: [String],
$withApiIntegration: Boolean
) {
deliveryCompanies(
companies: $companies,
eshopId: $eshopId,
forCheckout: $forCheckout,
tags: $tags,
withApiIntegration: $withApiIntegration
) {
_id
acceptedPaymentMethods
capabilities {
cancellation {
...CancellationCapabilityFragment
}
multiPiece {
...MultiPieceCapabilityFragment
}
parcelIdentityMode
perPieceTracking
referenceScope
}
createdAt
credentialFields {
isRequired
isSecret
key
label
type
}
defaultConfig {
displayAtCheckout
minimumPrice
priceMultiplier
roundingIncrement
}
description
hasAction
hasApiIntegration
internalOnly
isEnabled
isVisibleAtCheckout
logo {
alt
path
}
minimumWeight
name
pickupTimeOptions {
closeOptions
fixedOptions
mode
readyOptions
}
services {
code
name
}
slug
supportedActions
supportsFuelSurcharge
tags
trackingUrlInformation {
baseUrl
exampleUrl
parameterName
supportsDeepLink
urlType
}
updatedAt
usesAccountShipperAddress
}
}
Variables
{
"companies": [DeliveryCompanyIDOrSlugInput],
"eshopId": "abc123",
"forCheckout": true,
"tags": ["xyz789"],
"withApiIntegration": true
}
Response
{
"data": {
"deliveryCompanies": [
{
"_id": "4",
"acceptedPaymentMethods": ["AFTERPAY_CLEARPAY"],
"capabilities": DeliveryCompanyCapabilities,
"createdAt": "2007-12-03T10:15:30Z",
"credentialFields": [CredentialField],
"defaultConfig": DeliveryCompanyDefaultConfig,
"description": "abc123",
"hasAction": true,
"hasApiIntegration": true,
"internalOnly": true,
"isEnabled": true,
"isVisibleAtCheckout": true,
"logo": Logo,
"minimumWeight": 987.65,
"name": "abc123",
"pickupTimeOptions": PickupTimeOptions,
"services": [DeliveryCompanyService],
"slug": "abc123",
"supportedActions": ["CANCEL_VOUCHER"],
"supportsFuelSurcharge": false,
"tags": ["abc123"],
"trackingUrlInformation": TrackingUrlInformation,
"updatedAt": "2007-12-03T10:15:30Z",
"usesAccountShipperAddress": true
}
]
}
}
eshop
Description
Get eshop details
Example
Query
query Eshop($_id: ObjectID) {
eshop(_id: $_id) {
_id
address
addressBook {
_id
address {
...AddressFragment
}
contact {
...ContactFragment
}
isDefault
name
}
bookingsBlockedByPolicy
brandAssets {
logos {
...BrandLogosFragment
}
}
city
deliveryCompanies {
bookingRefusal
config {
...EshopDeliveryCompanyConfigFragment
}
deliveryCompany {
...DeliveryCompanyFragment
}
isEnabled
requestableOptions {
...RequestableOptionFragment
}
}
freeShipping {
checkoutDisplay
isEnabled
restOfWorld {
...FreeShippingRestOfWorldFragment
}
revision
rules {
...FreeShippingRuleFragment
}
}
general {
buyerEmails {
...GeneralBuyerEmailsConfigFragment
}
checkout {
...GeneralCheckoutConfigFragment
}
dataRetention {
...GeneralDataRetentionConfigFragment
}
voucher {
...GeneralVoucherConfigFragment
}
}
merchantNotices {
copiedAt
dismissedAt
emailedAt
kind
shownAt
version
}
name
packageInsurance
pageCustomization {
colorScheme {
...ColorSchemeFragment
}
}
phone
policyAcceptances {
acceptedAt
acceptedBy
policy
version
}
postcode
pricingEtag
retentionHold {
reason
setAt
setBy
}
securityValue
slug
storeConnections {
_id
apiKey {
...StoreConnectionKeyFragment
}
capabilities
consecutiveFailures
createdAt
credentialTransport
disconnectedAt
expiresAt
externalId
hintDelivery {
...StoreHintDeliveryFragment
}
hintSigningSecretSet
hintUrl
lastFailedAt
lastFeedReadAt
lastSyncedAt
outboundBacklog {
...StoreOutboundBacklogFragment
}
platform
pluginVersion
restBaseUrl
retiredAt
scopes
status
storeCurrencyCode
storeDomain
}
storeFreeShippingCodFee
taxProfile {
confirmedAt
confirmedBy
distanceSalesTaxation
establishmentCountry
goodsRateCategory
islandEstablishment
mode
ossRegistered
pricesIncludeVat
vatRegistrations {
...VatRegistrationFragment
}
}
}
}
Variables
{"_id": "5e5677d71bdc2ae76344968c"}
Response
{
"data": {
"eshop": {
"_id": "5e5677d71bdc2ae76344968c",
"address": "xyz789",
"addressBook": [AddressBookEntryType],
"bookingsBlockedByPolicy": true,
"brandAssets": BrandAssets,
"city": "xyz789",
"deliveryCompanies": [EshopDeliveryCompany],
"freeShipping": FreeShippingConfig,
"general": GeneralConfig,
"merchantNotices": [MerchantNoticeRecord],
"name": "xyz789",
"packageInsurance": 987.65,
"pageCustomization": PageCustomization,
"phone": "abc123",
"policyAcceptances": [PolicyAcceptance],
"postcode": "abc123",
"pricingEtag": "abc123",
"retentionHold": RetentionHold,
"securityValue": 987.65,
"slug": "xyz789",
"storeConnections": [StoreConnection],
"storeFreeShippingCodFee": "CHARGE",
"taxProfile": TaxProfile
}
}
}
eshopBranding
Description
Get public branding information for an eshop, can be used for branded pages (tracking, returns portal, etc.).
Response
Returns an EshopBranding
Arguments
| Name | Description |
|---|---|
eshopId - ObjectID!
|
Eshop identifier |
Example
Query
query EshopBranding($eshopId: ObjectID!) {
eshopBranding(eshopId: $eshopId) {
_id
colorScheme {
accent
background
primary
secondary
}
customization {
_placeholder
}
logos {
horizontal {
...LogoFragment
}
icon {
...LogoFragment
}
primary {
...LogoFragment
}
}
name
}
}
Variables
{"eshopId": "5e5677d71bdc2ae76344968c"}
Response
{
"data": {
"eshopBranding": {
"_id": "5e5677d71bdc2ae76344968c",
"colorScheme": BrandColorScheme,
"customization": CustomizationExtensions,
"logos": BrandLogos,
"name": "abc123"
}
}
}
trackShipment
Description
Track a shipment for its buyer. Anyone holding the ids gets the PUBLIC view: status, progress and destination city. A valid accessToken for this shipment adds verified: the recipient, lines, parcels, voucher code, carrier link and event detail. Errors only with eshop.notFound (unknown eshop), shipment.notFound (no such shipment in that eshop, the same whether or not it exists in another), trackShipment.notApplicableForFulfillmentType (fulfilled outside a carrier), and tooManyRequests (with extensions.retryAfter in seconds) for an hour once a client has had 20 not-found answers in 10 minutes (either not-found error, a token that is not valid for the shipment, or a failed lookup or verification). A shipment without an active label answers a result: see shipmentStatus.
Response
Returns a TrackingResult
Arguments
| Name | Description |
|---|---|
eshopId - ObjectID!
|
E-shop ID |
shipmentId - ObjectID!
|
Shipment ID |
accessToken - String
|
A link token (the t of the tracking link fragment) or an access token (from verifyTrackingAccess or findShipmentByOrder), sent as a variable. Absent or not valid for this shipment: the PUBLIC view, with accessTokenStatus saying why. |
Example
Query
query TrackShipment(
$eshopId: ObjectID!,
$shipmentId: ObjectID!,
$accessToken: String
) {
trackShipment(
eshopId: $eshopId,
shipmentId: $shipmentId,
accessToken: $accessToken
) {
access
accessTokenStatus
destination {
city
country
countryCode
}
progress {
deliveredAt
estimatedDelivery
lastUpdated
events {
...TrackingProgressEventFragment
}
returnToSender
}
shipmentStatus
verified {
carrierTrackingUrl
events {
...TrackingResultEventFragment
}
parcels {
...TrackingResultParcelFragment
}
products {
...TrackingResultProductFragment
}
recipient {
...TrackingResultRecipientFragment
}
voucherCode
}
}
}
Variables
{
"eshopId": "5e5677d71bdc2ae76344968c",
"shipmentId": "5e5677d71bdc2ae76344968c",
"accessToken": "abc123"
}
Response
{
"data": {
"trackShipment": {
"access": "PUBLIC",
"accessTokenStatus": "ABSENT",
"destination": TrackingDestination,
"progress": TrackingProgress,
"shipmentStatus": "BOOKING_UNRESOLVED",
"verified": VerifiedTracking
}
}
}
trackVoucher
Response
Returns [VoucherTracking]
Arguments
| Name | Description |
|---|---|
code - String
|
Voucher code |
Example
Query
query TrackVoucher($code: String) {
trackVoucher(code: $code) {
checkpointAction
checkpointDateTime
checkpointLocation
checkpointNotes
code
shipmentId
}
}
Variables
{"code": "xyz789"}
Response
{
"data": {
"trackVoucher": [
{
"checkpointAction": "xyz789",
"checkpointDateTime": "2007-12-03T10:15:30Z",
"checkpointLocation": "xyz789",
"checkpointNotes": "xyz789",
"code": "abc123",
"shipmentId": "5e5677d71bdc2ae76344968c"
}
]
}
}
Mutations
addShipment
Description
Add a shipment. With idempotencyKey, a retry returns the shipment the first call made. Otherwise booking again for an orderId already held in the same order scope (the storeConnectionId stated, or the eshop’s shipments with no connection) throws addShipment.orderIdAlreadyExists, naming that shipment in extensions.shipmentId and its connection in extensions.storeConnectionId, so a caller that lost its answer can finalise with the real id. A refused money payload throws its orderAmounts.* code and repeats the rejection on extensions: always type, naming the specific check that refused — several share one code — plus field and the submitted value on orderAmounts.invalidAmount. Read extensions rather than the code alone. A quote is a function of these inputs and nothing else: the typed countryCode and postcode, the city where an area keyed by settlement lists the postcode (and for FedEx and UPS), county for UPS; the shipper; the parcels; the shipped lines’ quantity, weight, dimensions, size, price, line money, sku, categories, extraAttributes, kind and customs fields; whether cash on delivery collects, and its amount; itemsSubtotal, discountTotal and the VAT basis; storeFreeShipping; requestedOptions; geniki.chargeCode; and the eshop’s pricingEtag. A cache keyed on more than these is safe; one keyed on fewer is not.
Response
Returns a Shipment
Arguments
| Name | Description |
|---|---|
buyerNotes - String
|
Customer's notes, trimmed. On an update, absent keeps the stored notes; null or blank clears them. Ignored and not stored on a quote (a NEW shipment with no orderId and no completed checkout); send them when the order is placed. |
checkout - ShipmentCheckoutInput
|
Checkout provenance: the flow/architecture the order came through, whether it was an express checkout, and the entry-point page. Typically set by the storefront plugin at order creation. |
eshopId - ObjectID
|
Required if the user belongs to or owns multiple eshops. Admins must specify an eshop. Not required for eshop integrations. |
geniki - GenikiInput
|
Geniki delivery company specific fields |
holds - [StoreHoldInput!]
|
The store's holds on the order, as a whole list: [] releases every store hold, and omitted keeps them. Send the holds that apply at placement (payment pending or under review, suspected fraud) on the booking itself, so the shipment is never labellable before the first sync. |
includeVat - Boolean
|
Whether the order’s amounts include VAT: the legacy per-order basis tag; send orderAmounts.pricesIncludeTax instead. With neither, the eshop’s declared taxProfile.pricesIncludeVat decides. Sent alongside a disagreeing orderAmounts.pricesIncludeTax it is refused (orderAmounts.conflictingBasisTags), not resolved by precedence. |
isB2BInvoice - Boolean
|
Indicates if the shipment is for a B2B invoice (true) or B2C invoice (false). False by default. |
orderAmounts - OrderAmountsInput
|
The order totals as the seller states them, passed verbatim (amounts-first contract). The COD collectible is amountDue when present, else grandTotal. On an update, omitting it keeps the stored totals and an explicit null withdraws them; a withdrawal is accepted only while the order is unplaced and refused afterwards with orderAmounts.lockedAfterPlacement. |
orderId - String
|
Order's id. Must be provided for the prod-test environment |
parcels - [ParcelInput!]
|
List of parcels in this shipment, each with its dimensions, weight and optional product distribution. At least one is required unless nothing on the order is shipped, in which case send an empty list. |
paymentMethod - ShipmentPaymentMethodEnum
|
Customer's payment method. |
products - [ProductInput!]!
|
List of products. |
recipient - RecipientCreateInput
|
Recipient details including address and contact information. Required, else shipmentInput.required with extensions.field recipient, unless the selected rate is IN_STORE: a counter sale may have no customer. |
recipientLogistics - RecipientLogisticsInput
|
Customer-provided logistics company details when using recipient-logistics. Ignored and not stored on a quote (a NEW shipment with no orderId and no completed checkout); a booking on the recipient-logistics carrier must send it, else addShipment.missingRecipientLogisticsDetails or updateShipment.missingRecipientLogisticsDetails. |
replacesShipment - ShipmentReplacementInput
|
On the booking of an edited order (Magento's <n>-1): the original order's shipment. The two are linked (replaces, replacedBy), and this shipment is held (REPLACES_SHIPPED_ORDER) until the original is canceled, so one purchase cannot ship twice. Set once; ignored when the shipment already replaces another. |
requestedOptions - [String!]
|
Catalogue option codes to ask every carrier for (saturday-delivery, cod-cheque). Only where the eshop has options enabled for the carrier; otherwise the carrier is refused with OPTIONS_NOT_ENABLED. An option a carrier cannot honour refuses that carrier with a reason; no rate is ever quoted without a requested option. Quote-time information: on an update, omitting it keeps the stored list; while the shipment is NEW, a different list re-prices. The update that places the order, and every later one, may restate the same list. A different one is refused with requestedOptions.lockedAfterPlacement (extensions.requestedOptions, the stored list) before anything is stored, with one exception: a dashboard user may change a placed shipment's list until its label. That re-prices the selected service for the merchant (a carrier RE_RATE) and binds a buyer RE_RATE that carries the booked charge forward, stating the options' price it does not take as ChargeOrder.optionsUnchargedCents; the buyer pays it only if orderAmounts says so. Under a live label that change is refused with requestedOptions.activeVoucher (extensions.status): cancel the label first. An option the carrier refuses answers selectedRate.optionsRefused. Preview it with shipmentRates(requestedOptions:). |
requiresShipping - Boolean
|
Whether any part of this order is shipped, as stated by the source platform. Takes precedence over the order lines, except that a line explicitly marked requiresShipping: true always wins. Omit it unless the platform states it, in which case the lines are used instead. |
selectedRate - SelectedRateInput
|
The selected service and rate for the shipment |
senderNotes - String
|
Sender's notes, trimmed. On an update, absent keeps the stored notes; null or blank clears them. |
shipper - ShipperInput
|
Where the shipment ships from: an addressBookEntryId of the eshop's address book, or an address with a contact. Omitted or null, the shipment keeps the shipper it has. The request that places the order (an addShipment with an orderId or a status past NEW, or the updateShipment that books a quote) takes the eshop's default address-book entry (isDefault, else the first) when the shipment has none, unless it is collected in store (a PICKUP rate), and records a SHIPPER_DEFAULTED audit entry. A counter sale (an IN_STORE rate) must name its shop, else shipmentInput.required with extensions.field shipper; it is never defaulted. Any later update leaves a shipment without a shipper as it is. |
source - ShipmentSourceEnum
|
Source of the shipment creation. |
status - ShipmentStatusEnum
|
Whether the order is placed: NEW (not yet), CHECKOUT_COMPLETE or MANUALLY_CREATED (placed). No other status may be named, by anyone. An order with nothing to ship is stored as NO_DELIVERY_REQUIRED, and returns to CHECKOUT_COMPLETE when it ships again. A placed counter sale (an IN_STORE rate) is stored as COLLECTED; one sent as NEW or with no status is refused with addShipment.inStoreSaleNotPlaced. addShipment refuses any other status with addShipment.badShipmentStatus. On updateShipment, naming a placed status for an order already placed and before its label, or echoing the stored status, changes nothing; a move the transitions do not allow (back to NEW once placed, or any status after the label or a cancel) is refused with updateShipment.illegalStatusTransition, with extensions.status (the stored status) and extensions.requestedStatus, both ShipmentStatusEnum names. Cancel with cancelShipment. |
storeConnectionId - ObjectID
|
The store connection this request comes from: the _id connectStore returned. Order ids are unique per connection, so the orderId duplicate check runs among this connection’s shipments, or, when omitted, among the eshop’s shipments that record no connection. Recorded when the shipment is created or its orderId first bound, never changed after. Refused with storeConnection.notFound when the eshop holds no such connection, storeConnection.platformMismatch when the Pircel-Platform header names another platform, and shipmentReference.storeConnectionMismatch when the shipment records another connection the eshop still holds. |
storeFreeShipping - StoreFreeShippingInput
|
Free shipping the store itself grants for the whole shipment. When no Pircel free-shipping rule applies, every carrier rate is priced with free delivery and the cash-on-delivery fee follows Eshop.storeFreeShippingCodFee; a Pircel rule that applies wins. Quote-time information: on an update, omitting it keeps the stored grant; while the order is a quote, granted: false clears it and re-prices. Once the order is placed (an orderId, or a status past NEW), an unchanged statement is accepted, granted: false included where no grant is stored, and a different one is refused with storeFreeShipping.lockedAfterPlacement. |
idempotencyKey - String
|
Caller-supplied idempotency key. A retry carrying the same key returns the original outcome instead of executing again. Use a UUIDv4 per logical operation, not per HTTP attempt: at most 255 printable ASCII characters, else idempotency.keyInvalid. The same key with another payload is refused with idempotency.keyReused, and one still in progress with idempotency.requestInProgress. A key is kept 24 hours from the end of its request. Without a key nothing is claimed and the request runs as sent. |
Example
Query
mutation AddShipment(
$buyerNotes: String,
$checkout: ShipmentCheckoutInput,
$eshopId: ObjectID,
$geniki: GenikiInput,
$holds: [StoreHoldInput!],
$includeVat: Boolean,
$isB2BInvoice: Boolean,
$orderAmounts: OrderAmountsInput,
$orderId: String,
$parcels: [ParcelInput!],
$paymentMethod: ShipmentPaymentMethodEnum,
$products: [ProductInput!]!,
$recipient: RecipientCreateInput,
$recipientLogistics: RecipientLogisticsInput,
$replacesShipment: ShipmentReplacementInput,
$requestedOptions: [String!],
$requiresShipping: Boolean,
$selectedRate: SelectedRateInput,
$senderNotes: String,
$shipper: ShipperInput,
$source: ShipmentSourceEnum,
$status: ShipmentStatusEnum,
$storeConnectionId: ObjectID,
$storeFreeShipping: StoreFreeShippingInput,
$idempotencyKey: String
) {
addShipment(
buyerNotes: $buyerNotes,
checkout: $checkout,
eshopId: $eshopId,
geniki: $geniki,
holds: $holds,
includeVat: $includeVat,
isB2BInvoice: $isB2BInvoice,
orderAmounts: $orderAmounts,
orderId: $orderId,
parcels: $parcels,
paymentMethod: $paymentMethod,
products: $products,
recipient: $recipient,
recipientLogistics: $recipientLogistics,
replacesShipment: $replacesShipment,
requestedOptions: $requestedOptions,
requiresShipping: $requiresShipping,
selectedRate: $selectedRate,
senderNotes: $senderNotes,
shipper: $shipper,
source: $source,
status: $status,
storeConnectionId: $storeConnectionId,
storeFreeShipping: $storeFreeShipping,
idempotencyKey: $idempotencyKey
) {
_id
auditLog {
_id
actor {
...UserFragment
}
actorType
changes {
...ShipmentAuditChangeFragment
}
createdAt
event
metadata
store {
...ShipmentAuditStoreOriginFragment
}
summary
}
availableRates {
deliveryCompany {
...DeliveryCompanyFragment
}
error
quotedAt
rating
refusals {
...RateRefusalFragment
}
services {
...ServiceFragment
}
}
buyerNotes
charge {
buyer {
...ShipmentChargeFragment
}
carrier {
...ShipmentChargeFragment
}
}
checkout {
entryPoint
flow
isExpress
}
checkoutCompletedAt
codCollectible {
amount
source
status
}
codDeclaration {
amount
currency
declaredAt
source
voucherCodes
}
collectedAt
costSummary {
deliveryCostCents
productsTotalCents
totalCostCents
deliveryAmount {
...TaxedMoneyFragment
}
productsAmount {
...TaxedMoneyFragment
}
totalAmount {
...TaxedMoneyFragment
}
vatRate
}
createdAt
documentUpload {
available
reason
}
effectiveDate
eshop {
_id
address
addressBook {
...AddressBookEntryTypeFragment
}
bookingsBlockedByPolicy
brandAssets {
...BrandAssetsFragment
}
city
deliveryCompanies {
...EshopDeliveryCompanyFragment
}
freeShipping {
...FreeShippingConfigFragment
}
general {
...GeneralConfigFragment
}
merchantNotices {
...MerchantNoticeRecordFragment
}
name
packageInsurance
pageCustomization {
...PageCustomizationFragment
}
phone
policyAcceptances {
...PolicyAcceptanceFragment
}
postcode
pricingEtag
retentionHold {
...RetentionHoldFragment
}
securityValue
slug
storeConnections {
...StoreConnectionFragment
}
storeFreeShippingCodFee
taxProfile {
...TaxProfileFragment
}
}
freeShipping {
applied
appliedRegionSource
appliedRuleId
appliedRuleName
checkoutDisplay
codFeeCharged
defaultCarrier {
...DeliveryCompanyFragment
}
discountAmount
originalCost
originalCostUnknownReason
reason
threshold
}
freeShippingDecision {
applied
cartValueCents
cartValueSource
codFeeChargedCents
decidedAt
frozen
outcome
regionSource
ruleId
ruleName
thresholdBasis
thresholdCents
}
geniki {
chargeCode
jobId
}
holds {
note
reason
since
source
}
isB2BInvoice
notificationsSent {
sentAt
trigger
}
orderAmounts {
amountDue
anomalies {
...OrderAmountsAnomalyFragment
}
currency
discountLines {
...OrderDiscountLineFragment
}
discountTotal
feeLines {
...OrderFeeLineFragment
}
feesTotal
grandTotal
itemsSubtotal
payments {
...OrderPaymentFragment
}
prepaidTotal
pricesIncludeTax
refundedTotal
refunds {
...OrderRefundFragment
}
shippingTax
shippingTotal
taxLines {
...OrderTaxLineFragment
}
totalTax
}
orderId
otherDocuments {
documentType
encodedDocument
externalId
}
parcels {
_id
billableWeight
contents {
...ParcelContentsFragment
}
dimensions {
...ParcelDimensionsFragment
}
returnVoucher {
...ParcelVoucherFragment
}
volumetricWeight
voucher {
...ParcelVoucherFragment
}
weight
}
paymentMethod
pickupAddress {
address
addressBookEntry
city
country
countryCode
name
postcode
}
pickupDate
pricingEtag
products {
_id
categories
countryOfOrigin
description
dimensions {
...ProductDimensionsFragment
}
externalId
extraAttributes
harmonizedSystemCode
image
kind
lineDiscount
lineSubtotal
lineTotal
metadata
price
quantity
requiresShipping
sku
storeLineId
title
weight
}
productsQuantity
recipient {
address {
...AddressFragment
}
contact {
...ContactFragment
}
}
recipientLogistics {
companyName
email
phone
}
replacedBy {
orderId
shipmentId
}
replaces {
orderId
shipmentId
}
requestedOptions
requiresShipping
returnShipmentVoucher {
code
createdAt
deliveryCompanyReference
merchantReference
status
}
selectedRate {
costs {
...CostsFragment
}
deliveryCompany {
...DeliveryCompanyFragment
}
fulfillmentType
negotiatedCosts {
...CostsFragment
}
negotiatedPriceComponents {
...PricingComponentFragment
}
priceComponents {
...PricingComponentFragment
}
pricingTrace {
...PricingTraceFragment
}
quoteBasis {
...QuoteBasisFragment
}
rating
serviceCode
serviceName
transitTime {
...TransitTimeFragment
}
}
senderNotes
shipmentPurpose
shipmentVoucher {
code
createdAt
deliveryCompanyReference
merchantReference
status
}
shipper {
address {
...AddressFragment
}
addressBookEntry
contact {
...ContactFragment
}
}
shippingRegionType
status
storeConnection {
_id
apiKey {
...StoreConnectionKeyFragment
}
capabilities
consecutiveFailures
createdAt
credentialTransport
disconnectedAt
expiresAt
externalId
hintDelivery {
...StoreHintDeliveryFragment
}
hintSigningSecretSet
hintUrl
lastFailedAt
lastFeedReadAt
lastSyncedAt
outboundBacklog {
...StoreOutboundBacklogFragment
}
platform
pluginVersion
restBaseUrl
retiredAt
scopes
status
storeCurrencyCode
storeDomain
}
storeConnectionId
storeFreeShipping {
granted
label
}
storeManagedFields
storeShipments {
createdAt
recordedAt
storeShipmentId
tracks {
...StoreTrackFragment
}
}
storeSync {
ackedVersion
appliedSourceVersion
changedAt
changedFields
lastAckAt
lastAckReason
lastChangeOrigin
lastError
lastInboundAt
state
version
}
syncIssues {
_id
appliedValue
availableActions
detectedAt
field
kind
operatorOnly
resolution
resolvedAt
resolvedBy {
...UserFragment
}
severity
sourceVersion
storeValue
}
synthetic {
expiresAt
issuedAt
nonce
verifiedAt
}
trackingDetails {
carrierTrackingUrl
deliveredAt
deliveryCompany {
...DeliveryCompanyFragment
}
eshopTrackingUrl
estimatedDelivery
events {
...TrackingEventFragment
}
isActive
lastStatus
lastSyncedAt
lastUpdated
nextPollAt
returnToSender
slaTier
voucherCode
}
unassociatedVouchers {
code
rawDeliveryCompanyResponse
reason
status
}
unavailableRates {
deliveryCompany {
...DeliveryCompanyFragment
}
error
quotedAt
rating
refusals {
...RateRefusalFragment
}
services {
...ServiceFragment
}
}
vatDetails {
basisContradiction
basisSource
valueAddedTaxIncluded
}
viewerCanOverrideStoreManagedFields
viewerEditableStoreManagedFields
}
}
Variables
{
"buyerNotes": "abc123",
"checkout": ShipmentCheckoutInput,
"eshopId": "5e5677d71bdc2ae76344968c",
"geniki": GenikiInput,
"holds": [StoreHoldInput],
"includeVat": true,
"isB2BInvoice": false,
"orderAmounts": OrderAmountsInput,
"orderId": "xyz789",
"parcels": [ParcelInput],
"paymentMethod": "AFTERPAY_CLEARPAY",
"products": [ProductInput],
"recipient": RecipientCreateInput,
"recipientLogistics": RecipientLogisticsInput,
"replacesShipment": ShipmentReplacementInput,
"requestedOptions": ["abc123"],
"requiresShipping": true,
"selectedRate": SelectedRateInput,
"senderNotes": "xyz789",
"shipper": ShipperInput,
"source": "CHECKOUT",
"status": "BOOKING_UNRESOLVED",
"storeConnectionId": "5e5677d71bdc2ae76344968c",
"storeFreeShipping": StoreFreeShippingInput,
"idempotencyKey": "xyz789"
}
Response
{
"data": {
"addShipment": {
"_id": "5e5677d71bdc2ae76344968c",
"auditLog": [ShipmentAuditEntry],
"availableRates": [DeliveryRate],
"buyerNotes": "xyz789",
"charge": ShipmentCharges,
"checkout": ShipmentCheckout,
"checkoutCompletedAt": "2007-12-03T10:15:30Z",
"codCollectible": CodCollectible,
"codDeclaration": CodDeclaration,
"collectedAt": "2007-12-03T10:15:30Z",
"costSummary": CostSummary,
"createdAt": "2007-12-03T10:15:30Z",
"documentUpload": DocumentUploadEligibility,
"effectiveDate": "2007-12-03T10:15:30Z",
"eshop": Eshop,
"freeShipping": ShipmentFreeShipping,
"freeShippingDecision": FreeShippingDecision,
"geniki": GenikiFields,
"holds": [ShipmentHold],
"isB2BInvoice": true,
"notificationsSent": [NotificationSent],
"orderAmounts": OrderAmounts,
"orderId": "xyz789",
"otherDocuments": [OtherDocument],
"parcels": [Parcel],
"paymentMethod": "AFTERPAY_CLEARPAY",
"pickupAddress": PickupAddress,
"pickupDate": "2007-12-03",
"pricingEtag": "abc123",
"products": [Product],
"productsQuantity": 987,
"recipient": Recipient,
"recipientLogistics": RecipientLogistics,
"replacedBy": ShipmentLink,
"replaces": ShipmentLink,
"requestedOptions": ["abc123"],
"requiresShipping": false,
"returnShipmentVoucher": ShipmentVoucher,
"selectedRate": SelectedRate,
"senderNotes": "abc123",
"shipmentPurpose": "GIFT",
"shipmentVoucher": ShipmentVoucher,
"shipper": Shipper,
"shippingRegionType": "DOMESTIC",
"status": "BOOKING_UNRESOLVED",
"storeConnection": StoreConnection,
"storeConnectionId": "5e5677d71bdc2ae76344968c",
"storeFreeShipping": ShipmentStoreFreeShipping,
"storeManagedFields": ["CANCELLATION"],
"storeShipments": [StoreShipment],
"storeSync": ShipmentStoreSync,
"syncIssues": [ShipmentSyncIssue],
"synthetic": ShipmentSynthetic,
"trackingDetails": TrackingDetails,
"unassociatedVouchers": [UnassociatedVoucher],
"unavailableRates": [DeliveryRate],
"vatDetails": VatDetails,
"viewerCanOverrideStoreManagedFields": false,
"viewerEditableStoreManagedFields": ["CANCELLATION"]
}
}
}
cancelShipment
Description
Cancel a shipment whether or not a label was ever printed — the lever for an order canceled in the store before printing, which cancelVoucher cannot reach because it has no voucher to act on. Any live voucher is canceled at the carrier first; a carrier that refuses aborts the call and the shipment keeps its status. Refused with cancelShipment.alreadyProgressed once the parcel has moved, and from PICKUP_LIST_CREATED for anyone but an operator, with extensions.status set to the status as Shipment.status returns it, a ShipmentStatusEnum name; refused with cancelShipment.syntheticForbidden for a synthetic-monitoring shipment. A shipment saved concurrently while the call runs is decided again once; cancelShipment.conflict (retry it) means it was saved again, or changed in a way this call cannot settle. A label the call voided by then reads canceled where it could be recorded, and the shipment may be left at VOUCHER_CANCELED until the retry cancels it; where it could not, the label still reads active and Pircel is alerted. Idempotent: calling it on an already-canceled shipment succeeds and returns the shipment. This is the one way to cancel a shipment.
Response
Returns a CancelShipmentPayload!
Arguments
| Name | Description |
|---|---|
eshopId - ObjectID
|
Required if the user belongs to or owns multiple eshops. Admins must specify an eshop. Not required for eshop integrations. |
idempotencyKey - String
|
Caller-supplied idempotency key. A retry carrying the same key returns the original outcome instead of reaching the carrier again. Use a UUIDv4 per logical operation, not per HTTP attempt: at most 255 printable ASCII characters, else idempotency.keyInvalid. The same key with another payload is refused with idempotency.keyReused, and one still in progress with idempotency.requestInProgress. A key is kept 24 hours from the end of its request. Without a key nothing is claimed and the request runs as sent. |
orderId - String
|
The order id. Either orderId or shipmentId must be provided |
shipmentId - ObjectID
|
The shipment id. Either orderId or shipmentId must be provided |
storeConnectionId - ObjectID
|
The store connection this request comes from: the _id connectStore returned. With orderId alone, the order is looked up among this connection’s shipments only, or, when omitted, among the eshop’s shipments that record no connection; several matches there are refused with shipmentReference.ambiguous, naming them in extensions.shipmentIds. With shipmentId, refused with shipmentReference.storeConnectionMismatch when the shipment records another connection the eshop still holds. Refused with storeConnection.notFound when the eshop holds no such connection, and storeConnection.platformMismatch when the Pircel-Platform header names another platform. |
Example
Query
mutation CancelShipment(
$eshopId: ObjectID,
$idempotencyKey: String,
$orderId: String,
$shipmentId: ObjectID,
$storeConnectionId: ObjectID
) {
cancelShipment(
eshopId: $eshopId,
idempotencyKey: $idempotencyKey,
orderId: $orderId,
shipmentId: $shipmentId,
storeConnectionId: $storeConnectionId
) {
canceledCodes
shipment {
_id
auditLog {
...ShipmentAuditEntryFragment
}
availableRates {
...DeliveryRateFragment
}
buyerNotes
charge {
...ShipmentChargesFragment
}
checkout {
...ShipmentCheckoutFragment
}
checkoutCompletedAt
codCollectible {
...CodCollectibleFragment
}
codDeclaration {
...CodDeclarationFragment
}
collectedAt
costSummary {
...CostSummaryFragment
}
createdAt
documentUpload {
...DocumentUploadEligibilityFragment
}
effectiveDate
eshop {
...EshopFragment
}
freeShipping {
...ShipmentFreeShippingFragment
}
freeShippingDecision {
...FreeShippingDecisionFragment
}
geniki {
...GenikiFieldsFragment
}
holds {
...ShipmentHoldFragment
}
isB2BInvoice
notificationsSent {
...NotificationSentFragment
}
orderAmounts {
...OrderAmountsFragment
}
orderId
otherDocuments {
...OtherDocumentFragment
}
parcels {
...ParcelFragment
}
paymentMethod
pickupAddress {
...PickupAddressFragment
}
pickupDate
pricingEtag
products {
...ProductFragment
}
productsQuantity
recipient {
...RecipientFragment
}
recipientLogistics {
...RecipientLogisticsFragment
}
replacedBy {
...ShipmentLinkFragment
}
replaces {
...ShipmentLinkFragment
}
requestedOptions
requiresShipping
returnShipmentVoucher {
...ShipmentVoucherFragment
}
selectedRate {
...SelectedRateFragment
}
senderNotes
shipmentPurpose
shipmentVoucher {
...ShipmentVoucherFragment
}
shipper {
...ShipperFragment
}
shippingRegionType
status
storeConnection {
...StoreConnectionFragment
}
storeConnectionId
storeFreeShipping {
...ShipmentStoreFreeShippingFragment
}
storeManagedFields
storeShipments {
...StoreShipmentFragment
}
storeSync {
...ShipmentStoreSyncFragment
}
syncIssues {
...ShipmentSyncIssueFragment
}
synthetic {
...ShipmentSyntheticFragment
}
trackingDetails {
...TrackingDetailsFragment
}
unassociatedVouchers {
...UnassociatedVoucherFragment
}
unavailableRates {
...DeliveryRateFragment
}
vatDetails {
...VatDetailsFragment
}
viewerCanOverrideStoreManagedFields
viewerEditableStoreManagedFields
}
}
}
Variables
{
"eshopId": "5e5677d71bdc2ae76344968c",
"idempotencyKey": "xyz789",
"orderId": "xyz789",
"shipmentId": "5e5677d71bdc2ae76344968c",
"storeConnectionId": "5e5677d71bdc2ae76344968c"
}
Response
{
"data": {
"cancelShipment": {
"canceledCodes": ["xyz789"],
"shipment": Shipment
}
}
}
cancelVoucher
Description
Cancel every active voucher on a shipment. Returns a CancelVoucherPayload with the updated shipment and the carrier-confirmed canceled codes. Only a VOUCHER_CREATED shipment has vouchers to cancel; any other is refused with cancelVoucher.shipmentAlreadyProgressed, with extensions.status set to the status as Shipment.status returns it, a ShipmentStatusEnum name, so a CANCELED or VOUCHER_CANCELED shipment reads as such rather than as one that moved. One that holds no active voucher is refused with cancelVoucher.noActiveVouchers, whatever its carrier. A shipment saved concurrently while the call runs is decided again without asking the carrier twice: the call succeeds at VOUCHER_CANCELED once the voided label reads canceled on it, answers cancelVoucher.shipmentAlreadyProgressed when another write already left it dead, and cancelVoucher.conflict (retry it) when it could not be made to read canceled.
Response
Returns a CancelVoucherPayload!
Arguments
| Name | Description |
|---|---|
eshopId - ObjectID
|
Required if the user belongs to or owns multiple eshops. Admins must specify an eshop. Not required for eshop integrations. |
idempotencyKey - String
|
Caller-supplied idempotency key. A retry carrying the same key returns the original outcome instead of reaching the carrier again. Use a UUIDv4 per logical operation, not per HTTP attempt: at most 255 printable ASCII characters, else idempotency.keyInvalid. The same key with another payload is refused with idempotency.keyReused, and one still in progress with idempotency.requestInProgress. A key is kept 24 hours from the end of its request. Without a key nothing is claimed and the request runs as sent. |
orderId - String
|
The order id. Either orderId or shipmentId must be provided |
shipmentId - ObjectID
|
The shipment id. Either orderId or shipmentId must be provided |
storeConnectionId - ObjectID
|
The store connection this request comes from: the _id connectStore returned. With orderId alone, the order is looked up among this connection’s shipments only, or, when omitted, among the eshop’s shipments that record no connection; several matches there are refused with shipmentReference.ambiguous, naming them in extensions.shipmentIds. With shipmentId, refused with shipmentReference.storeConnectionMismatch when the shipment records another connection the eshop still holds. Refused with storeConnection.notFound when the eshop holds no such connection, and storeConnection.platformMismatch when the Pircel-Platform header names another platform. |
Example
Query
mutation CancelVoucher(
$eshopId: ObjectID,
$idempotencyKey: String,
$orderId: String,
$shipmentId: ObjectID,
$storeConnectionId: ObjectID
) {
cancelVoucher(
eshopId: $eshopId,
idempotencyKey: $idempotencyKey,
orderId: $orderId,
shipmentId: $shipmentId,
storeConnectionId: $storeConnectionId
) {
canceledCodes
shipment {
_id
auditLog {
...ShipmentAuditEntryFragment
}
availableRates {
...DeliveryRateFragment
}
buyerNotes
charge {
...ShipmentChargesFragment
}
checkout {
...ShipmentCheckoutFragment
}
checkoutCompletedAt
codCollectible {
...CodCollectibleFragment
}
codDeclaration {
...CodDeclarationFragment
}
collectedAt
costSummary {
...CostSummaryFragment
}
createdAt
documentUpload {
...DocumentUploadEligibilityFragment
}
effectiveDate
eshop {
...EshopFragment
}
freeShipping {
...ShipmentFreeShippingFragment
}
freeShippingDecision {
...FreeShippingDecisionFragment
}
geniki {
...GenikiFieldsFragment
}
holds {
...ShipmentHoldFragment
}
isB2BInvoice
notificationsSent {
...NotificationSentFragment
}
orderAmounts {
...OrderAmountsFragment
}
orderId
otherDocuments {
...OtherDocumentFragment
}
parcels {
...ParcelFragment
}
paymentMethod
pickupAddress {
...PickupAddressFragment
}
pickupDate
pricingEtag
products {
...ProductFragment
}
productsQuantity
recipient {
...RecipientFragment
}
recipientLogistics {
...RecipientLogisticsFragment
}
replacedBy {
...ShipmentLinkFragment
}
replaces {
...ShipmentLinkFragment
}
requestedOptions
requiresShipping
returnShipmentVoucher {
...ShipmentVoucherFragment
}
selectedRate {
...SelectedRateFragment
}
senderNotes
shipmentPurpose
shipmentVoucher {
...ShipmentVoucherFragment
}
shipper {
...ShipperFragment
}
shippingRegionType
status
storeConnection {
...StoreConnectionFragment
}
storeConnectionId
storeFreeShipping {
...ShipmentStoreFreeShippingFragment
}
storeManagedFields
storeShipments {
...StoreShipmentFragment
}
storeSync {
...ShipmentStoreSyncFragment
}
syncIssues {
...ShipmentSyncIssueFragment
}
synthetic {
...ShipmentSyntheticFragment
}
trackingDetails {
...TrackingDetailsFragment
}
unassociatedVouchers {
...UnassociatedVoucherFragment
}
unavailableRates {
...DeliveryRateFragment
}
vatDetails {
...VatDetailsFragment
}
viewerCanOverrideStoreManagedFields
viewerEditableStoreManagedFields
}
}
}
Variables
{
"eshopId": "5e5677d71bdc2ae76344968c",
"idempotencyKey": "xyz789",
"orderId": "xyz789",
"shipmentId": "5e5677d71bdc2ae76344968c",
"storeConnectionId": "5e5677d71bdc2ae76344968c"
}
Response
{
"data": {
"cancelVoucher": {
"canceledCodes": ["abc123"],
"shipment": Shipment
}
}
}
createPickupList
Description
Create pickup lists for all delivery companies which had been chosen for this pickup date
Response
Returns a CreatePickupListReturn
Arguments
| Name | Description |
|---|---|
eshopId - ObjectID
|
Optional if user belongs to single eshop; required for admins or multiple eshops |
pickupDate - String!
|
Date "YYYY-MM-DD" that the delivery companies should pick up shipments |
pickupTimes - [PickupTimeInput!]!
|
List of per-company pickup time inputs |
shipmentIds - [ObjectID!]!
|
Array of shipment IDs to include in the pickup list. |
Example
Query
mutation CreatePickupList(
$eshopId: ObjectID,
$pickupDate: String!,
$pickupTimes: [PickupTimeInput!]!,
$shipmentIds: [ObjectID!]!
) {
createPickupList(
eshopId: $eshopId,
pickupDate: $pickupDate,
pickupTimes: $pickupTimes,
shipmentIds: $shipmentIds
) {
lists {
closeTime
code
deliveryCompany {
...DeliveryCompanyFragment
}
printDocument
readyTime
}
}
}
Variables
{
"eshopId": "5e5677d71bdc2ae76344968c",
"pickupDate": "xyz789",
"pickupTimes": [PickupTimeInput],
"shipmentIds": [
"5e5677d71bdc2ae76344968c"
]
}
Response
{
"data": {
"createPickupList": {"lists": [PickupListsList]}
}
}
createVoucher
Description
Create the carrier voucher(s) for a shipment. Returns a CreateVoucherPayload wrapping the updated shipment; read voucher state off payload.shipment.shipmentVoucher and payload.shipment.parcels[i].voucher. A shipment with a live label is returned as it is, with createdCodes empty. Otherwise only a placed order before its label, a CHECKOUT_COMPLETE, MANUALLY_CREATED or VOUCHER_CANCELED shipment, is labelled; any other, a NEW quote included, is refused with createVoucher.shipmentNotLabellable, before the carrier is asked, with extensions.status set to the status as Shipment.status returns it, a ShipmentStatusEnum name. A shipment whose stored recipient lacks a street (addressLine1), country code, city, or a name (first and last name, or company) is refused with createVoucher.recipientIncomplete, also before the carrier is asked: extensions.issues lists each missing field as { code: shipmentInput.required, field, type }, with the first in extensions.field. A quote stores none of the street or name, so restate the recipient with updateShipment when booking.
Response
Returns a CreateVoucherPayload!
Arguments
| Name | Description |
|---|---|
eshopId - ObjectID
|
Required if the user belongs to or owns multiple eshops. Admins must specify an eshop. Not required for eshop integrations. |
generateCommercialInvoice - Boolean
|
Whether to generate a commercial invoice. Defaults to true for international shipments. |
idempotencyKey - String
|
Caller-supplied idempotency key. A retry carrying the same key returns the original outcome instead of executing again. Use a UUIDv4 per logical operation, not per HTTP attempt: at most 255 printable ASCII characters, else idempotency.keyInvalid. The same key with another payload is refused with idempotency.keyReused, and one still in progress with idempotency.requestInProgress. A key is kept 24 hours from the end of its request. Without a key nothing is claimed and the request runs as sent. |
includeBuyerNotes - Boolean
|
Whether to send the buyer's own delivery notes (Shipment.buyerNotes) to the carrier, appended to notes and never replacing it. Omit to follow the eshop's general.voucher.includeBuyerNotes setting; when that is unset too, buyer notes are NOT sent. |
notes - String
|
Notes/comments for the delivery company. Sent as given; includeBuyerNotes may append the buyer's own notes after them. |
orderId - String
|
The id of the order. Either orderId or shipmentId must be provided |
pickupDate - String
|
Date "YYYY-MM-DD" that the delivery company should receive the package from the shop. Defaults to today. |
shipmentId - ObjectID
|
The id of the shipment. Either orderId or shipmentId must be provided |
shipmentPurpose - ShipmentPurposeEnum
|
The purpose of the shipment |
storeConnectionId - ObjectID
|
The store connection this request comes from: the _id connectStore returned. With orderId alone, the order is looked up among this connection’s shipments only, or, when omitted, among the eshop’s shipments that record no connection; several matches there are refused with shipmentReference.ambiguous, naming them in extensions.shipmentIds. With shipmentId, refused with shipmentReference.storeConnectionMismatch when the shipment records another connection the eshop still holds. Refused with storeConnection.notFound when the eshop holds no such connection, and storeConnection.platformMismatch when the Pircel-Platform header names another platform. |
Example
Query
mutation CreateVoucher(
$eshopId: ObjectID,
$generateCommercialInvoice: Boolean,
$idempotencyKey: String,
$includeBuyerNotes: Boolean,
$notes: String,
$orderId: String,
$pickupDate: String,
$shipmentId: ObjectID,
$shipmentPurpose: ShipmentPurposeEnum,
$storeConnectionId: ObjectID
) {
createVoucher(
eshopId: $eshopId,
generateCommercialInvoice: $generateCommercialInvoice,
idempotencyKey: $idempotencyKey,
includeBuyerNotes: $includeBuyerNotes,
notes: $notes,
orderId: $orderId,
pickupDate: $pickupDate,
shipmentId: $shipmentId,
shipmentPurpose: $shipmentPurpose,
storeConnectionId: $storeConnectionId
) {
createdCodes
shipment {
_id
auditLog {
...ShipmentAuditEntryFragment
}
availableRates {
...DeliveryRateFragment
}
buyerNotes
charge {
...ShipmentChargesFragment
}
checkout {
...ShipmentCheckoutFragment
}
checkoutCompletedAt
codCollectible {
...CodCollectibleFragment
}
codDeclaration {
...CodDeclarationFragment
}
collectedAt
costSummary {
...CostSummaryFragment
}
createdAt
documentUpload {
...DocumentUploadEligibilityFragment
}
effectiveDate
eshop {
...EshopFragment
}
freeShipping {
...ShipmentFreeShippingFragment
}
freeShippingDecision {
...FreeShippingDecisionFragment
}
geniki {
...GenikiFieldsFragment
}
holds {
...ShipmentHoldFragment
}
isB2BInvoice
notificationsSent {
...NotificationSentFragment
}
orderAmounts {
...OrderAmountsFragment
}
orderId
otherDocuments {
...OtherDocumentFragment
}
parcels {
...ParcelFragment
}
paymentMethod
pickupAddress {
...PickupAddressFragment
}
pickupDate
pricingEtag
products {
...ProductFragment
}
productsQuantity
recipient {
...RecipientFragment
}
recipientLogistics {
...RecipientLogisticsFragment
}
replacedBy {
...ShipmentLinkFragment
}
replaces {
...ShipmentLinkFragment
}
requestedOptions
requiresShipping
returnShipmentVoucher {
...ShipmentVoucherFragment
}
selectedRate {
...SelectedRateFragment
}
senderNotes
shipmentPurpose
shipmentVoucher {
...ShipmentVoucherFragment
}
shipper {
...ShipperFragment
}
shippingRegionType
status
storeConnection {
...StoreConnectionFragment
}
storeConnectionId
storeFreeShipping {
...ShipmentStoreFreeShippingFragment
}
storeManagedFields
storeShipments {
...StoreShipmentFragment
}
storeSync {
...ShipmentStoreSyncFragment
}
syncIssues {
...ShipmentSyncIssueFragment
}
synthetic {
...ShipmentSyntheticFragment
}
trackingDetails {
...TrackingDetailsFragment
}
unassociatedVouchers {
...UnassociatedVoucherFragment
}
unavailableRates {
...DeliveryRateFragment
}
vatDetails {
...VatDetailsFragment
}
viewerCanOverrideStoreManagedFields
viewerEditableStoreManagedFields
}
}
}
Variables
{
"eshopId": "5e5677d71bdc2ae76344968c",
"generateCommercialInvoice": false,
"idempotencyKey": "xyz789",
"includeBuyerNotes": true,
"notes": "xyz789",
"orderId": "abc123",
"pickupDate": "xyz789",
"shipmentId": "5e5677d71bdc2ae76344968c",
"shipmentPurpose": "GIFT",
"storeConnectionId": "5e5677d71bdc2ae76344968c"
}
Response
{
"data": {
"createVoucher": {
"createdCodes": ["abc123"],
"shipment": Shipment
}
}
}
findShipmentByOrder
Description
Find the buyer's shipment for an order from the email or phone it was placed with, and unlock its VERIFIED tracking view. When several shipments of the order match, the answer is the most recent one that is not canceled, or the most recent one when all are canceled. Errors with findShipmentByOrder.emptyOrderId (blank order id); the other errors as verifyTrackingAccess. Errors with trackingAccess.contactEmpty (blank contact), trackingAccess.verificationFailed (no match: the same answer whether or not the target exists), tooManyRequests with extensions.retryAfter in seconds (5 failed attempts on the target from one client in 15 minutes, which blocks that client for 15 minutes; 20 on the target from any clients in an hour; 10 from the client in 15 minutes; or the client blocked by trackShipment), and trackingAccess.unavailable (verified tracking is switched off). A tracking link with its token still unlocks the view during a refusal.
Response
Returns a TrackingOrderLookup!
Example
Query
mutation FindShipmentByOrder(
$contact: String!,
$eshopId: ObjectID!,
$orderId: String!
) {
findShipmentByOrder(
contact: $contact,
eshopId: $eshopId,
orderId: $orderId
) {
accessToken
expiresAt
shipmentId
}
}
Variables
{
"contact": "abc123",
"eshopId": "5e5677d71bdc2ae76344968c",
"orderId": "abc123"
}
Response
{
"data": {
"findShipmentByOrder": {
"accessToken": "abc123",
"expiresAt": "2007-12-03T10:15:30Z",
"shipmentId": "5e5677d71bdc2ae76344968c"
}
}
}
printVoucher
Description
Print labels for one shipment in a single merged PDF. Labels are placed according to the carrier's configured outputMedium and stickerLayout: slot-grid snapping for sticker-paper customers, FFDH-packed onto the configured paper sheet for free-canvas customers, or concatenated at native cropped dimensions for thermal-printer customers. Multi-parcel shipments are merged into one document so callers receive a single printable file regardless of parcel count.
Response
Returns a PrintVoucherPayload!
Arguments
| Name | Description |
|---|---|
eshopId - ObjectID
|
Required if the user belongs to or owns multiple eshops. Admins must specify an eshop. Not required for eshop integrations. |
orderId - String
|
The order id. Either orderId or shipmentId must be provided |
shipmentId - ObjectID
|
The shipment id. Either orderId or shipmentId must be provided |
storeConnectionId - ObjectID
|
The store connection this request comes from: the _id connectStore returned. With orderId alone, the order is looked up among this connection’s shipments only, or, when omitted, among the eshop’s shipments that record no connection; several matches there are refused with shipmentReference.ambiguous, naming them in extensions.shipmentIds. With shipmentId, refused with shipmentReference.storeConnectionMismatch when the shipment records another connection the eshop still holds. Refused with storeConnection.notFound when the eshop holds no such connection, and storeConnection.platformMismatch when the Pircel-Platform header names another platform. |
Example
Query
mutation PrintVoucher(
$eshopId: ObjectID,
$orderId: String,
$shipmentId: ObjectID,
$storeConnectionId: ObjectID
) {
printVoucher(
eshopId: $eshopId,
orderId: $orderId,
shipmentId: $shipmentId,
storeConnectionId: $storeConnectionId
) {
document
}
}
Variables
{
"eshopId": "5e5677d71bdc2ae76344968c",
"orderId": "xyz789",
"shipmentId": "5e5677d71bdc2ae76344968c",
"storeConnectionId": "5e5677d71bdc2ae76344968c"
}
Response
{
"data": {
"printVoucher": {"document": "abc123"}
}
}
recordCookieConsent
Description
Records a visitor's cookie choice for pircel.com, anonymously and append-only: every call is a new record, a withdrawal included, and none is linked to a user even when the request carries a session. Records are kept 24 months. Refused with cookieConsent.invalidInput (extensions.field: consentId not a UUID v4, or policyVersion not a calendar date or later than tomorrow), tooManyRequests (over 30 from one client in an hour) or cookieConsent.tooMany (over 20 for one consentId in 24 hours).
Response
Returns a CookieConsentRecordPayload!
Arguments
| Name | Description |
|---|---|
input - CookieConsentRecordInput!
|
Example
Query
mutation RecordCookieConsent($input: CookieConsentRecordInput!) {
recordCookieConsent(input: $input) {
recordedAt
}
}
Variables
{"input": CookieConsentRecordInput}
Response
{
"data": {
"recordCookieConsent": {
"recordedAt": "2007-12-03T10:15:30Z"
}
}
}
verifyTrackingAccess
Description
Unlock the VERIFIED tracking view of a shipment with the email or phone the order was placed with, for a link without a token, an expired link or a pasted id. Errors with trackingAccess.contactEmpty (blank contact), trackingAccess.verificationFailed (no match: the same answer whether or not the target exists), tooManyRequests with extensions.retryAfter in seconds (5 failed attempts on the target from one client in 15 minutes, which blocks that client for 15 minutes; 20 on the target from any clients in an hour; 10 from the client in 15 minutes; or the client blocked by trackShipment), and trackingAccess.unavailable (verified tracking is switched off). A tracking link with its token still unlocks the view during a refusal.
Response
Returns a TrackingAccessGrant!
Example
Query
mutation VerifyTrackingAccess(
$contact: String!,
$eshopId: ObjectID!,
$shipmentId: ObjectID!
) {
verifyTrackingAccess(
contact: $contact,
eshopId: $eshopId,
shipmentId: $shipmentId
) {
accessToken
expiresAt
}
}
Variables
{
"contact": "abc123",
"eshopId": "5e5677d71bdc2ae76344968c",
"shipmentId": "5e5677d71bdc2ae76344968c"
}
Response
{
"data": {
"verifyTrackingAccess": {
"accessToken": "xyz789",
"expiresAt": "2007-12-03T10:15:30Z"
}
}
}
Types
Address
Fields
| Field Name | Description |
|---|---|
addressLine1 - String
|
Address line 1 (original input). |
addressLine2 - String
|
Address line 2 (original input). |
addressLine3 - String
|
Address line 3 (original input). |
canonicalAddress - CanonicalAddress
|
The geocoder's match for the address. |
city - String
|
City (original input). |
country - String
|
Country (original input). |
countryCode - String
|
Country code in ISO 3166-1 alpha-2 format. |
county - String
|
County (original input). |
postcode - String
|
Postcode (original input). |
Example
{
"addressLine1": "abc123",
"addressLine2": "xyz789",
"addressLine3": "abc123",
"canonicalAddress": CanonicalAddress,
"city": "abc123",
"country": "xyz789",
"countryCode": "abc123",
"county": "abc123",
"postcode": "abc123"
}
AddressBookEntryType
AddressInput
Description
Free text is trimmed. On a shipment update, an absent field keeps the stored value and null or blank clears it; an empty object changes nothing.
Fields
| Input Field | Description |
|---|---|
addressLine1 - String
|
Address line 1. |
addressLine2 - String
|
Address line 2. |
addressLine3 - String
|
Address line 3. |
city - String
|
City. |
country - String
|
Country. |
countryCode - String
|
Country code in ISO 3166-1 alpha-2 format. |
county - String
|
County. |
postcode - String
|
Postcode. |
Example
{
"addressLine1": "xyz789",
"addressLine2": "xyz789",
"addressLine3": "xyz789",
"city": "xyz789",
"country": "xyz789",
"countryCode": "xyz789",
"county": "abc123",
"postcode": "abc123"
}
AddressTypeEnum
Description
Type of address location from Google Places API
Values
| Enum Value | Description |
|---|---|
|
|
Business address (offices, stores, commercial buildings) |
|
|
Mixed-use address (both residential and business) |
|
|
Residential address (homes, apartments) |
Example
"BUSINESS"
AppliedRegionSourceEnum
Values
| Enum Value | Description |
|---|---|
|
|
Free shipping was applied via the rest-of-world fallback deal |
|
|
Free shipping was applied via a named regional rule |
Example
"REST_OF_WORLD"
AuditActorTypeEnum
Description
Which kind of caller performed an audited action.
Values
| Enum Value | Description |
|---|---|
|
|
An authenticated admin user |
|
|
A direct API-key integration (no user, no actor id) |
|
|
An authenticated eshop user |
|
|
The system itself (backfills, automated processes) |
Example
"ADMIN"
Boolean
Description
The Boolean scalar type represents true or false.
BrandAssets
Fields
| Field Name | Description |
|---|---|
logos - BrandLogos
|
Example
{"logos": BrandLogos}
BrandColorScheme
Description
Color scheme for UI theming
Example
{
"accent": "xyz789",
"background": "xyz789",
"primary": "xyz789",
"secondary": "abc123"
}
BrandLogos
CancelShipmentPayload
Description
Result of cancelShipment. Wraps the canceled shipment plus the voucher codes this call killed at the carrier.
Fields
| Field Name | Description |
|---|---|
canceledCodes - [String!]!
|
Voucher codes canceled at the carrier by THIS invocation. Empty for a shipment that never had a label — the ordinary case, since the mutation exists for orders canceled before printing — and empty on the idempotent repeat, so it never claims a cancellation that did not happen. Read shipment.shipmentVoucher and shipment.parcels[i].voucher for the shipment's own voucher state. |
shipment - Shipment!
|
The shipment at status: canceled. Returned on a repeat call too rather than an error, so a caller that lost the first response can converge on the same state instead of retrying forever. |
Example
{
"canceledCodes": ["xyz789"],
"shipment": Shipment
}
CancelVoucherPayload
Description
Result of cancelVoucher. Wraps the updated shipment plus the list of voucher codes the carrier confirmed canceled by this call.
Fields
| Field Name | Description |
|---|---|
canceledCodes - [String!]!
|
Carrier-confirmed voucher codes canceled by this call. For carriers with API integration this is the carrier's exact confirmation list; for non-API carriers it's every active voucher code on the shipment immediately before cancellation. Useful for distinguishing 'just canceled' from 'previously canceled' when auditing. |
shipment - Shipment!
|
The shipment after cancellation. All voucher slots will have status: canceled and shipment.status will be voucher-canceled. trackingDetails is cleared. |
Example
{
"canceledCodes": ["abc123"],
"shipment": Shipment
}
CancellationCapability
Fields
| Field Name | Description |
|---|---|
mode - VoucherCancellationModeEnum!
|
Example
{"mode": "CASCADE"}
CanonicalAddress
Description
The geocoder's match for the address; canonical only when it agrees with the typed country and postcode. Not a pricing input for the destination.
Fields
| Field Name | Description |
|---|---|
addressLine1 - String
|
Canonicalized primary address line. |
addressType - AddressTypeEnum
|
Type of address location (residential, business, mixed) |
city - String
|
Canonicalized city. |
coordinates - Coordinates
|
Geographic coordinates. |
country - String
|
Canonicalized country. |
countryCode - String
|
Canonicalized country code in ISO 3166-1 alpha-2 format. |
county - String
|
Canonicalized county. |
isCanonical - Boolean
|
True when the geocoder's match agrees with the typed country and postcode. |
placeId - String
|
Google Places API unique place identifier for future lookups |
postcode - String
|
Canonicalized postcode. |
Example
{
"addressLine1": "xyz789",
"addressType": "BUSINESS",
"city": "xyz789",
"coordinates": Coordinates,
"country": "abc123",
"countryCode": "xyz789",
"county": "abc123",
"isCanonical": true,
"placeId": "abc123",
"postcode": "xyz789"
}
CarrierConstraintKind
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"WEIGHT"
CarrierOptionTrigger
Description
REQUESTED: the buyer or merchant asks for it. PAYMENT_METHOD: derived from the order. BILLING: derived from a shipment flag.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
Example
"REQUESTED"
CarrierProfileSourceEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
Example
"CODE"
ChargeActor
Fields
| Field Name | Description |
|---|---|
type - AuditActorTypeEnum!
|
|
user - ObjectID
|
Example
{
"type": "ADMIN",
"user": "5e5677d71bdc2ae76344968c"
}
ChargeCarrierProfile
Description
The carrier money profile in force at bind (RC-09's pin).
Fields
| Field Name | Description |
|---|---|
catalog - ObjectID
|
|
source - CarrierProfileSourceEnum!
|
|
version - Int
|
Example
{
"catalog": "5e5677d71bdc2ae76344968c",
"source": "CODE",
"version": 123
}
ChargeEvent
Description
The binding event: when, who, why, and through which operation.
Fields
| Field Name | Description |
|---|---|
actor - ChargeActor!
|
|
at - DateTime!
|
|
atSource - ChargeEventAtSourceEnum!
|
|
id - ObjectID!
|
One per mutation invocation; a retry appends nothing. |
operation - ChargeOperationEnum!
|
|
type - ChargeEventTypeEnum!
|
Example
{
"actor": ChargeActor,
"at": "2007-12-03T10:15:30Z",
"atSource": "AUDIT_ENTRY",
"id": "5e5677d71bdc2ae76344968c",
"operation": "BACKFILL",
"type": "BACKFILL"
}
ChargeEventAtSourceEnum
Description
Where the event instant came from: the request (live), or the checkout instant, an audit entry or the creation instant on a backfilled record.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
Example
"AUDIT_ENTRY"
ChargeEventTypeEnum
Description
Why a record was appended: BIND (first pricing), FINALIZE, RE_RATE, COST_OVERRIDE, RATE_PRICING_PATCH, NO_DELIVERY, CANCEL, CORRECTION, BACKFILL.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"BACKFILL"
ChargeFreeShipping
Example
{
"codFeeBasis": "EX_VAT",
"codFeeCents": 123,
"codFeeVatRate": 123.45,
"configuredCodFeeCents": 123,
"discountCents": 987,
"originalCostCents": 123,
"regionSource": "abc123",
"ruleId": "5e5677d71bdc2ae76344968c",
"ruleName": "xyz789",
"thresholdBasis": "abc123",
"waiveCodFee": true
}
ChargeLegEnum
Description
BUYER: what Pircel bound the buyer to pay for delivery. CARRIER: what Pircel expects the carrier to bill.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
Example
"BUYER"
ChargeLegacy
Description
Present on backfilled records alone: the paths the classification read and, when unattributed, why.
Fields
| Field Name | Description |
|---|---|
evidence - [String!]
|
|
reason - ChargeLegacyReasonEnum
|
Example
{
"evidence": ["abc123"],
"reason": "COPIED_CUSTOMER_COSTS"
}
ChargeLegacyReasonEnum
Description
Why a backfilled record could not be attributed from stored evidence, or what the evidence lacked.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"COPIED_CUSTOMER_COSTS"
ChargeLine
Description
One itemised share of the record's amount, on the record's basis. The lines sum to amountCents exactly.
Fields
| Field Name | Description |
|---|---|
allocation - ChargeLineAllocationEnum!
|
|
amountCents - Int!
|
|
code - String
|
|
lineType - ChargeLineTypeEnum!
|
|
name - String
|
|
netCents - Int
|
Ex-VAT share; null when the basis is unknown. |
surchargeType - SurchargeType
|
|
taxCents - Int
|
VAT share; null when the basis is unknown; 0 on a carrier record. |
Example
{
"allocation": "DERIVED",
"amountCents": 123,
"code": "xyz789",
"lineType": "ADJUSTMENT",
"name": "abc123",
"netCents": 123,
"surchargeType": "ADDITIONAL_HANDLING",
"taxCents": 987
}
ChargeLineAllocationEnum
Description
STATED when the producer priced the line itself; DERIVED when it is a split of a total the pipeline computed as one number (the floor and increment residual lands on the delivery line).
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
Example
"DERIVED"
ChargeLineTypeEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"ADJUSTMENT"
ChargeOperationEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"BACKFILL"
ChargeOrder
Description
The order context at bind, so the charge is explainable without the shipment’s current state.
Fields
| Field Name | Description |
|---|---|
basis - VatBasis
|
|
basisContradiction - Boolean
|
True when the order's basis signal disagreed with the eshop's declared basis at bind; the order's signal won. |
basisSource - OrderBasisSourceEnum
|
|
billableWeightKg - Float
|
|
codFeeUnchargedCents - Int
|
On a buyer RE_RATE after booking: the cash-on-delivery fee of the new quote that this charge does not take, on the record’s basis (net on EX_VAT, gross otherwise). Pircel never raises a booked charge on its own; the store restating its order money is what would. Null on every other record. |
destinationCountryCode - String
|
|
destinationPostcode - String
|
|
optionsCharged - TaxedMoney
|
The requested options' part of this record's amount, as TaxedMoney on the record's basis: set at bind from the selected rate's Costs.optionsCharge and carried forward on a re-rate. Null when the charge priced no requested option. |
optionsUnchargedCents - Int
|
On a buyer RE_RATE after a placed shipment's requested options changed: their price in the re-priced quote that this charge does not take, on the record's basis (net on EX_VAT, gross otherwise), as the quote's Costs.optionsCharge less optionsCharged, never below 0. Carried forward by later re-rates; null on every other record. Pircel never raises a booked charge on its own; the buyer pays it only if the order's money (orderAmounts) says so. |
parcelCount - Int
|
|
paymentMethod - String
|
|
storeCodFeeDoubled - Boolean
|
True when the platform charged its own COD fee on top of a shipping total that already covered this price (F-68); informational, nothing was blocked. |
Example
{
"basis": "EX_VAT",
"basisContradiction": true,
"basisSource": "ESHOP_DEFAULT",
"billableWeightKg": 123.45,
"codFeeUnchargedCents": 987,
"destinationCountryCode": "xyz789",
"destinationPostcode": "xyz789",
"optionsCharged": TaxedMoney,
"optionsUnchargedCents": 987,
"parcelCount": 987,
"paymentMethod": "xyz789",
"storeCodFeeDoubled": false
}
ChargeOverride
Fields
| Field Name | Description |
|---|---|
requested - ChargeOverrideRequested
|
The admin's raw costOverride input, euros as sent. |
Example
{"requested": ChargeOverrideRequested}
ChargeOverrideRequested
ChargePatch
Description
An admin repricing: components is the itemisation it produced and the next repricing starts from; supplied what the admin sent. The quote on selectedRate is untouched once the ledger is exclusive.
Fields
| Field Name | Description |
|---|---|
components - [PricingComponent!]
|
|
supplied - [PricingComponent!]
|
Example
{
"components": [PricingComponent],
"supplied": [PricingComponent]
}
ChargePlatform
Description
The platform's shipping figure at bind and its divergence from ours on a like basis.
Example
{
"divergenceCents": 123,
"pricesIncludeTax": true,
"shippingTaxCents": 987,
"shippingTotalCents": 123
}
ChargeQuote
Description
The quote the record came from, copied by value at bind: the next fan-out overwrites the quote, the record keeps it.
Fields
| Field Name | Description |
|---|---|
costsDigest - String
|
|
deliveryCompany - ObjectID
|
|
finalPrice - Float
|
As quoted, euros, verbatim. |
fulfillmentType - FulfillmentType
|
|
priceProvenance - PriceSourceEnum
|
|
quotedAt - DateTime
|
|
serviceCode - String
|
|
serviceId - ObjectID
|
|
serviceName - String
|
|
vatBasis - VatBasis
|
|
vatRate - Float
|
Example
{
"costsDigest": "abc123",
"deliveryCompany": "5e5677d71bdc2ae76344968c",
"finalPrice": 123.45,
"fulfillmentType": "CARRIER",
"priceProvenance": "ADMIN",
"quotedAt": "2007-12-03T10:15:30Z",
"serviceCode": "xyz789",
"serviceId": "5e5677d71bdc2ae76344968c",
"serviceName": "abc123",
"vatBasis": "EX_VAT",
"vatRate": 987.65
}
ChargeSourceEnum
Description
Where the money came from. Buyer: SERVER_QUOTE, CLIENT_QUOTE, FREE_SHIPPING, COST_OVERRIDE, RATE_PRICING_PATCH, NO_DELIVERY, UNPRICED, CANCELLED (the shipment was cancelled: 0, superseding the charge, which stays readable in supersededCharge), LEGACY_UNATTRIBUTED. Carrier: TARIFF, CARRIER_API, NO_AGREEMENT (a carrier selected after booking that Pircel holds no agreement with: 0 on an UNKNOWN basis, no bill expected), CANCELLED, LEGACY_UNATTRIBUTED.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"CANCELLED"
ChargeStoreFreeShipping
Description
The store's own free shipping on the buyer record it priced (source SERVER_QUOTE). A Pircel rule's record states freeShipping and source FREE_SHIPPING instead.
Example
{"codFeeWaived": true, "label": "xyz789"}
ChargeVat
Fields
| Field Name | Description |
|---|---|
ratePercent - Float
|
|
rateSource - ChargeVatRateSourceEnum
|
|
taxPointDate - DateTime
|
Example
{
"ratePercent": 987.65,
"rateSource": "CARRIER_RESPONSE",
"taxPointDate": "2007-12-03T10:15:30Z"
}
ChargeVatRateSourceEnum
Description
Where a charge's VAT rate came from. SERVER: stated by Pircel's pricing on a quote that recorded no trace, so whether the tariff or the carrier gave it is not known. CLIENT: stated by the client with its price.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"CARRIER_RESPONSE"
CheckoutDefaultSelectionEnum
Values
| Enum Value | Description |
|---|---|
|
|
Pre-select the pinned default carrier, or the first rate by sort order when none is pinned |
|
|
No server-side pre-selection; the buyer chooses a rate |
Example
"AUTO"
CodCollectible
Description
What the courier would be told to collect if the label were minted now, and how that was determined. Resolved server-side through the single accessor every carrier adapter uses — do not re-implement the fallback ladder client-side. On a shipment whose label already exists this is a LIVE figure and can differ from the printed one: read codDeclaration for what the courier will actually ask for.
Fields
| Field Name | Description |
|---|---|
amount - Float
|
The amount to collect. Set only when status is RESOLVED; null otherwise. A null here is never a zero. |
source - CodCollectibleSourceEnum
|
Which figure answered. Null when nothing was resolved. DERIVED_COST_SUMMARY means the figure is an estimate, not the platform's own number. |
status - CodCollectibleStatusEnum!
|
Distinguishes "not COD", "COD but nothing to collect" and "we could not tell" — all three of which would otherwise render as 0. |
Example
{"amount": 987.65, "source": "AMOUNT_DUE", "status": "NOT_COD"}
CodCollectibleSourceEnum
Description
Which figure the collectible was taken from.
Values
| Enum Value | Description |
|---|---|
|
|
orderAmounts.amountDue — what the platform says remains to be paid.
|
|
|
Pircel's own costSummary estimate, used only when the shipment carries no platform totals at all (pre-contract and CSV-imported orders). Discount-blind — treat as an estimate. |
|
|
orderAmounts.grandTotal — the platform total, used when no amountDue was sent. On a partly-prepaid order this over-states what is actually owed.
|
Example
"AMOUNT_DUE"
CodCollectibleStatusEnum
Description
Whether a COD collectible could be resolved, and to what.
Values
| Enum Value | Description |
|---|---|
|
|
The order is not cash-on-delivery; nothing is collected. |
|
|
A COD order the platform states is already fully paid (a verbatim amountDue of 0). The voucher takes the non-COD path. |
|
|
An amount was resolved; amount and source are set. |
|
|
A COD order carrying no usable total. Voucher creation fails closed rather than shipping a label that collects nothing — do NOT render this as 0. |
Example
"NOT_COD"
CodDeclaration
Description
What the carrier was told to collect, frozen when the label was minted. Stored, never recomputed: this is the number the courier will ask for even if the order has changed since. Absent on shipments with no live label, and on shipments vouchered before declarations were recorded — in both cases fall back to codCollectible.
Fields
| Field Name | Description |
|---|---|
amount - Float!
|
The COD amount printed on the label. |
currency - String
|
Currency the amount was declared in. Null when it came from the legacy costSummary rung, which predates any stated currency. |
declaredAt - DateTime!
|
When the label carrying this amount was minted. |
source - CodCollectibleSourceEnum!
|
Which figure the printed amount came from. DERIVED_COST_SUMMARY on a discounted order means the label was priced before discounts. |
voucherCodes - [String!]
|
The voucher codes issued alongside this declaration. |
Example
{
"amount": 123.45,
"currency": "abc123",
"declaredAt": "2007-12-03T10:15:30Z",
"source": "AMOUNT_DUE",
"voucherCodes": ["xyz789"]
}
ColorScheme
ConnectionStatus
Values
| Enum Value | Description |
|---|---|
|
|
Store connection is active and working |
|
|
The store or a merchant disconnected it. Terminal like RETIRED: its credentials and hint secret are gone and its key no longer works, but it stays listed, and on the shipments that record it, so a reconnect or a data request still finds the store. A reconnect is a new connection. |
|
|
Store connection has an error |
|
|
A new installation of the same store replaced this connection. Terminal: it stays listed, and on the shipments that record it, but is never used, refreshed or stated again. |
|
|
Store connection has been revoked |
Example
"ACTIVE"
Contact
Example
{
"companyName": "abc123",
"email": "xyz789",
"firstname": "xyz789",
"lastname": "abc123",
"phone": "xyz789"
}
ContactInput
Description
Free text is trimmed and the email lower-cased. On a shipment update, an absent field keeps the stored value and null or blank clears it; an empty object changes nothing. A placed shipment names its recipient (first and last name, or company), else shipmentInput.required.
Fields
| Input Field | Description |
|---|---|
companyName - String
|
Company name. Either company name OR first and last name is required. |
email - String
|
Email address. |
firstname - String
|
First name. Either first and last name OR company name is required. |
lastname - String
|
Last name. Either first and last name OR company name is required. |
phone - String
|
Phone number. |
Example
{
"companyName": "abc123",
"email": "abc123",
"firstname": "abc123",
"lastname": "abc123",
"phone": "xyz789"
}
CookieConsentAction
Description
How a visitor gave their cookie choice.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
Their own selection, saved. |
Example
"ACCEPT_ALL"
CookieConsentRecordInput
Fields
| Input Field | Description |
|---|---|
action - CookieConsentAction!
|
|
analytics - Boolean!
|
Whether analytics were allowed. |
consentId - ID!
|
The random UUID v4 the browser made at the visitor's first choice and keeps in its consent cookie. |
policyVersion - String!
|
The cookie policy version the choice was made under, YYYY-MM-DD. |
Example
{
"action": "ACCEPT_ALL",
"analytics": true,
"consentId": 4,
"policyVersion": "abc123"
}
CookieConsentRecordPayload
Fields
| Field Name | Description |
|---|---|
recordedAt - DateTime!
|
When Pircel's server recorded the choice. |
Example
{"recordedAt": "2007-12-03T10:15:30Z"}
Coordinates
CostSummary
Description
Pircel's OWN view of the order: catalog product prices plus the delivery rate Pircel quoted. It is NOT the buyer's money and it is not the platform's total — it knows nothing about coupons, store fees, gift cards, or what the storefront actually charged for shipping (those live on orderAmounts). Frozen once checkout completes, so on an order edited afterwards it can disagree with products. For what the courier collects, read Shipment.codCollectible.
Fields
| Field Name | Description |
|---|---|
deliveryCostCents - Int
|
What Pircel charged for delivery, in integer cents: the quoted rate including surcharges, taxes and the eshop multiplier. The storefront may have charged the buyer something else — that is orderAmounts.shippingTotal. |
productsTotalCents - Int
|
Sum of catalog line prices (price × quantity) as sent, in integer cents. PRE-discount: per-line lineDiscount/lineTotal and order-level discountTotal are not subtracted here. |
totalCostCents - Int
|
productsTotalCents + deliveryCostCents, on the basis the eshop prices in. Not the order total the buyer paid — no discount, fee or tender is applied.
|
deliveryAmount - TaxedMoney
|
deliveryCostCents as TaxedMoney, stated on the order’s basis (vatDetails.valueAddedTaxIncluded), with its net, tax and gross derived server-side at vatRate. Replaces grossing deliveryCostCents by vatRate in the client. With no rate, the stated figure is its own leg alone (grossCents on an inclusive order, netCents on a net one). Only statedCents when the order states no basis, or when a charged delivery leg is one the summary carries unconverted because its basis is unknown: the selected rate’s own price on an unknown basis, a bound charge that states none, or a free-shipping fee whose snapshot records no basis. A fee that records one is on the order’s basis. The delivery charge as the ledger bound it, at its own rate, is Shipment.charge.buyer.
|
productsAmount - TaxedMoney
|
productsTotalCents as TaxedMoney, stated on the order’s basis (vatDetails.valueAddedTaxIncluded), with its net, tax and gross derived server-side at vatRate. Replaces grossing productsTotalCents by vatRate in the client. With no rate, the stated figure is its own leg alone (grossCents on an inclusive order, netCents on a net one). Only statedCents when the order states no basis. The order’s one rate over all the products, not any line’s own.
|
totalAmount - TaxedMoney
|
totalCostCents as TaxedMoney, stated on the order’s basis (vatDetails.valueAddedTaxIncluded), with its net, tax and gross derived server-side at vatRate. Replaces grossing totalCostCents by vatRate in the client. With no rate, the stated figure is its own leg alone (grossCents on an inclusive order, netCents on a net one). Only statedCents when the order states no basis, or when its delivery leg is on an unknown basis (see deliveryAmount). Derived once from the stored total, so its gross can differ by a cent from the sum of the two legs’ grosses. For what the courier collects, read Shipment.codCollectible.
|
vatRate - Float
|
The VAT rate (percent) that applies to the order. On a net-priced order it is the rate totalAmount grosses totalCostCents at. Under the law it is recorded on every order, VAT-inclusive ones included (where no uplift is applied); under legacy an inclusive order records none. Its presence does not say the order is net-priced — read vatDetails.valueAddedTaxIncluded. It is ONE rate for the whole order, resolved from the place of supply (the buyer, or the store for a collection) — not the rate of any individual line, and not the rate of the delivery leg, whose own basis is selectedRate.costs.vatBasis. |
Example
{
"deliveryCostCents": 123,
"productsTotalCents": 987,
"totalCostCents": 123,
"deliveryAmount": TaxedMoney,
"productsAmount": TaxedMoney,
"totalAmount": TaxedMoney,
"vatRate": 987.65
}
Costs
Description
Cost breakdown for a service, in integer cents. finalPriceCents is the charge on its vatBasis, except under an applied storeFreeShipping, where it stays the rate as quoted and charge is what the buyer pays; and the basis VARIES BETWEEN RATES IN ONE RESPONSE. Read the money from charge, deliveryCharge and codFee (TaxedMoney): the server states the net, tax and gross of each, so no client derives them. A rate whose basis is UNKNOWN publishes only charge.statedCents: its net is not derivable, and a platform that must post a net drops the rate rather than guess.
Every other figure here is a partial, producer-dependent itemisation drawn from a different stage of the pipeline — carrier truth, Pircel’s pre-multiplier net tariff, or the final gross — and which stage a field belongs to depends on which producer built the rate, which this object does not say. No combination of them reconstructs finalPriceCents: the multiplier, the minimum-price floor and the rounding increment land after the itemised legs and appear in none of them. Read a field for what it is; never reconcile a sum against the charge.
Fields
| Field Name | Description |
|---|---|
basePriceCents - Int
|
Net, pre-multiplier, and producer-dependent: the carrier tariff base on a tariff rate, the carrier’s own base on FedEx. Not a share of finalPriceCents. |
codSurchargeCents - Int
|
The cash-on-delivery fee, ALWAYS STATED NET — even when vatBasis says every other amount here is gross. It is the one exception to this object's single-basis rule. ⚠️ WHOSE fee it is depends on which object you are reading, because this type is used for two different things: on selectedRate.costs it is the BUYER's fee before the merchant's markup; on selectedRate.negotiatedCosts it is what the CARRIER bills the MERCHANT, and has nothing to do with what the buyer pays. Never add the two, and never add either to freeShipping.codFeeCharged. ⚠️ It is inside surchargesTotalCents, never beside it: adding the two double-counts the fee. ⚠️ There is NO formula that recovers the buyer's fee from it: read codFee. Zero or absent when the rate was not quoted for cash on delivery. |
finalPriceCents - Int
|
Final price after all fees, surcharges and taxes with multiplier and minimum price constraints applied, on vatBasis. Under an applied storeFreeShipping it stays the rate as quoted; the buyer pays charge. |
surchargesTotalCents - Int
|
Net, pre-multiplier: every surcharge line of the rate, the COD fee included. codSurchargeCents is inside it, never beside it: adding the two double-counts the COD fee. |
taxesAndDutiesTotalCents - Int
|
The CARRIER's own itemised tax and duty at quote time. Structurally 0 on every tariff carrier and on UPS, so a 0 here is not evidence that no tax applies. NOT disjoint from vatAmountCents: on FedEx, the only producer that states a real figure, the VAT inside this IS that field — summing the two counts the same money twice. |
totalPriceBeforeMultiplierCents - Int
|
Subtotal before the multiplier, VAT, floor and rounding are applied. On vatBasis-tagged rates this is the EX-VAT subtotal; rates built before the net pipeline may include VAT here. |
vatAmountCents - Int
|
VAT contained in finalPriceCents (when vatBasis is inc-vat) — derived from the final, multiplier-scaled gross on net-pipeline rates. 0 on ex-vat rates. On a rate Pircel priced, a stated 0 is an answer, not an absence. Read charge.taxCents rather than this. |
charge - TaxedMoney
|
The charge as TaxedMoney: finalPriceCents on its own basis, with its net, tax and gross. On a bound selectedRate it is the bound charge whole (Shipment.charge.buyer): its amount on its basis at its rate, so statedCents can differ from finalPriceCents. Under an applied storeFreeShipping it is the grant-priced charge. Null only when the rate carries no price. |
codFee - TaxedMoney
|
The cash-on-delivery part of the charge as TaxedMoney, on the same basis as charge, so deliveryCharge and codFee sum to charge exactly. It is the fee as priced, never floored or rounded: the minimum price and the rounding increment land on deliveryCharge, so neither leg is the COD price minus the card price. 0 when the charge carries no COD fee (on selectedRate.costs of a booked shipment, the bound charge: a COD state reached after booking is not charged, see ChargeOrder.codFeeUnchargedCents), null when the legs are not derivable. |
currencyCode - CurrencyCode!
|
ISO 4217 currency of every amount on this object. Always EUR, and not a default that can be overridden: tariffs are constructed in euros and the API carriers reject a non-EUR rate rather than converting it. Stated explicitly so an integration whose store is based in another currency can detect the mismatch and refuse, rather than rendering a euro figure under its own symbol. |
deliveryCharge - TaxedMoney
|
The delivery part of the charge as TaxedMoney, on the same basis as charge; null when the legs are not derivable. It absorbs the minimum-price floor and the rounding increment, which belong to no line, so it can exceed the delivery share a client would compute. ⚠️ Under free shipping the buyer pays freeShipping.codFeeCharged, not these legs. |
optionsCharge - TaxedMoney
|
The requested options' part of charge, as the rate prices them before any free shipping: each option's lines at the rate's multiplier, with their share of the charge's own tax, on charge's basis. Inside deliveryCharge, never beside it. Informational: on a booked shipment the buyer was charged ChargeOrder.optionsCharged. Null when the rate prices no requested option, and on negotiatedCosts. |
priceMultiplier - Float
|
Multiplier applied to the price |
storeFreeShipping - RateStoreFreeShipping
|
The store's own free shipping on this rate: null when the shipment has no grant, applied: false when a Pircel free-shipping rule took precedence, applied: true when the grant priced it. Post-grant, here and on SelectedRate.costs: charge, deliveryCharge and codFee; delivery is 0 and charge equals codFee, which is 0 unless Eshop.storeFreeShippingCodFee is CHARGE. As quoted, as under a Pircel rule: finalPriceCents, vatAmountCents, codSurchargeCents, basePriceCents, surchargesTotalCents, totalPriceBeforeMultiplierCents, priceComponents and pricingTrace. Always null on negotiatedCosts. |
vatBasis - VatBasis
|
Whether finalPriceCents contains VAT. The answer VARIES WITHIN ONE RESPONSE, by the producer that built the rate: the tariff engine states the order’s basis, and an API carrier states what its response proves — UNKNOWN when it proves nothing (a UPS response without its tax block). Absent on rates built before the taxation module. Do not read absent or UNKNOWN as EX_VAT: an amount whose basis is unstated is not comparable with one whose basis is stated. ⚠️ It governs finalPriceCents and the totals beside it, NOT every field on this object: codSurchargeCents is stated net regardless of what this says. |
vatRate - Float
|
VAT rate (percent) applied to this quote at build time; vatBasis says whether finalPriceCents contains it. Absent when the rate source exposed no rate, and never a substitute for vatBasis. Read the rate as charge.ratePercent and the net as charge.netCents; never derive either from finalPriceCents and this rate. |
Example
{
"basePriceCents": 123,
"codSurchargeCents": 987,
"finalPriceCents": 123,
"surchargesTotalCents": 987,
"taxesAndDutiesTotalCents": 987,
"totalPriceBeforeMultiplierCents": 123,
"vatAmountCents": 987,
"charge": TaxedMoney,
"codFee": TaxedMoney,
"currencyCode": "EUR",
"deliveryCharge": TaxedMoney,
"optionsCharge": TaxedMoney,
"priceMultiplier": 123.45,
"storeFreeShipping": RateStoreFreeShipping,
"vatBasis": "EX_VAT",
"vatRate": 987.65
}
CostsInput
Description
Input for cost breakdown. Every amount is a stated amount: 0 to 1,000,000 with at most 2 decimals, else shipmentInput.invalidNumber; priceMultiplier is a factor and may not be negative.
Fields
| Input Field | Description |
|---|---|
basePrice - Float
|
Base price before any surcharges, fees, or taxes |
codSurcharge - Float
|
The cash-on-delivery fee you are echoing back, NET — the basis the server quoted it on, whatever vatBasis says about finalPrice. Send it as it was quoted rather than converting it to match the price beside it: a grossed-up value here reads as a larger fee than the one the buyer was shown. |
finalPrice - Float
|
Final price after all fees, surcharges and taxes with multiplier and minimum price constraints applied |
priceMultiplier - Float
|
Multiplier applied to the price |
surchargesTotal - Float
|
Total of all surcharges |
taxesAndDutiesTotal - Float
|
Stored verbatim. Do not restate VAT you have already put in vatAmount — the two are not summed, and a reader that took the larger of them would silently drop the smaller. |
totalPriceBeforeMultiplier - Float
|
Subtotal before the multiplier, VAT, floor and rounding are applied. On vatBasis-tagged rates this is the EX-VAT subtotal; rates built before the net pipeline may include VAT here. |
vatAmount - Float
|
VAT contained in finalPrice (when vatBasis is inc-vat) — derived from the final, multiplier-scaled gross on net-pipeline rates. 0 on ex-vat rates. |
vatBasis - VatBasis
|
Whether the finalPrice you are sending contains VAT. Optional so the plugins already in the field keep working (BE-14), but send it: an untagged price is carried as stated with its VAT position unknown — it joins the order total unconverted and binds a charge with no net. |
Example
{
"basePrice": 987.65,
"codSurcharge": 123.45,
"finalPrice": 987.65,
"priceMultiplier": 987.65,
"surchargesTotal": 123.45,
"taxesAndDutiesTotal": 123.45,
"totalPriceBeforeMultiplier": 123.45,
"vatAmount": 987.65,
"vatBasis": "EX_VAT"
}
CreatePickupListReturn
Fields
| Field Name | Description |
|---|---|
lists - [PickupListsList]
|
Example
{"lists": [PickupListsList]}
CreateVoucherPayload
Description
Result of createVoucher. Wraps the updated shipment plus the flat list of voucher codes the carrier issued. Future revisions may add structured warnings (e.g. for a failed customer email notification) without breaking clients.
Fields
| Field Name | Description |
|---|---|
createdCodes - [String!]!
|
Voucher codes the carrier issued in this invocation, in stable order (shipment-level first, then per-parcel) and de-duped (UPS emits the master tracking number as both the shipment-level voucher and the first parcel's code). Empty on the idempotent 'already-created' short-circuit, so createdCodes.length === 0 distinguishes a fresh creation from a no-op. |
shipment - Shipment!
|
The shipment with its voucher state freshly populated. Read shipmentVoucher, parcels[i].voucher, unassociatedVouchers, and otherDocuments for the carrier-issued data. |
Example
{
"createdCodes": ["xyz789"],
"shipment": Shipment
}
CredentialField
Fields
| Field Name | Description |
|---|---|
isRequired - Boolean!
|
|
isSecret - Boolean
|
|
key - String!
|
|
label - String!
|
|
type - CredentialFieldTypeEnum!
|
Example
{
"isRequired": true,
"isSecret": true,
"key": "xyz789",
"label": "abc123",
"type": "ACCOUNT"
}
CredentialFieldTypeEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
Example
"ACCOUNT"
CredentialTransport
Values
| Enum Value | Description |
|---|---|
|
|
Credentials are sent in the HTTP Authorization header. |
|
|
Credentials are sent as query-string parameters, for stores whose web server does not pass the Authorization header through to the platform. |
Example
"HEADER"
CurrencyCode
Description
ISO 4217 three-letter currency code.
Values
| Enum Value | Description |
|---|---|
|
|
Example
"EUR"
CustomizationExtensions
Description
Extension point for future customization features
Fields
| Field Name | Description |
|---|---|
_placeholder - Boolean
|
Placeholder field for future extensions |
Example
{"_placeholder": false}
Date
Description
A date string, such as 2007-12-03, compliant with the full-date format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.
Example
"2007-12-03"
DateTime
Description
A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the date-time format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.
Example
"2007-12-03T10:15:30Z"
DeliveryCompany
Fields
| Field Name | Description |
|---|---|
_id - ID!
|
|
acceptedPaymentMethods - [ShipmentPaymentMethodEnum!]!
|
Payment methods this carrier can offer the end customer. Cash-on-delivery is carrier-dependent; card/PayPal/bank-deposit are merchant-gateway methods and may be listed for completeness. |
capabilities - DeliveryCompanyCapabilities
|
Per-carrier behavior matrix: multi-piece support, cancellation cascade mode, per-piece tracking, where customer references are accepted. |
createdAt - DateTime!
|
|
credentialFields - [CredentialField!]!
|
|
defaultConfig - DeliveryCompanyDefaultConfig!
|
|
description - String
|
|
hasAction - Boolean!
|
|
Arguments
|
|
hasApiIntegration - Boolean!
|
|
internalOnly - Boolean!
|
|
isEnabled - Boolean!
|
|
isVisibleAtCheckout - Boolean!
|
|
logo - Logo
|
|
minimumWeight - Float!
|
|
name - String!
|
|
pickupTimeOptions - PickupTimeOptions!
|
|
services - [DeliveryCompanyService!]!
|
All services the carrier offers. Each entry includes the carrier-prescribed code and its human-readable display name. |
slug - String!
|
|
supportedActions - [DeliveryCompanyApiActionEnum!]!
|
|
supportsFuelSurcharge - Boolean!
|
Whether an eshop can set a fuel surcharge on this carrier: true when Pircel prices it from a tariff, false when the carrier's own rating API does (its quote already includes its fuel surcharge). |
tags - [String!]!
|
|
trackingUrlInformation - TrackingUrlInformation
|
|
updatedAt - DateTime!
|
|
usesAccountShipperAddress - Boolean!
|
|
Example
{
"_id": "4",
"acceptedPaymentMethods": ["AFTERPAY_CLEARPAY"],
"capabilities": DeliveryCompanyCapabilities,
"createdAt": "2007-12-03T10:15:30Z",
"credentialFields": [CredentialField],
"defaultConfig": DeliveryCompanyDefaultConfig,
"description": "xyz789",
"hasAction": true,
"hasApiIntegration": true,
"internalOnly": false,
"isEnabled": false,
"isVisibleAtCheckout": false,
"logo": Logo,
"minimumWeight": 987.65,
"name": "abc123",
"pickupTimeOptions": PickupTimeOptions,
"services": [DeliveryCompanyService],
"slug": "abc123",
"supportedActions": ["CANCEL_VOUCHER"],
"supportsFuelSurcharge": false,
"tags": ["xyz789"],
"trackingUrlInformation": TrackingUrlInformation,
"updatedAt": "2007-12-03T10:15:30Z",
"usesAccountShipperAddress": true
}
DeliveryCompanyApiActionEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"CANCEL_VOUCHER"
DeliveryCompanyCapabilities
Description
Per-carrier capability matrix that downstream code branches on for cancellation cascade, multi-piece UI gating, reference-stamping, and parcel-identity round-tripping.
Fields
| Field Name | Description |
|---|---|
cancellation - CancellationCapability!
|
|
multiPiece - MultiPieceCapability!
|
|
parcelIdentityMode - ParcelIdentityModeEnum!
|
How a returned voucher round-trips back to the originating parcel. Drives webhook / callback handler behaviour: 'piece-id' uses parcelVoucher.deliveryCompanyPieceId, 'positional' uses the parcel index, 'none' means no per-piece identity exists. |
perPieceTracking - Boolean!
|
Whether the carrier returns a distinct tracking number per parcel. |
referenceScope - VoucherCapabilityScopeEnum!
|
Where the carrier accepts the customer reference fields we send. |
Example
{
"cancellation": CancellationCapability,
"multiPiece": MultiPieceCapability,
"parcelIdentityMode": "NONE",
"perPieceTracking": true,
"referenceScope": "BOTH"
}
DeliveryCompanyCredentialState
Description
One credential the carrier declares. A secret's value is never readable; a field the carrier flags isSecret: false (an account identifier) reads back.
Fields
| Field Name | Description |
|---|---|
isSet - Boolean!
|
Whether a value is stored. |
key - String!
|
|
updatedAt - DateTime
|
When it was last set or cleared through updateDeliveryCompanyCredentials. Null when never set, or stored before that mutation existed. |
value - String
|
The stored value, only for a field the carrier flags isSecret: false; null for a secret, an unflagged field, or one that is not set. |
Example
{
"isSet": false,
"key": "abc123",
"updatedAt": "2007-12-03T10:15:30Z",
"value": "xyz789"
}
DeliveryCompanyDefaultConfig
DeliveryCompanyIDOrSlugInput
DeliveryCompanyService
Description
A carrier-prescribed service: the carrier's internal code and its human-readable display name.
Fields
| Field Name | Description |
|---|---|
code - String!
|
Carrier-specific service identifier (e.g. "FEDEX_GROUND", "65"). This is the value to use when calling the carrier API or when configuring an eshop's enabled services. |
name - String!
|
Human-readable display name for the service (e.g. "FedEx Ground", "UPS Worldwide Saver"). Falls back to code if the service is not in our catalog. |
Example
{
"code": "abc123",
"name": "abc123"
}
DeliveryRate
Description
Available rates for a delivery company with all available service options
Fields
| Field Name | Description |
|---|---|
deliveryCompany - DeliveryCompany
|
Delivery company providing this rate |
error - String
|
Why this carrier produced no rate. Two kinds of answer share this field. deliveryCompany.disabled, deliveryCompany.doesNotSupportRateFetching, deliveryCompany.notAvailableForShipmentConfiguration, carrierProfile.notPublished (the carrier has no published service catalogue) and rate.optionsRefused (with its refusals) are PRE-FILTERS: the carrier was never asked, so they say nothing about whether it could have priced this destination. Anything else is the pricing engine's or the carrier's own answer to a real request, except two that say nothing about the destination either: deliveryCompany.timeout, the carrier was asked but did not answer in time (15 s, or 3 s on a checkout quote not yet placed, with no order), and deliveryCompany.unreachable, the carrier could not be reached or answered with a server error, or is failing and is not being asked for now. The checks are first-match-wins, so a pre-filter reason masks whatever the carrier would have said. |
quotedAt - DateTime
|
When this carrier quote was fetched. Absent on fan-outs persisted before the stamp existed. |
rating - Float
|
Rating of the delivery company |
refusals - [RateRefusal!]
|
Why the request's options ruled out this carrier or some of its products; absent when nothing was refused. |
services - [Service]
|
Available services from this carrier |
Example
{
"deliveryCompany": DeliveryCompany,
"error": "abc123",
"quotedAt": "2007-12-03T10:15:30Z",
"rating": 123.45,
"refusals": [RateRefusal],
"services": [Service]
}
DistanceSalesTaxationEnum
Description
Where the eshop's intra-EU distance sales of goods are taxed, as its accountant attests (VAT Directive Art 33(a), Art 59c). One-Stop Shop registration does not choose this; it is a filing scheme.
Values
| Enum Value | Description |
|---|---|
|
|
At the buyer's member state's rate: above the EUR 10 000 threshold, or by the seller's election. |
|
|
At the establishment's rate: for a seller whose intra-EU distance sales stay at or below EUR 10 000 in the current and the preceding calendar year. |
Example
"DESTINATION"
DocumentUploadEligibility
Description
Whether a shipment can take a document upload, and why not when it cannot.
Fields
| Field Name | Description |
|---|---|
available - Boolean!
|
Whether the upload endpoint would accept a document. |
reason - String
|
Null when available. Otherwise the very error code POST /shipments/:shipmentId/documents would answer with for this shipment, so a client renders one message whether the control was hidden or the request refused. |
Example
{"available": false, "reason": "xyz789"}
Eshop
Fields
| Field Name | Description |
|---|---|
_id - ObjectID
|
|
address - String
|
|
addressBook - [AddressBookEntryType]
|
|
bookingsBlockedByPolicy - Boolean!
|
Whether a policy version this eshop deferred is past its deadline unaccepted: new shipments and labels are then refused with policy.acceptanceRequired. |
brandAssets - BrandAssets
|
|
city - String
|
|
deliveryCompanies - [EshopDeliveryCompany]
|
|
Arguments
|
|
freeShipping - FreeShippingConfig
|
Free shipping promotion configuration |
general - GeneralConfig
|
General eshop settings |
merchantNotices - [MerchantNoticeRecord!]!
|
When each version of a text Pircel supplies to merchants was shown, copied, dismissed and emailed to this eshop, newest version first. Empty for a key or a service. |
name - String
|
|
packageInsurance - Float
|
|
pageCustomization - PageCustomization
|
|
phone - String
|
|
policyAcceptances - [PolicyAcceptance!]!
|
The policy versions this eshop's users accepted, newest first; the record of which version binds the account. Empty for a key or a service. |
postcode - String
|
|
pricingEtag - String
|
Changes whenever anything Pircel holds that decides this eshop's quoted prices or offered rates changes: its carrier settings, free shipping, tax profile and addresses, the carriers' records, the tariffs and VAT rates in force, and the pricing code and configuration of the running release. It does not change when a live-rated carrier (FedEx, UPS) changes its own prices. An opaque entity tag (RFC 9110): compare for equality only; never parse or order it. A cached quote whose Shipment.pricingEtag differs from it is stale. Null when it cannot be computed now. |
retentionHold - RetentionHold
|
An admin's hold on the eshop's records against retention's deletions; admin only, null for anyone else. |
securityValue - Float
|
|
slug - String
|
|
storeConnections - [StoreConnection]
|
|
storeFreeShippingCodFee - StoreFreeShippingCodFee!
|
Who pays the cash-on-delivery fee when a rate request states storeFreeShipping.granted and no Pircel free-shipping rule applies; a Pircel rule that applies wins. WAIVE by default. Set it with updateEshopSettings under freeShipping. |
taxProfile - TaxProfile
|
How VAT is resolved for the charges Pircel prices, and the accountant-confirmed facts law mode needs. READ-ONLY, deliberately — see the type description. |
Example
{
"_id": "5e5677d71bdc2ae76344968c",
"address": "abc123",
"addressBook": [AddressBookEntryType],
"bookingsBlockedByPolicy": true,
"brandAssets": BrandAssets,
"city": "abc123",
"deliveryCompanies": [EshopDeliveryCompany],
"freeShipping": FreeShippingConfig,
"general": GeneralConfig,
"merchantNotices": [MerchantNoticeRecord],
"name": "xyz789",
"packageInsurance": 987.65,
"pageCustomization": PageCustomization,
"phone": "abc123",
"policyAcceptances": [PolicyAcceptance],
"postcode": "xyz789",
"pricingEtag": "xyz789",
"retentionHold": RetentionHold,
"securityValue": 123.45,
"slug": "abc123",
"storeConnections": [StoreConnection],
"storeFreeShippingCodFee": "CHARGE",
"taxProfile": TaxProfile
}
EshopAuthConfig
Fields
| Field Name | Description |
|---|---|
addressBookEntry - ObjectID
|
Reference to an address book entry from the Eshop address book. |
credentials - [DeliveryCompanyCredentialState!]!
|
One state per credential the carrier declares. Secrets are write-only: save them through updateDeliveryCompanyCredentials. |
Example
{
"addressBookEntry": "5e5677d71bdc2ae76344968c",
"credentials": [DeliveryCompanyCredentialState]
}
EshopBranding
Description
Public branding information for an eshop to render branded pages
Fields
| Field Name | Description |
|---|---|
_id - ObjectID!
|
Eshop identifier |
colorScheme - BrandColorScheme
|
Color scheme for UI theming |
customization - CustomizationExtensions
|
Extension point for future customization features |
logos - BrandLogos
|
Brand logos for different usage contexts |
name - String!
|
Eshop display name |
Example
{
"_id": "5e5677d71bdc2ae76344968c",
"colorScheme": BrandColorScheme,
"customization": CustomizationExtensions,
"logos": BrandLogos,
"name": "abc123"
}
EshopDeliveryCompany
Fields
| Field Name | Description |
|---|---|
bookingRefusal - String
|
The code every quote and booking with this carrier is refused with, or null when it is usable. deliveryCompany.ownCredentialsRequired: in production the carrier needs the eshop’s own account credentials. |
config - EshopDeliveryCompanyConfig
|
|
deliveryCompany - DeliveryCompany
|
|
isEnabled - Boolean
|
|
requestableOptions - [RequestableOption!]
|
The options a storefront may offer for this carrier, computed from the carrier's catalogue and the eshop's effective tariff; empty while optionsEnabled is off. Nothing is stored per eshop, so a toggle loses nothing. |
Example
{
"bookingRefusal": "xyz789",
"config": EshopDeliveryCompanyConfig,
"deliveryCompany": DeliveryCompany,
"isEnabled": false,
"requestableOptions": [RequestableOption]
}
EshopDeliveryCompanyConfig
Fields
| Field Name | Description |
|---|---|
authConfigs - [EshopAuthConfig]
|
|
displayAtCheckout - Boolean
|
|
enabledServices - [String]
|
|
fuelSurchargePercent - Float
|
Fuel surcharge in percent added to this carrier's quotes; null when never set. Null and 0 both mean off. |
minimumPrice - Float
|
|
notificationPreferences - NotificationPreferences
|
|
optionsEnabled - Boolean
|
Whether this eshop offers the carrier's catalogue options to buyers; a storefront shows options only where it is on. |
paperType - String
|
|
priceMultiplier - Float
|
|
roundingIncrement - Float
|
|
rules - [Rule]
|
Example
{
"authConfigs": [EshopAuthConfig],
"displayAtCheckout": false,
"enabledServices": ["abc123"],
"fuelSurchargePercent": 987.65,
"minimumPrice": 987.65,
"notificationPreferences": NotificationPreferences,
"optionsEnabled": true,
"paperType": "xyz789",
"priceMultiplier": 123.45,
"roundingIncrement": 123.45,
"rules": [Rule]
}
Float
Description
The Float scalar type represents signed double-precision fractional values as specified by IEEE 754.
Example
987.65
FreeShippingCartValueSourceEnum
Description
Which figures the free-shipping cart value was taken from.
Values
| Enum Value | Description |
|---|---|
|
|
The shipped lines' stated lineSubtotal. |
|
|
The shipped lines' stated lineTotal. |
|
|
The order's itemsSubtotal less its discountTotal. |
|
|
The shipped lines' price × quantity. |
Example
"LINE_SUBTOTALS"
FreeShippingCheckoutDisplayEnum
Values
| Enum Value | Description |
|---|---|
|
|
Show all carrier rates with discounted/free prices at checkout |
|
|
Show a single "Free Shipping" option using the default carrier at checkout |
Example
"ALL_CARRIERS"
FreeShippingConfig
Description
Free shipping promotion configuration for an eshop
Fields
| Field Name | Description |
|---|---|
checkoutDisplay - FreeShippingCheckoutDisplayEnum
|
How free shipping appears at checkout. Defaults to ALL_CARRIERS. |
isEnabled - Boolean
|
Whether free shipping promotion is active for this eshop |
restOfWorld - FreeShippingRestOfWorld
|
Optional fallback applied when no rule matches the destination country |
revision - Int!
|
Incremented by every save of this configuration. Send it back as expectedRevision with a change to rules or restOfWorld. |
rules - [FreeShippingRule!]
|
Ordered list of region rules; first match by destination country wins |
Example
{
"checkoutDisplay": "ALL_CARRIERS",
"isEnabled": true,
"restOfWorld": FreeShippingRestOfWorld,
"revision": 987,
"rules": [FreeShippingRule]
}
FreeShippingDecision
Description
Pircel's free-shipping decision as last settled, applied or not. It is frozen once the buyer charge binds, and null on shipments settled before this field existed.
Fields
| Field Name | Description |
|---|---|
applied - Boolean!
|
|
cartValueCents - Int
|
Null when the basis could not be computed. |
cartValueSource - FreeShippingCartValueSourceEnum
|
|
codFeeChargedCents - Int
|
The COD fee the buyer pays under the applied rule, on the order’s basis. |
decidedAt - DateTime!
|
|
frozen - Boolean!
|
True once the buyer charge bound. |
outcome - FreeShippingDecisionOutcomeEnum!
|
|
regionSource - AppliedRegionSourceEnum
|
|
ruleId - ObjectID
|
Null when no rule matched. |
ruleName - String
|
|
thresholdBasis - FreeShippingThresholdBasisEnum
|
|
thresholdCents - Int
|
Example
{
"applied": true,
"cartValueCents": 123,
"cartValueSource": "LINE_SUBTOTALS",
"codFeeChargedCents": 123,
"decidedAt": "2007-12-03T10:15:30Z",
"frozen": false,
"outcome": "APPLIED",
"regionSource": "REST_OF_WORLD",
"ruleId": "5e5677d71bdc2ae76344968c",
"ruleName": "abc123",
"thresholdBasis": "CATALOG",
"thresholdCents": 123
}
FreeShippingDecisionOutcomeEnum
Description
Why Pircel's free-shipping rule did or did not apply.
Values
| Enum Value | Description |
|---|---|
|
|
The rule applied. |
|
|
The cart reached the threshold with fewer items than the rule requires. |
|
|
The cart value was below the rule’s threshold. |
|
|
A figure the cart value is computed from is not a usable amount: not a number, or more decimals than allowed (2 on a stated amount, 6 on a unit price). No promotion applies. |
|
|
The selection is a pickup or an external courier, which a carrier-rate promotion does not price. |
|
|
Free shipping is not enabled on the eshop. |
|
|
No rule covers the destination. |
|
|
The rule compares what the buyer paid, and the order stated neither its totals nor every shipped line’s total. |
Example
"APPLIED"
FreeShippingOriginalCostUnknownReasonEnum
Values
| Enum Value | Description |
|---|---|
|
|
No carrier rate was priced for this shipment, so there is no delivery charge to measure the saving against |
|
|
The buyer's selected rate is not among the rates quoted for this shipment (a client-priced selection), so what they would have paid is unknowable |
Example
"NO_RATE_QUOTED"
FreeShippingRestOfWorld
Description
Fallback free shipping deal applied when no rule matches the destination country
Fields
| Field Name | Description |
|---|---|
codFee - Float
|
Cash on delivery surcharge applied when this rule is active and the customer selects COD. Stated incl. VAT: a VAT-inclusive order is charged it as stated, a net-priced order its net at the order’s rate. |
defaultCarrier - DeliveryCompany
|
Default delivery company used for fulfillment when this rule is applied |
minItemCount - Int
|
Minimum number of product items required in the order for this rule to apply |
name - String!
|
Human-readable label for this rule, shown in admin UI |
threshold - Float!
|
Minimum order value for free shipping under this rule, on the SAME basis as the eshop's own order prices — VAT-inclusive for a VAT-inclusive eshop, matching what the storefront advertises. Not an ex-VAT figure. |
thresholdBasis - FreeShippingThresholdBasisEnum
|
What the threshold compares against, counting the lines that ship and nothing else: PAID (the default) is what the buyer paid and CATALOG the pre-discount product sum; each value names the figures it reads. Every major platform evaluates its own free-shipping minimum post-discount. |
waiveCodFee - Boolean
|
Whether to absorb the COD fee in the free shipping promotion under this rule |
excludedCountries - [String!]
|
ISO 3166-1 alpha-2 country codes that receive no free shipping at all |
Example
{
"codFee": 987.65,
"defaultCarrier": DeliveryCompany,
"minItemCount": 987,
"name": "abc123",
"threshold": 987.65,
"thresholdBasis": "CATALOG",
"waiveCodFee": true,
"excludedCountries": ["xyz789"]
}
FreeShippingRule
Description
A region-scoped free shipping rule (named country group with optional exclusions)
Fields
| Field Name | Description |
|---|---|
_id - ObjectID
|
|
codFee - Float
|
Cash on delivery surcharge applied when this rule is active and the customer selects COD. Stated incl. VAT: a VAT-inclusive order is charged it as stated, a net-priced order its net at the order’s rate. |
defaultCarrier - DeliveryCompany
|
Default delivery company used for fulfillment when this rule is applied |
minItemCount - Int
|
Minimum number of product items required in the order for this rule to apply |
name - String!
|
Human-readable label for this rule, shown in admin UI |
threshold - Float!
|
Minimum order value for free shipping under this rule, on the SAME basis as the eshop's own order prices — VAT-inclusive for a VAT-inclusive eshop, matching what the storefront advertises. Not an ex-VAT figure. |
thresholdBasis - FreeShippingThresholdBasisEnum
|
What the threshold compares against, counting the lines that ship and nothing else: PAID (the default) is what the buyer paid and CATALOG the pre-discount product sum; each value names the figures it reads. Every major platform evaluates its own free-shipping minimum post-discount. |
waiveCodFee - Boolean
|
Whether to absorb the COD fee in the free shipping promotion under this rule |
countries - [String!]!
|
ISO 3166-1 alpha-2 country codes this rule applies to |
excludedCountries - [String!]
|
ISO 3166-1 alpha-2 country codes carved out of this rule |
Example
{
"_id": "5e5677d71bdc2ae76344968c",
"codFee": 123.45,
"defaultCarrier": DeliveryCompany,
"minItemCount": 123,
"name": "abc123",
"threshold": 123.45,
"thresholdBasis": "CATALOG",
"waiveCodFee": true,
"countries": ["abc123"],
"excludedCountries": ["xyz789"]
}
FreeShippingThresholdBasisEnum
Values
| Enum Value | Description |
|---|---|
|
|
Threshold compares against the pre-discount value of the lines that ship: their stated lineSubtotal when every one states it, otherwise price × quantity. |
|
|
Threshold compares against what the buyer paid for the lines that ship: their stated lineTotal when every one states it, otherwise the order's itemsSubtotal minus discountTotal when every line ships. Any other order earns no free shipping, never a pre-discount figure: the producer must send its money at quote time. |
Example
"CATALOG"
FulfillmentType
Description
How a shipment is fulfilled. carrier is a Pircel-mapped courier with a deliveryCompany and full automation. external is an unmappable third-party courier the merchant arranges (ships, but no carrier automation; reassignable to a real carrier later). pickup is collect-from-store (nothing ships). in-store is a counter sale, sold and handed over at the store (nothing ships).
Values
| Enum Value | Description |
|---|---|
|
|
Pircel-mapped carrier |
|
|
Unmappable third-party courier arranged by the merchant |
|
|
Sold and handed over at the store's counter; nothing ships |
|
|
Collect from store; nothing ships |
Example
"CARRIER"
GeneralBuyerEmailsConfig
Description
Settings for the delivery-status emails buyers receive
Fields
| Field Name | Description |
|---|---|
replyTo - String
|
Where a buyer's reply goes. Null means no Reply-To: replies reach Pircel's sending address. |
Example
{"replyTo": "xyz789"}
GeneralCheckoutConfig
Description
Checkout-related general settings
Fields
| Field Name | Description |
|---|---|
defaultCarrier - DeliveryCompany
|
Optional carrier pinned to be pre-selected at checkout when defaultSelection is AUTO |
defaultSelection - CheckoutDefaultSelectionEnum
|
Whether a rate is pre-selected at checkout (AUTO) or left to the buyer (NONE). Defaults to AUTO. |
rateSorting - RateSortingEnum
|
How available shipping rates are ordered at checkout. Defaults to PRICE_ASC. |
Example
{
"defaultCarrier": DeliveryCompany,
"defaultSelection": "AUTO",
"rateSorting": "FASTEST"
}
GeneralConfig
Description
General settings configuration for an eshop
Fields
| Field Name | Description |
|---|---|
buyerEmails - GeneralBuyerEmailsConfig
|
Delivery-status emails: they are sent as " |
checkout - GeneralCheckoutConfig
|
Checkout-related general settings |
dataRetention - GeneralDataRetentionConfig!
|
How long the eshop's recipients' details are kept |
voucher - GeneralVoucherConfig
|
Voucher-related general settings: what reaches the carrier when a label is minted |
Example
{
"buyerEmails": GeneralBuyerEmailsConfig,
"checkout": GeneralCheckoutConfig,
"dataRetention": GeneralDataRetentionConfig,
"voucher": GeneralVoucherConfig
}
GeneralDataRetentionConfig
Description
How long Pircel keeps the eshop's recipients' details, counted from a shipment's last status change: when it was finished (delivered, collected, returned or cancelled), or its last status update for one that never finishes. Each period is applied by the next daily retention pass.
Fields
| Field Name | Description |
|---|---|
recipientDetailsDefaultMonths - Int!
|
Months the default keeps them, while the eshop sets none. |
recipientDetailsMerchantOnlyAboveMonths - Int!
|
Longer settings take the merchant's own user, saving after the dashboard's notice; anyone else is refused with updateEshopSettings.retentionPeriodMerchantOnly. |
recipientDetailsMonths - Int!
|
Months every recipient detail is kept: name, address, phone, email, notes, labels and coordinates. The eshop's setting, else the default. |
recipientDetailsSetAt - DateTime
|
When the setting was last changed; null while default. |
recipientDetailsSettingRange - MonthsRange!
|
The months the setting may take. |
Example
{
"recipientDetailsDefaultMonths": 123,
"recipientDetailsMerchantOnlyAboveMonths": 987,
"recipientDetailsMonths": 123,
"recipientDetailsSetAt": "2007-12-03T10:15:30Z",
"recipientDetailsSettingRange": MonthsRange
}
GeneralVoucherConfig
Description
Voucher-related general settings
Fields
| Field Name | Description |
|---|---|
includeBuyerNotes - Boolean
|
Whether a voucher carries the buyer's own delivery notes (Shipment.buyerNotes) to the carrier, appended to whatever notes the caller passes. Null means this eshop has never chosen, and the system default applies: buyer notes are NOT sent. createVoucher.includeBuyerNotes overrides it for a single call. |
Example
{"includeBuyerNotes": true}
GenikiFields
GenikiInput
GoodsRateCategoryEnum
Description
VAT rate class of the eshop's goods.
Values
| Enum Value | Description |
|---|---|
|
|
The only supported class. Onboarding a reduced-rated eshop means extending the taxation dataset first; until then resolution fails closed rather than guessing a rate. |
Example
"STANDARD"
ID
Description
The ID scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as "4") or integer (such as 4) input value will be accepted as an ID.
Example
"4"
Int
Description
The Int scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.
Example
123
JSON
Description
The JSON scalar type represents JSON values as specified by ECMA-404.
Example
{}
JSONObject
Description
The JSONObject scalar type represents JSON objects as specified by ECMA-404.
Example
{}
LabelDimensions
Logo
MerchantNoticeKind
Description
A text Pircel supplies to merchants for their own use.
Values
| Enum Value | Description |
|---|---|
|
|
The paragraph for the merchant's own privacy notice, telling shoppers how Pircel prices deliveries at checkout. |
Example
"SHOPPER_NOTICE_PARAGRAPH"
MerchantNoticeRecord
Description
When a version of a text was first supplied to the eshop, each way. Null where it has not been.
Example
{
"copiedAt": "2007-12-03T10:15:30Z",
"dismissedAt": "2007-12-03T10:15:30Z",
"emailedAt": "2007-12-03T10:15:30Z",
"kind": "SHOPPER_NOTICE_PARAGRAPH",
"shownAt": "2007-12-03T10:15:30Z",
"version": "abc123"
}
MonthsRange
MultiPieceCapability
NotificationPreferences
Description
Email notification trigger preferences per delivery company. Controls when customer notifications are sent.
Fields
| Field Name | Description |
|---|---|
onInTransit - Boolean
|
Send notification when carrier first scans the package (in-transit, picked-up, or out-for-delivery status). |
onPickupCreate - Boolean
|
Send notification when pickup list is created. |
onVoucherCreate - Boolean
|
Send notification when voucher/label is created. |
Example
{"onInTransit": false, "onPickupCreate": false, "onVoucherCreate": true}
NotificationSent
Description
Record of a sent email notification.
Fields
| Field Name | Description |
|---|---|
sentAt - DateTime!
|
Timestamp when the notification was sent |
trigger - NotificationTriggerEnum!
|
The notification trigger type |
Example
{
"sentAt": "2007-12-03T10:15:30Z",
"trigger": "IN_TRANSIT"
}
NotificationTriggerEnum
Description
Types of email notification triggers for shipments.
Values
| Enum Value | Description |
|---|---|
|
|
Triggered when carrier first scans the package |
|
|
Triggered when pickup list is created |
|
|
Triggered when voucher/label is created |
Example
"IN_TRANSIT"
ObjectID
Description
A field whose value conforms with the standard mongodb object ID as described here: https://docs.mongodb.com/manual/reference/method/ObjectId/#ObjectId. Example: 5e5677d71bdc2ae76344968c
Example
"5e5677d71bdc2ae76344968c"
OrderAmounts
Description
The order totals as the seller stated them, ingested verbatim (amounts-first contract) — from a commerce platform relaying its storefront, or from a merchant stating them on a dashboard-created order. The COD collectible is amountDue when present, else grandTotal; Pircel never recomputes these.
Fields
| Field Name | Description |
|---|---|
amountDue - Float
|
What remains to be paid, and therefore the at-door COD collectible. Gift cards, store credit and partial payments are tenders, not discounts: they reduce this and never grandTotal. A verbatim 0 means "collect nothing". |
anomalies - [OrderAmountsAnomaly!]!
|
What is suspicious but not impossible in the money as stated: recomputed on every write that states it, and the ones read against the costs on every write. Empty on orders stored before they were kept. |
currency - String
|
ISO 4217 currency of all amounts (EUR). |
discountLines - [OrderDiscountLine]
|
The platform's per-discount breakdown (coupons, automatic promotions, manual edits). Metadata only. |
discountTotal - Float
|
Total coupon/cart/automatic discount the buyer saw, on the order's price basis. Sale prices are already baked into itemsSubtotal. |
feeLines - [OrderFeeLine]
|
Store-charged fee lines (COD surcharges, gift wrap, tips, levies). Signed amounts; metadata only. |
feesTotal - Float
|
Sum of store-charged fee lines the buyer paid, on the order's price basis — the SAME basis as itemsSubtotal and discountTotal (gross, the fee's tax included, for a tax-inclusive store; net for a tax-exclusive one, the fee's tax in totalTax), or the totals identity cannot close. Signed: platforms allow negative pseudo-discount fee lines. |
grandTotal - Float
|
The platform's order grand total, verbatim: the buyer's full obligation for the order BEFORE any tender is applied against it. Discounts are already inside it; gift cards and other prepayments are not — those reduce amountDue. |
itemsSubtotal - Float
|
Line items as sold (post-sale-price, pre coupon/cart discounts), on the order's price basis. |
payments - [OrderPayment]
|
Tenders already applied against this order (gift cards, store credit, deposits, captures). Metadata only. |
prepaidTotal - Float
|
What has already been paid against this order, as the seller states it (EN 16931 BT-113). Never summed by Pircel from payments — a total derived from the lines would be Pircel inventing the buyer's money. Send the lines AND the total; lines alone record an anomaly. |
pricesIncludeTax - Boolean
|
Per-order basis tag: whether the order amounts include tax. Absent when the order was not tagged. |
refundedTotal - Float
|
What the platform states it has refunded in total. Never summed by Pircel from refunds: with refunds and no total, show "refunded, amount not stated". Refunded when within a cent of grandTotal, partly refunded when between 0 and it. |
refunds - [OrderRefund!]
|
The refunds the platform completed, one per refund record; null when none were stated. |
shippingTax - Float
|
Tax on the platform's shipping charge. |
shippingTotal - Float
|
What the buyer pays for shipping, post shipping-discount, on the order's price basis — the SAME basis as itemsSubtotal and discountTotal. On a tax-inclusive store this INCLUDES shippingTax; sending it net there fails ingestion with inconsistent-totals by exactly the shipping VAT. |
taxLines - [OrderTaxLine]
|
The platform's per-rate tax breakdown (metadata only). |
totalTax - Float
|
Total tax on the order. Already INSIDE grandTotal on a tax-inclusive store; ADDED to the other parts to reach it on a tax-exclusive one — which is why the totals identity adds it only in the exclusive case. Required on a tax-exclusive order for that identity to run at all; without it only plausibility bounds are checked. |
Example
{
"amountDue": 123.45,
"anomalies": [OrderAmountsAnomaly],
"currency": "xyz789",
"discountLines": [OrderDiscountLine],
"discountTotal": 123.45,
"feeLines": [OrderFeeLine],
"feesTotal": 987.65,
"grandTotal": 987.65,
"itemsSubtotal": 987.65,
"payments": [OrderPayment],
"prepaidTotal": 987.65,
"pricesIncludeTax": false,
"refundedTotal": 123.45,
"refunds": [OrderRefund],
"shippingTax": 123.45,
"shippingTotal": 987.65,
"taxLines": [OrderTaxLine],
"totalTax": 123.45
}
OrderAmountsAnomaly
Description
Something suspicious but not impossible in the order money, recorded and never refused.
Fields
| Field Name | Description |
|---|---|
detail - JSONObject!
|
The anomaly's own figures, under the keys its check uses: euros, or cents where the key ends in Cents. |
type - OrderAmountsAnomalyTypeEnum!
|
Example
{"detail": {}, "type": "AMOUNT_DUE_OVER_TOTAL_WITHIN_TOLERANCE"}
OrderAmountsAnomalyTypeEnum
Description
A kind of order-money anomaly.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The platform charged its own cash-on-delivery fee (a COD_FEE fee line) on top of a shipping total that already covered Pircel's buyer charge, so the buyer paid the fee twice. Informational: nothing is blocked. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"AMOUNT_DUE_OVER_TOTAL_WITHIN_TOLERANCE"
OrderAmountsInput
Description
The order totals as the seller states them, sent verbatim — never recomputed here (amounts-first contract). Whoever originates the order owns these figures: a commerce platform relaying what its storefront charged, or a dashboard-created order where the merchant states them directly. The rule is the same either way — send a figure a human was shown and accepted, and omit one you would have to derive. The COD collectible is amountDue when present, else grandTotal; re-send on updates so refunds and edits carry through to the voucher. Shopify names below are Admin GraphQL fields, each read as its shopMoney amount.
Fields
| Input Field | Description |
|---|---|
amountDue - Float
|
What remains to be paid after every tender already applied — the at-door COD collectible, and the field that decides how much cash the courier takes. Always tax-inclusive, whatever pricesIncludeTax says. Send 0 for a fully-prepaid order; the voucher is then created without COD collection. Omit it rather than guessing: an absent value falls back to grandTotal, a wrong one is collected verbatim. It must rest on tenders actually applied — a selected payment method is an intent, not a captured payment. Never send more than is owed: under-reporting is a reporting defect, over-collecting from a buyer who already paid is not recoverable. Where it comes from: Shopify totalOutstandingSet, Magento total_due, WooCommerce total (always the residual — gift-card plugins reduce it in place, and the official extension before v1.8.0 omits the amount entirely). |
currency - String!
|
ISO 4217 currency of all amounts. Required; only EUR is accepted. |
discountLines - [OrderDiscountLineInput]
|
The per-discount breakdown behind discountTotal. Stored and rendered as metadata, never computed from — a total is never synthesised from its lines. Where it comes from: WooCommerce coupon_lines, Shopify discountApplications. |
discountTotal - Float
|
Total coupon/cart/automatic discount the buyer saw, on the order's price basis. Sale prices belong in itemsSubtotal, not here. A known zero is a fact and should be stated — the totals identity abstains entirely without it. Where it comes from: WooCommerce discount_total plus discount_tax on a tax-inclusive store; Shopify totalDiscountsSet. |
feeLines - [OrderFeeLineInput]
|
Seller-charged fee lines — COD surcharges, gift wrap, tips, statutory levies. Signed amounts. Where it comes from: WooCommerce fee_lines. |
feesTotal - Float
|
Total of the seller-charged fees the buyer paid (signed — negative pseudo-discount fees are legal). On the SAME basis as itemsSubtotal, discountTotal and shippingTotal, or the totals identity cannot close: including the fee's tax on a tax-inclusive order; on a tax-exclusive order the fee's tax belongs in totalTax. State it whenever feeLines carry a non-zero amount: an unstated total is not a stated zero, and the totals identity abstains rather than deriving one from the lines — which records an anomaly instead of validating the order. |
grandTotal - Float!
|
The buyer's full obligation for the order, verbatim, BEFORE any tender (gift card, store credit, deposit) is applied against it. Discounts and tax are always inside it, whatever pricesIncludeTax says. Never synthesise it from its parts — send a figure the buyer was shown and accepted, which on a seller-originated order means one the form displayed before submit. Where it comes from: Shopify totalPriceSet, which stays gross because Shopify models a gift card as a transaction. WooCommerce: send total here AND as amountDue, and never inflate it — WooCommerce stores only the residual (the official Gift Cards extension and the common third-party ones all reduce total), so a gross figure cannot be recovered and inventing one over-collects cash at the door. |
itemsSubtotal - Float
|
Line items as sold: post-sale-price, PRE coupon/cart discounts, on the order's price basis. Sent together with discountTotal and shippingTotal it enables the totals identity, which must compose to grandTotal within rounding tolerance; omit any of the three and that arithmetic check does not run at all. Where it comes from: WooCommerce Σ line subtotal(+tax), Shopify Σ line originalTotalSet (no order field holds it), Magento subtotal. |
payments - [OrderPaymentInput]
|
Tenders already applied against this order. A gift card or store credit sent as a discountLine is permanently recorded as a promotion — send it here. |
prepaidTotal - Float
|
What has already been paid against this order, as the seller states it (EN 16931 BT-113). Never summed by Pircel from payments — a total derived from the lines would be Pircel inventing the buyer's money. Send the lines AND the total; lines alone record an anomaly. |
pricesIncludeTax - Boolean
|
Whether the order amounts include tax (WooCommerce prices_include_tax, Shopify taxesIncluded). Falls back to the eshop's declared default when omitted, and must not contradict the legacy includeVat argument when both are sent — prefer this field alone; includeVat is a migration alias for callers that predate it. 🔴 ONE basis for the WHOLE payload — every amount here must be on the side of tax this flag names, except the money owed or paid — grandTotal, amountDue, prepaidTotal and payments — which always includes tax. A platform with independent per-component settings (Magento has separate price_includes_tax and shipping_includes_tax) must NORMALISE to one basis before sending, choosing each accessor by the flag it is about to send rather than by the setting that produced it. Mixing them fails ingestion with orderAmounts.inconsistentTotals, off by exactly the tax on the diverging component. |
refundedTotal - Float
|
What the platform states it has refunded in total, as it states prepaidTotal: never summed by Pircel from refunds. grandTotal stays as placed, and a refund changes no tender status. A sum of refunds that differs, or a total above grandTotal, is recorded as an anomaly, not refused. |
refunds - [OrderRefundInput!]
|
The refunds the platform completed, one per refund record. Send them all on every re-send: the list replaces the stored one. |
shippingTax - Float
|
Tax on the platform's shipping charge. Send it whenever it is known, even on a tax-inclusive order where it is already inside shippingTotal: it is what lets a shipping charge be read on either side of tax without re-deriving it from a rate. |
shippingTotal - Float
|
What the buyer pays for shipping, POST shipping-discount (WooCommerce shipping_total and Shopify shippingLine.discountedPriceSet are already post-discount). This is the seller's charge to the buyer, not Pircel's quote — they coincide only where the seller passes the quote through unchanged. On the SAME basis as itemsSubtotal and discountTotal — so on a tax-inclusive order it INCLUDES shippingTax, and sending it net there fails ingestion by exactly the shipping VAT. |
taxLines - [OrderTaxLineInput]
|
The per-rate tax breakdown behind totalTax. Stored and rendered as metadata, never computed from. |
totalTax - Float
|
Total tax on the order. Already INSIDE grandTotal on a tax-inclusive store; ADDED to the other parts to reach it on a tax-exclusive one — which is why the totals identity adds it only in the exclusive case. Required on a tax-exclusive order for that identity to run at all; without it only plausibility bounds are checked. |
Example
{
"amountDue": 987.65,
"currency": "abc123",
"discountLines": [OrderDiscountLineInput],
"discountTotal": 987.65,
"feeLines": [OrderFeeLineInput],
"feesTotal": 123.45,
"grandTotal": 123.45,
"itemsSubtotal": 987.65,
"payments": [OrderPaymentInput],
"prepaidTotal": 987.65,
"pricesIncludeTax": false,
"refundedTotal": 123.45,
"refunds": [OrderRefundInput],
"shippingTax": 987.65,
"shippingTotal": 123.45,
"taxLines": [OrderTaxLineInput],
"totalTax": 987.65
}
OrderBasisSourceEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
Example
"ESHOP_DEFAULT"
OrderDiscountKindEnum
Values
| Enum Value | Description |
|---|---|
|
|
Platform rule applied without a code |
|
|
Buyer-entered code |
|
|
Merchant order edit |
|
|
Anything else |
Example
"AUTOMATIC"
OrderDiscountLine
Description
One coupon/promotion the platform applied — provenance, never computed from.
Fields
| Field Name | Description |
|---|---|
amount - Float
|
Discount amount of this line in the order currency. |
code - String
|
The coupon/promo code the buyer entered, if any. |
kind - OrderDiscountKindEnum
|
How the platform applied this discount. |
label - String
|
The platform's display label for this discount line. |
Example
{
"amount": 987.65,
"code": "xyz789",
"kind": "AUTOMATIC",
"label": "xyz789"
}
OrderDiscountLineInput
Fields
| Input Field | Description |
|---|---|
amount - Float
|
Discount amount of this line in the order currency. |
code - String
|
The coupon/promo code the buyer entered, if any. |
kind - OrderDiscountKindEnum
|
How the platform applied this discount; map unknown kinds to OTHER. |
label - String
|
The platform's display label for this discount line. |
Example
{
"amount": 987.65,
"code": "abc123",
"kind": "AUTOMATIC",
"label": "abc123"
}
OrderFeeKindEnum
Values
| Enum Value | Description |
|---|---|
|
|
Store-charged COD surcharge |
|
|
Gift wrapping |
|
|
Statutory levy (e.g. recycling, plastic bag) |
|
|
Anything else |
|
|
Buyer tip |
Example
"COD_FEE"
OrderFeeLine
Description
One store-charged fee line (signed — platforms allow negative pseudo-discount fees).
Fields
| Field Name | Description |
|---|---|
amount - Float
|
Fee amount in the order currency (signed), on the order's basis: including the fee's tax on a tax-inclusive order; on a tax-exclusive order the fee's tax belongs in totalTax. |
kind - OrderFeeKindEnum
|
Best-effort fee classification; raw label always kept. |
label - String
|
The platform's display label for this fee line. |
Example
{
"amount": 123.45,
"kind": "COD_FEE",
"label": "abc123"
}
OrderFeeLineInput
Fields
| Input Field | Description |
|---|---|
amount - Float
|
Fee amount in the order currency (signed), on the order's basis: including the fee's tax on a tax-inclusive order; on a tax-exclusive order the fee's tax belongs in totalTax. |
kind - OrderFeeKindEnum
|
Best-effort fee classification; map unknown kinds to OTHER. |
label - String
|
The platform's display label for this fee line. |
Example
{
"amount": 987.65,
"kind": "COD_FEE",
"label": "abc123"
}
OrderPayment
Description
One tender already applied against the order. Tenders are NOT discounts: they reduce what remains to be paid without reducing what the order was worth.
Fields
| Field Name | Description |
|---|---|
amount - Float
|
Amount of this tender in the order currency. |
capturedAt - DateTime
|
When the platform captured this tender, if it says. |
deductedFromGrandTotal - Boolean
|
Whether the platform ALREADY subtracted this tender from the grandTotal it sent. Observed, never inferred: false on Shopify (a gift card is a transaction, the total stays gross), true on Magento and WooCommerce (gift-card plugins reduce the total in place). Omit it rather than guessing — the totals identity abstains and records an anomaly, where a wrong value fails a valid order or admits a wrong one. |
kind - OrderPaymentKindEnum
|
Tender type. |
label - String
|
The platform's display label for this tender. |
reference - String
|
The platform's own id for the tender (gift-card code, transaction id). |
status - OrderPaymentStatusEnum
|
Lifecycle state; only CAPTURED money has moved. |
Example
{
"amount": 987.65,
"capturedAt": "2007-12-03T10:15:30Z",
"deductedFromGrandTotal": false,
"kind": "BANK_TRANSFER",
"label": "abc123",
"reference": "abc123",
"status": "AUTHORIZED"
}
OrderPaymentInput
Description
A tender already applied against the order. Send gift cards, store credit, deposits and captures here — NEVER as a discountLine, which would inflate discount reporting and deflate revenue.
Fields
| Input Field | Description |
|---|---|
amount - Float
|
Amount of this tender in the order currency. |
capturedAt - DateTime
|
When it was captured. |
deductedFromGrandTotal - Boolean
|
Whether the platform ALREADY subtracted this tender from the grandTotal it sent. Observed, never inferred: false on Shopify (a gift card is a transaction, the total stays gross), true on Magento and WooCommerce (gift-card plugins reduce the total in place). Omit it rather than guessing — the totals identity abstains and records an anomaly, where a wrong value fails a valid order or admits a wrong one. |
kind - OrderPaymentKindEnum
|
Tender type. |
label - String
|
Display label. |
reference - String
|
Platform id for the tender. |
status - OrderPaymentStatusEnum
|
Lifecycle state. Defaults to CAPTURED when omitted, so send it explicitly for anything not yet taken. |
Example
{
"amount": 123.45,
"capturedAt": "2007-12-03T10:15:30Z",
"deductedFromGrandTotal": true,
"kind": "BANK_TRANSFER",
"label": "xyz789",
"reference": "xyz789",
"status": "AUTHORIZED"
}
OrderPaymentKindEnum
Description
Tender type. Enum-frozen: an unrecognised instrument is OTHER with its raw label, because widening this list later is a migration.
Values
| Enum Value | Description |
|---|---|
|
|
Bank transfer |
|
|
Card payment |
|
|
Cash taken in person |
|
|
Cash on delivery |
|
|
Part payment taken up front |
|
|
Gift card redemption |
|
|
Anything the plugin cannot classify |
|
|
Store credit / customer balance |
|
|
Prepaid voucher |
|
|
Wallet (PayPal balance, Apple Pay, ...) |
Example
"BANK_TRANSFER"
OrderPaymentStatusEnum
Description
Only CAPTURED money has actually moved; the rest is intent and must not reduce a collectible.
Values
| Enum Value | Description |
|---|---|
|
|
Held but not taken |
|
|
Taken — the money moved |
|
|
Attempted and refused |
|
|
Awaiting settlement |
Example
"AUTHORIZED"
OrderRefund
Description
A refund the platform completed on the order, as the platform states it. grandTotal stays as placed.
Fields
| Field Name | Description |
|---|---|
adjustmentFee - Float
|
A free-form amount the store kept back (Magento adjustment fee). |
adjustmentRefund - Float
|
A free-form amount the store added to the refund (Magento adjustment refund). |
amount - Float!
|
What was refunded, gross, in the order currency. |
lines - [OrderRefundLine!]
|
The lines the refund covers; null when none were stated. |
paymentReference - String
|
The tender the refund went back to, when known. |
reference - String
|
The platform's id for the refund (a credit memo). |
refundedAt - DateTime
|
When the platform completed the refund. |
shippingAmount - Float
|
The delivery part of the refund, gross, the cash-on-delivery fee included. |
Example
{
"adjustmentFee": 123.45,
"adjustmentRefund": 123.45,
"amount": 123.45,
"lines": [OrderRefundLine],
"paymentReference": "abc123",
"reference": "abc123",
"refundedAt": "2007-12-03T10:15:30Z",
"shippingAmount": 987.65
}
OrderRefundInput
Description
A refund the platform has completed (for Magento, a credit memo in state refunded; an open or canceled memo is not one). Stated as the platform records it: on a cash-on-delivery order not yet delivered a refund usually means less to collect, which amountDue says, not this record.
Fields
| Input Field | Description |
|---|---|
adjustmentFee - Float
|
A free-form amount kept back from the refund (Magento adjustment fee). |
adjustmentRefund - Float
|
A free-form amount added to the refund (Magento adjustment refund). |
amount - Float!
|
What was refunded, gross, positive, in orderAmounts.currency (the store base currency). |
lines - [OrderRefundLineInput!]
|
The lines the refund covers. Their lineSubtotal and lineTotal, stated on every line, let the order's line checks count the refunded units beside products; without them the lines are provenance only. |
paymentReference - String
|
The tender the refund went back to, when known. |
reference - String
|
The platform's id for the refund (the credit memo). |
refundedAt - DateTime
|
When the platform completed the refund. |
shippingAmount - Float
|
The delivery part of the refund, gross, the cash-on-delivery fee included, as the booking counts delivery. |
Example
{
"adjustmentFee": 987.65,
"adjustmentRefund": 123.45,
"amount": 123.45,
"lines": [OrderRefundLineInput],
"paymentReference": "abc123",
"reference": "abc123",
"refundedAt": "2007-12-03T10:15:30Z",
"shippingAmount": 987.65
}
OrderRefundLine
Description
A line a refund covers, with the refunded units' money when the store stated it.
Fields
| Field Name | Description |
|---|---|
lineSubtotal - Float
|
The refunded units as sold before discounts, as a product line states its lineSubtotal; null when not stated. |
lineTotal - Float
|
What the buyer paid for the refunded units, as a product line states its lineTotal; null when not stated. |
quantity - Float!
|
Units refunded. |
restock - Boolean
|
Whether the store returned the units to stock; null when it did not say. |
sku - String
|
The line's SKU. |
storeLineId - String
|
The refunded line's storeLineId. |
Example
{
"lineSubtotal": 987.65,
"lineTotal": 123.45,
"quantity": 987.65,
"restock": true,
"sku": "xyz789",
"storeLineId": "abc123"
}
OrderRefundLineInput
Description
A line a refund covers. With its money stated, the order's line checks count the refunded units beside products, so an order that ships what is left still states its placed itemsSubtotal and discountTotal.
Fields
| Input Field | Description |
|---|---|
lineSubtotal - Float
|
The refunded units as sold before coupon or cart discounts, as ProductInput.lineSubtotal (unit price × refunded quantity). State it on every refunded line or none: the line-subtotal and lines-value checks count it only when every refunded line states it, and say nothing when only some do. A stated amount: 0 to 1,000,000 with at most 2 decimals, else orderAmounts.invalidAmount. |
lineTotal - Float
|
What the buyer paid for the refunded units after discounts, as ProductInput.lineTotal. Counted by the line-totals check on the same every-or-none rule. A stated amount, as lineSubtotal. |
quantity - Float!
|
Units refunded. |
restock - Boolean
|
Whether the store returned the units to stock. Omit it when the platform does not keep that. |
sku - String
|
The line's SKU. |
storeLineId - String
|
The refunded line's storeLineId. |
Example
{
"lineSubtotal": 123.45,
"lineTotal": 987.65,
"quantity": 987.65,
"restock": true,
"sku": "abc123",
"storeLineId": "xyz789"
}
OrderTaxLine
Description
One line of the platform's tax breakdown (metadata only).
Example
{
"amount": 987.65,
"label": "abc123",
"ratePercent": 987.65
}
OrderTaxLineInput
OtherDocument
Fields
| Field Name | Description |
|---|---|
documentType - OtherDocumentTypeEnum
|
Type of the document. |
encodedDocument - String
|
Base64 encoded document content. |
externalId - String
|
External identifier for the document. |
Example
{
"documentType": "COMMERCIAL_INVOICE",
"encodedDocument": "abc123",
"externalId": "xyz789"
}
OtherDocumentTypeEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
Example
"COMMERCIAL_INVOICE"
PageCustomization
Fields
| Field Name | Description |
|---|---|
colorScheme - ColorScheme
|
Example
{"colorScheme": ColorScheme}
Parcel
Fields
| Field Name | Description |
|---|---|
_id - ObjectID
|
Unique identifier for this parcel within the shipment, automatically generated |
billableWeight - Float
|
Parcel's billable weight in kilograms. (The weight used for the price calculation. The greater of actual weight or volumetric weight) |
contents - [ParcelContents]
|
Products contained in this parcel with their quantities, enabling proper distribution across multiple parcels |
dimensions - ParcelDimensions
|
|
returnVoucher - ParcelVoucher
|
This parcel's carrier-issued RETURN voucher (reverse-logistics label + tracking number). Independent lifecycle from voucher — issued, canceled, and expires independently. Null until a return voucher has been created for this parcel. |
volumetricWeight - Float
|
Parcel's volumetric weight in kilograms. The overall size of a parcel measured in volumetric kilograms. |
voucher - ParcelVoucher
|
This parcel's carrier-issued FORWARD voucher (tracking number + label + references). Null until createVoucher runs successfully for this parcel. The reverse-logistics counterpart lives on returnVoucher. |
weight - Float
|
Parcel's weight in kilograms. |
Example
{
"_id": "5e5677d71bdc2ae76344968c",
"billableWeight": 123.45,
"contents": [ParcelContents],
"dimensions": ParcelDimensions,
"returnVoucher": ParcelVoucher,
"volumetricWeight": 987.65,
"voucher": ParcelVoucher,
"weight": 987.65
}
ParcelContents
ParcelContentsInput
ParcelDimensions
ParcelIdentityModeEnum
Values
| Enum Value | Description |
|---|---|
|
|
Carrier has no concept of per-piece identity — a single voucher covers the entire shipment regardless of parcel count. |
|
|
Carrier returns a stable per-piece identifier with each voucher. Round-trip via parcelVoucher.deliveryCompanyPieceId. |
|
|
No per-piece identifier; pieces are matched by request/response array position. Adapters MUST preserve order. |
Example
"NONE"
ParcelInput
Fields
| Input Field | Description |
|---|---|
contents - [ParcelContentsInput!]
|
Products contained in this parcel (optional, defaults to all products in first parcel if not specified) |
height - Float
|
Parcel height in centimeters, up to 1,000. 0 or absent means not stated; volumetric weight needs all three sides. A negative value is refused with shipmentInput.invalidNumber. |
length - Float
|
Parcel length in centimeters, up to 1,000. 0 or absent means not stated; volumetric weight needs all three sides. A negative value is refused with shipmentInput.invalidNumber. |
weight - Float!
|
Parcel weight in kilograms, from 0 to 1,000; 0 means unknown, and billing applies the tariff minimum. Otherwise shipmentInput.invalidNumber. |
width - Float
|
Parcel width in centimeters, up to 1,000. 0 or absent means not stated; volumetric weight needs all three sides. A negative value is refused with shipmentInput.invalidNumber. |
Example
{
"contents": [ParcelContentsInput],
"height": 987.65,
"length": 123.45,
"weight": 987.65,
"width": 987.65
}
ParcelVoucher
Description
Voucher / tracking number for a single parcel in a multi-piece shipment. Replaces the parcel's slot in the legacy flat Shipment.vouchers[] array.
Fields
| Field Name | Description |
|---|---|
code - String!
|
Carrier-assigned tracking number / voucher code. |
createdAt - DateTime!
|
|
deliveryCompanyPieceId - String
|
Carrier-internal piece key (e.g. FedEx packageSequenceNumber). Lets carrier callbacks map back to the right parcel without relying on positional ordering. |
deliveryCompanyReference - String!
|
Our reference for this parcel ({INTERNAL_SHORT}-{NN}) stamped in the carrier's primary reference slot and printed on the label. |
label - ParcelVoucherLabel
|
|
merchantReference - String
|
Optional secondary reference (sanitized merchant orderId) stamped in the carrier's second reference slot. |
status - VoucherStatusEnum!
|
Example
{
"code": "abc123",
"createdAt": "2007-12-03T10:15:30Z",
"deliveryCompanyPieceId": "abc123",
"deliveryCompanyReference": "xyz789",
"label": ParcelVoucherLabel,
"merchantReference": "xyz789",
"status": "ACTIVE"
}
ParcelVoucherLabel
Description
Carrier-issued shipping label for a single parcel, stored alongside the parcel's voucher.
Fields
| Field Name | Description |
|---|---|
dimensions - LabelDimensions
|
Real label dimensions in PDF points; absent for legacy labels created before cropping was introduced. |
encodedDocument - String!
|
Base64-encoded label PDF. |
Example
{
"dimensions": LabelDimensions,
"encodedDocument": "abc123"
}
PickupAddress
Example
{
"address": "abc123",
"addressBookEntry": "5e5677d71bdc2ae76344968c",
"city": "xyz789",
"country": "abc123",
"countryCode": "xyz789",
"name": "xyz789",
"postcode": "abc123"
}
PickupListsList
Fields
| Field Name | Description |
|---|---|
closeTime - String
|
The time "HH:MM" representing the latest time for pickup |
code - String
|
Pickup list number |
deliveryCompany - DeliveryCompany
|
Delivery company for this pickup list |
printDocument - String
|
Pickup list document content or URL |
readyTime - String
|
The time "HH:MM" when the shipment(s) are ready for pickup |
Example
{
"closeTime": "abc123",
"code": "abc123",
"deliveryCompany": DeliveryCompany,
"printDocument": "xyz789",
"readyTime": "xyz789"
}
PickupTimeInput
Fields
| Input Field | Description |
|---|---|
closeTime - String
|
The latest time "HH:MM" that the shipment(s) can be picked up |
deliveryCompany - DeliveryCompanyIDOrSlugInput!
|
Delivery company to generate pickup list for (by ID or slug) |
readyTime - String
|
The time "HH:MM" when the shipment(s) are ready for pickup |
Example
{
"closeTime": "abc123",
"deliveryCompany": DeliveryCompanyIDOrSlugInput,
"readyTime": "xyz789"
}
PickupTimeModeEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
Example
"FIXED"
PickupTimeOptions
Fields
| Field Name | Description |
|---|---|
closeOptions - [String]
|
|
fixedOptions - [String]
|
|
mode - PickupTimeModeEnum!
|
|
readyOptions - [String]
|
Example
{
"closeOptions": ["xyz789"],
"fixedOptions": ["abc123"],
"mode": "FIXED",
"readyOptions": ["xyz789"]
}
Platform
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
Example
"MAGENTO2"
PolicyAcceptance
Description
An eshop's acceptance of a policy version, by one of its users for the whole account.
Fields
| Field Name | Description |
|---|---|
acceptedAt - DateTime!
|
|
acceptedBy - ObjectID!
|
The user who accepted it. |
policy - PolicyKind!
|
|
version - String!
|
Example
{
"acceptedAt": "2007-12-03T10:15:30Z",
"acceptedBy": "5e5677d71bdc2ae76344968c",
"policy": "CUSTOMER_AGREEMENT",
"version": "xyz789"
}
PolicyKind
Description
One of Pircel's merchant policies.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
Example
"CUSTOMER_AGREEMENT"
PriceSourceEnum
Description
Who produced a quote's price: SERVER (the fan-out or a re-quote), CLIENT (the producer; an echo of a server quote adopts SERVER), ADMIN (modifyShipmentRatePricing).
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
Example
"ADMIN"
PricingComponent
Description
A single pricing component like a surcharge, tax, or fee
Fields
| Field Name | Description |
|---|---|
amountCents - Int
|
Amount of the pricing component |
category - PricingComponentCategory
|
Category of the pricing component |
code - String
|
Carrier-specific code for this component, if available |
description - String
|
Description of the pricing component |
name - String
|
Human-readable name of the pricing component |
surchargeType - SurchargeType
|
Type of surcharge, applicable when category is SURCHARGE |
Example
{
"amountCents": 987,
"category": "BASE",
"code": "xyz789",
"description": "xyz789",
"name": "abc123",
"surchargeType": "ADDITIONAL_HANDLING"
}
PricingComponentCategory
Description
Categories of pricing components
Values
| Enum Value | Description |
|---|---|
|
|
Base shipping charge |
|
|
Import/export duties |
|
|
Processing or service fees |
|
|
Other fees/charges that don't fit other categories |
|
|
Additional charges applied to shipment |
|
|
Government taxes (VAT, sales tax, etc.) |
Example
"BASE"
PricingComponentInput
Description
Input for defining a pricing component in the complete rate structure
Fields
| Input Field | Description |
|---|---|
amount - Float
|
Amount of the pricing component: at most 1,000,000 either side of 0, with at most 2 decimals, else shipmentInput.invalidNumber. |
category - PricingComponentCategory
|
Category of the pricing component |
code - String
|
Carrier-specific code for this component (optional) |
description - String
|
Description of the pricing component |
name - String
|
Human-readable name of the pricing component |
surchargeType - SurchargeType
|
Type of surcharge, applicable when category is SURCHARGE |
Example
{
"amount": 987.65,
"category": "BASE",
"code": "xyz789",
"description": "abc123",
"name": "xyz789",
"surchargeType": "ADDITIONAL_HANDLING"
}
PricingTrace
Description
What this rate was priced from: the rate card and its version, the config in force, the zone resolution, the itemised ex-VAT legs, the VAT rates and their source, the weight, the engine and the instant. A quote is reproducible from it. Absent on a client-supplied rate.
Fields
| Field Name | Description |
|---|---|
carrier - PricingTraceCarrier
|
|
config - PricingTraceConfig!
|
|
engine - String!
|
The arithmetic that produced the price ('file-based-v1', 'tariff-v1', 'fedex-api-v1', 'ups-api-v1'). |
lines - [PricingTraceLine!]
|
The itemised legs a tariff document priced; absent under the file engine and for an API carrier. |
options - PricingTraceOptions
|
The options the quote applied; absent when the tariff pins no catalogue. |
quotedAt - DateTime!
|
When this service was priced; the tax point a replay uses. |
resolution - PricingTraceResolution
|
|
tariff - PricingTraceTariff
|
|
vat - PricingTraceVat
|
|
weight - PricingTraceWeight
|
Example
{
"carrier": PricingTraceCarrier,
"config": PricingTraceConfig,
"engine": "xyz789",
"lines": [PricingTraceLine],
"options": PricingTraceOptions,
"quotedAt": "2007-12-03T10:15:30Z",
"resolution": PricingTraceResolution,
"tariff": PricingTraceTariff,
"vat": PricingTraceVat,
"weight": PricingTraceWeight
}
PricingTraceAppliedOption
Fields
| Field Name | Description |
|---|---|
carrierCode - String
|
The carrier's own code the voucher will carry. |
code - String!
|
|
trigger - CarrierOptionTrigger!
|
Example
{
"carrierCode": "abc123",
"code": "abc123",
"trigger": "REQUESTED"
}
PricingTraceCarrier
PricingTraceConfig
Description
The eshop-carrier money knobs in force at the quote.
Example
{
"fuelSurchargePercent": 987.65,
"minimumPrice": 123.45,
"priceMultiplier": 987.65,
"roundingIncrement": 987.65
}
PricingTraceLine
Description
One priced charge, ex-VAT and pre-markup, with the bases it was priced on.
Fields
| Field Name | Description |
|---|---|
band - Int
|
|
basis - JSON
|
The carrier basis the line was priced on; a replay at another weight needs no tariff read. |
basisKind - TariffBasisKindEnum!
|
|
buyerBasis - JSON
|
The buyer basis, when it differs from the carrier basis. |
buyerCents - Int!
|
|
carrierCents - Int!
|
|
category - TariffChargeCategoryEnum!
|
|
code - String!
|
|
markupExempt - Boolean!
|
|
option - String
|
The catalogue option this line prices, when it is an option’s. |
percentOfCents - Int
|
|
steps - Int
|
Whole weight steps charged above the included weight. |
surchargeType - String
|
Example
{
"band": 123,
"basis": {},
"basisKind": "FLAT",
"buyerBasis": {},
"buyerCents": 987,
"carrierCents": 987,
"category": "BASE",
"code": "xyz789",
"markupExempt": false,
"option": "abc123",
"percentOfCents": 987,
"steps": 987,
"surchargeType": "xyz789"
}
PricingTraceNearMiss
PricingTraceOptions
Description
The catalogue options this quote applied: derived from the order and requested, with their carrier codes.
Fields
| Field Name | Description |
|---|---|
applied - [PricingTraceAppliedOption!]
|
|
superseded - [PricingTraceSupersededOption!]
|
|
unevaluated - [PricingTraceUnevaluatedConstraint!]
|
Example
{
"applied": [PricingTraceAppliedOption],
"superseded": [PricingTraceSupersededOption],
"unevaluated": [PricingTraceUnevaluatedConstraint]
}
PricingTraceResolution
Description
How the zone was chosen, stamped so a fallback is a query, not a memory.
Fields
| Field Name | Description |
|---|---|
billedAs - [String!]
|
The zone's billedAs at the quote: what the carrier prints on an invoice line for it. |
candidates - [String!]!
|
|
countryGroup - String!
|
|
nearMiss - PricingTraceNearMiss
|
|
postcode - String!
|
|
priority - Int
|
|
route - TariffZoneRouteEnum!
|
|
settlementKeyed - Boolean
|
True when a settlement-keyed area the tariff references lists the postcode, so the city moves the price. |
settlementMatched - String
|
|
settlementQuery - String
|
|
zone - String!
|
Example
{
"billedAs": ["abc123"],
"candidates": ["xyz789"],
"countryGroup": "xyz789",
"nearMiss": PricingTraceNearMiss,
"postcode": "xyz789",
"priority": 123,
"route": "SETTLEMENT_MATCH",
"settlementKeyed": true,
"settlementMatched": "xyz789",
"settlementQuery": "abc123",
"zone": "abc123"
}
PricingTraceSupersededOption
PricingTraceTariff
Description
The rate card a tariff carrier priced from. Absent for an API carrier.
Fields
| Field Name | Description |
|---|---|
contentHash - String
|
The published version's content hash; a mismatch on read is an integrity failure. |
id - ObjectID
|
|
key - String
|
' |
route - TariffRouteEnum
|
|
source - TariffSourceEnum!
|
|
version - Int
|
Example
{
"contentHash": "abc123",
"id": "5e5677d71bdc2ae76344968c",
"key": "xyz789",
"route": "AGREEMENT",
"source": "FILES",
"version": 123
}
PricingTraceUnevaluatedConstraint
PricingTraceVat
Fields
| Field Name | Description |
|---|---|
buyerRatePercent - Float
|
|
buyerRateSource - PricingTraceVatRateSourceEnum!
|
|
carrierRatePercent - Float
|
Example
{
"buyerRatePercent": 987.65,
"buyerRateSource": "TARIFF",
"carrierRatePercent": 123.45
}
PricingTraceVatRateSourceEnum
Description
Where the buyer VAT rate came from: the rate card's lane rate, the eshop's law-mode resolution, the carrier's response, or none (priced ex-VAT with no rate).
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
Example
"TARIFF"
PricingTraceWeight
PrintVoucherPayload
Fields
| Field Name | Description |
|---|---|
document - String!
|
Base64-encoded PDF containing every active label for the shipment, merged into a single document according to the carrier's configured outputMedium and stickerLayout. |
Example
{"document": "xyz789"}
Product
Description
A line on a shipment, as sold to the buyer.
Fields
| Field Name | Description |
|---|---|
_id - ObjectID
|
Server-generated identifier for this line within the shipment. |
categories - [String]
|
The categories this line's product belongs to, as the source platform names them. A list because products are in several: WooCommerce and Magento assign many, and Shopify has one category but many collections. Free-form strings rather than an enum — the vocabulary is the merchant's, so no fixed set can hold it. Carrier rules that exclude categories match on these; the rule fires if ANY of them is excluded. |
countryOfOrigin - String
|
The country the product was manufactured in. |
description - String
|
A brief description of the product. |
dimensions - ProductDimensions
|
The dimensions of the product. |
externalId - String
|
The product's identifier in the source platform. |
extraAttributes - [ProductExtraAttributesEnumType]
|
Handling attributes that apply to this line. |
harmonizedSystemCode - String
|
The Harmonized System code used to classify the product for customs. |
image - String
|
Full URL to the product's image. |
kind - ProductKind
|
What the buyer receives on this line. Reporting only, and never used to decide whether the line is shipped. Absent means unclassified, which is distinct from OTHER. |
lineDiscount - Float
|
Discount the platform allocated to this line (coupon/cart/automatic), verbatim (WooCommerce line subtotal − total, Shopify discountAllocations). |
lineSubtotal - Float
|
This line as sold before coupon/cart discounts (unit price × quantity at the sold price), verbatim from the platform. |
lineTotal - Float
|
What the buyer pays for this line after discounts, verbatim from the platform. |
metadata - String
|
Additional platform data for this line, JSON-encoded by convention. Stored exactly as sent and returned on reads; never parsed, so it need not be valid JSON. At most 16 KiB (16,384 bytes of UTF-8) per line: a longer value is refused with addShipment.productMetadataTooLarge or updateShipment.productMetadataTooLarge, extensions.index naming the line and extensions.limit the cap, never truncated. |
price - Float!
|
Unit price as sold, BEFORE coupon/cart discounts, on the eshop's own order price basis (VAT-inclusive for a VAT-inclusive eshop). Where lineSubtotal is sent it is authoritative; price × quantity, rounded half away from zero to the cent, is expected to match it. Load-bearing beyond display: it drives the free-shipping catalog threshold, and on a shipment carrying no orderAmounts it is what the COD collectible is derived from — so a post-discount value here silently under-collects, and a pre-discount one over-collects once a buyer used a coupon. |
quantity - Int!
|
Number of units on this line. |
requiresShipping - Boolean
|
Whether this line is physically shipped to the buyer. Determines the parcel contents, billable weight, carrier rates, delivery charge and customs declaration. Set it per line rather than per product, since a product can sell as digital or physical depending on the variation chosen. Omitting it treats the line as shipped. |
sku - String
|
Stock keeping unit identifying the product. |
storeLineId - String
|
The store's stable key for this line, the same from quote to order, like Shopify's line item id. Chosen by the store and never interpreted by Pircel; externalId stays the catalogue product id. Unique within a shipment: a duplicate is refused with products.duplicateStoreLineId. Omitted on a line that matches a stored one (by _id), the stored key is kept, so a client that does not know it need not echo it. |
title - String
|
Name of the product. |
weight - Float
|
Weight of a single unit in kilograms. |
Example
{
"_id": "5e5677d71bdc2ae76344968c",
"categories": ["abc123"],
"countryOfOrigin": "abc123",
"description": "xyz789",
"dimensions": ProductDimensions,
"externalId": "abc123",
"extraAttributes": ["GIFT"],
"harmonizedSystemCode": "xyz789",
"image": "abc123",
"kind": "DIGITAL_GOOD",
"lineDiscount": 123.45,
"lineSubtotal": 123.45,
"lineTotal": 987.65,
"metadata": "xyz789",
"price": 987.65,
"quantity": 123,
"requiresShipping": true,
"sku": "xyz789",
"storeLineId": "abc123",
"title": "abc123",
"weight": 123.45
}
ProductDimensions
ProductDimensionsInput
Description
The dimensions of a product in centimeters, each up to 1,000. 0 or absent means a side not stated, and only stated sides are stored; a negative side is refused with shipmentInput.invalidNumber.
Example
{"height": 987.65, "length": 987.65, "width": 987.65}
ProductExtraAttributesEnumType
Description
Handling attributes that affect how a product is shipped.
Values
| Enum Value | Description |
|---|---|
|
|
Sent as a gift. |
Example
"GIFT"
ProductInput
Description
A line to record on a shipment.
Fields
| Input Field | Description |
|---|---|
categories - [String]
|
The categories this line's product belongs to, as the source platform names them. A list because products are in several: WooCommerce and Magento assign many, and Shopify has one category but many collections. Free-form strings rather than an enum — the vocabulary is the merchant's, so no fixed set can hold it. Carrier rules that exclude categories match on these; the rule fires if ANY of them is excluded. |
countryOfOrigin - String
|
The country the product was manufactured in. |
description - String
|
A brief description of the product. |
dimensions - ProductDimensionsInput
|
The dimensions of the product. |
externalId - String
|
The product's identifier in the source platform. |
extraAttributes - [ProductExtraAttributesEnumType]
|
Handling attributes that apply to this line. |
harmonizedSystemCode - String
|
The Harmonized System code used to classify the product for customs. |
image - String
|
Full URL to the product's image. |
kind - ProductKind
|
What the buyer receives on this line. Reporting only, and never used to decide whether the line is shipped. Absent means unclassified, which is distinct from OTHER. |
lineDiscount - Float
|
Discount the platform allocated to this line (coupon/cart/automatic), verbatim (WooCommerce line subtotal − total, Shopify discountAllocations). A stated amount: 0 to 1,000,000 with at most 2 decimals, else orderAmounts.invalidAmount. |
lineSubtotal - Float
|
This line as sold before coupon/cart discounts (unit price × quantity at the sold price), verbatim from the platform. A stated amount: 0 to 1,000,000 with at most 2 decimals, else orderAmounts.invalidAmount. |
lineTotal - Float
|
What the buyer pays for this line after discounts, verbatim from the platform. A stated amount: 0 to 1,000,000 with at most 2 decimals, else orderAmounts.invalidAmount. |
metadata - String
|
Additional platform data for this line, JSON-encoded by convention. Stored exactly as sent and returned on reads; never parsed, so it need not be valid JSON. At most 16 KiB (16,384 bytes of UTF-8) per line: a longer value is refused with addShipment.productMetadataTooLarge or updateShipment.productMetadataTooLarge, extensions.index naming the line and extensions.limit the cap, never truncated. |
price - Float!
|
Unit price as sold, BEFORE coupon/cart discounts, on the eshop's own order price basis (VAT-inclusive for a VAT-inclusive eshop). Where lineSubtotal is sent it is authoritative; price × quantity, rounded half away from zero to the cent, is expected to match it. Load-bearing beyond display: it drives the free-shipping catalog threshold, and on a shipment carrying no orderAmounts it is what the COD collectible is derived from — so a post-discount value here silently under-collects, and a pre-discount one over-collects once a buyer used a coupon. A unit price: 0 to 1,000,000 with at most 6 decimals, else orderAmounts.invalidAmount. |
quantity - Int!
|
Number of units on this line. A whole number from 1 to 100,000, else shipmentInput.invalidNumber. |
requiresShipping - Boolean
|
Whether this line is physically shipped to the buyer. Determines the parcel contents, billable weight, carrier rates, delivery charge and customs declaration. Set it per line rather than per product, since a product can sell as digital or physical depending on the variation chosen. Omitting it treats the line as shipped. |
sku - String
|
Stock keeping unit identifying the product. Kept exactly as sent; an empty one is none. |
storeLineId - String
|
The store's stable key for this line, the same from quote to order, like Shopify's line item id. Chosen by the store and never interpreted by Pircel; externalId stays the catalogue product id. Unique within a shipment: a duplicate is refused with products.duplicateStoreLineId. Omitted on a line that matches a stored one (by _id), the stored key is kept, so a client that does not know it need not echo it. |
title - String
|
Name of the product. Trimmed; sent blank, it is refused with shipmentInput.required. |
weight - Float
|
Weight of a single unit in kilograms. From 0 to 1,000; 0 means unknown. Otherwise shipmentInput.invalidNumber. |
_id - ObjectID
|
Echo back the line's _id from a previous read to keep it the SAME line. products is replaced as a whole array, so a line sent without one is a new line and is given a new id — which strands any parcel manifest that referenced the old one. Omit it only for a line that is genuinely new. |
Example
{
"categories": ["xyz789"],
"countryOfOrigin": "xyz789",
"description": "abc123",
"dimensions": ProductDimensionsInput,
"externalId": "xyz789",
"extraAttributes": ["GIFT"],
"harmonizedSystemCode": "xyz789",
"image": "abc123",
"kind": "DIGITAL_GOOD",
"lineDiscount": 987.65,
"lineSubtotal": 987.65,
"lineTotal": 123.45,
"metadata": "abc123",
"price": 987.65,
"quantity": 123,
"requiresShipping": false,
"sku": "xyz789",
"storeLineId": "xyz789",
"title": "abc123",
"weight": 987.65,
"_id": "5e5677d71bdc2ae76344968c"
}
ProductKind
Description
What the buyer receives on an order line. Reporting only: whether a line is shipped is determined by requiresShipping, never by this field. Omit it when the source platform cannot distinguish one kind from another.
Values
| Enum Value | Description |
|---|---|
|
|
Delivered electronically, such as a download, licence key or access grant. A downloadable file is not required. |
|
|
Stored value, either physical or digital. Read requiresShipping to tell which. |
|
|
A kind outside this list. Distinct from omitting the field, which means unclassified. |
|
|
A tangible item delivered to the buyer. |
|
|
Work performed for the buyer, such as a booking or consultation. |
Example
"DIGITAL_GOOD"
QuoteBasis
Description
Read-only snapshot of the physical inputs (parcels, destination) the selected rate was priced for. Server-written; compared against the live shipment to detect it changed out from under its rate.
Fields
| Field Name | Description |
|---|---|
destination - QuoteBasisDestination
|
|
parcelCount - Int
|
|
parcels - [QuoteBasisParcel]
|
|
quotedAt - DateTime
|
When the basis was captured (rate quote/selection time) |
Example
{
"destination": QuoteBasisDestination,
"parcelCount": 987,
"parcels": [QuoteBasisParcel],
"quotedAt": "2007-12-03T10:15:30Z"
}
QuoteBasisDestination
Description
The typed destination the rate was priced for
Fields
| Field Name | Description |
|---|---|
country - String
|
|
countryCode - String
|
|
postcode - String
|
|
settlement - String
|
The normalised city, recorded only when the rate's zone resolution was settlement-keyed (a postcode some area lists by settlement); empty when none was typed. A label checks it only when it is recorded. |
Example
{
"country": "abc123",
"countryCode": "xyz789",
"postcode": "abc123",
"settlement": "abc123"
}
QuoteBasisDimensions
QuoteBasisParcel
Description
Per-parcel physical basis a rate was priced for
Fields
| Field Name | Description |
|---|---|
billableWeight - Float
|
Billable weight priced (kg) |
dimensions - QuoteBasisDimensions
|
|
volumetricWeight - Float
|
Volumetric weight priced (kg) |
weight - Float
|
Actual weight priced (kg) |
Example
{
"billableWeight": 123.45,
"dimensions": QuoteBasisDimensions,
"volumetricWeight": 123.45,
"weight": 987.65
}
RateRefusal
Description
Why the request's options ruled out this carrier or one of its products. Beside the priced services when only some products are refused; alone on an unavailable rate when none priced.
Fields
| Field Name | Description |
|---|---|
constraint - RateRefusalConstraint
|
For CONSTRAINT: what failed. |
option - String
|
The catalogue option code refused; absent for a product constraint. |
product - String
|
The product refused; absent when the whole carrier is (the flag, a carrier whose quote takes no options). |
reason - RateRefusalReason!
|
|
with - String
|
The colliding, conflicting, required or missing code; the payment method for REQUIRES_PAYMENT_METHOD and COD_NOT_OFFERED. |
Example
{
"constraint": RateRefusalConstraint,
"option": "xyz789",
"product": "abc123",
"reason": "UNKNOWN_OPTION",
"with": "xyz789"
}
RateRefusalConstraint
Fields
| Field Name | Description |
|---|---|
fact - String!
|
The fact checked, printed (shipment 3 kg). |
kind - CarrierConstraintKind!
|
|
limit - String!
|
The bound that failed, printed (max 2 kg). |
Example
{
"fact": "abc123",
"kind": "WEIGHT",
"limit": "xyz789"
}
RateRefusalReason
Description
UNKNOWN_OPTION: not in the carrier's catalogue. NOT_REQUESTABLE: derived from the order, never asked for. NOT_FOR_PRODUCT: the option does not apply to this product. REQUIRES_PAYMENT_METHOD: the option is a variant of a payment method the order does not use. EXCLUSIVE_GROUP: two options of one group. CONFLICTS_WITH: a declared conflict. REQUIRES_MISSING: a required option or product is absent. CONSTRAINT: a weight, destination or delivery-day bound failed. UNPRICED: the eshop's tariff has no charge for the option. NOT_DELIVERABLE: this carrier's quote takes no options. OPTIONS_NOT_ENABLED: the eshop has not switched options on for this carrier. COD_NOT_OFFERED: a cash-on-delivery order to a carrier that does not collect.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"UNKNOWN_OPTION"
RateSortingEnum
Values
| Enum Value | Description |
|---|---|
|
|
Lowest transit time first; carriers without transit-time data are listed last |
|
|
Cheapest first |
|
|
Most expensive first |
Example
"FASTEST"
RateStoreFreeShipping
Description
The store's own free shipping on one rate.
Fields
| Field Name | Description |
|---|---|
applied - Boolean!
|
True when the store's grant priced this rate; false when a Pircel free-shipping rule took precedence (Shipment.freeShipping). |
codFeeWaived - Boolean!
|
True when the rate's own cash-on-delivery fee was dropped and the merchant absorbs it: under WAIVE, or under CHARGE on a rate whose basis is UNKNOWN, where the fee cannot be split out. False when the buyer pays it or there was none. |
Example
{"applied": true, "codFeeWaived": false}
Recipient
RecipientAddressCreateInput
Description
Input type for recipient address used for shipment creation.
Fields
| Input Field | Description |
|---|---|
addressLine1 - String
|
Address line 1. |
addressLine2 - String
|
Address line 2. |
addressLine3 - String
|
Address line 3. |
city - String!
|
City. A quote (a NEW shipment with no orderId) may send it blank and is priced from the postcode; a placed order needs it, else shipmentInput.required with extensions.field recipient.address.city. |
country - String!
|
Country. |
countryCode - String
|
Country code in ISO 3166-1 alpha-2 format. |
county - String
|
County. |
postcode - String
|
Postcode. |
Example
{
"addressLine1": "abc123",
"addressLine2": "xyz789",
"addressLine3": "abc123",
"city": "abc123",
"country": "abc123",
"countryCode": "abc123",
"county": "abc123",
"postcode": "abc123"
}
RecipientContactCreateInput
Description
Input type for recipient contact used for shipment creation.
Fields
| Input Field | Description |
|---|---|
companyName - String
|
Company name. Either company name OR first and last name is required. |
email - String
|
Email address. |
firstname - String
|
First name. Either first and last name OR company name is required. |
lastname - String
|
Last name. Either first and last name OR company name is required. |
phone - String
|
Phone number. |
Example
{
"companyName": "xyz789",
"email": "xyz789",
"firstname": "abc123",
"lastname": "xyz789",
"phone": "abc123"
}
RecipientCreateInput
Description
Input type for recipient details used for shipment creation.
Fields
| Input Field | Description |
|---|---|
address - RecipientAddressCreateInput
|
Recipient address. Required, else shipmentInput.required with extensions.field recipient.address, unless the selected rate is IN_STORE (a counter sale), where it may be omitted and one sent is stored as given. On a quote (a NEW shipment with no orderId and no completed checkout) only city, postcode, county, country and countryCode are read; the street lines are ignored and not stored. |
contact - RecipientContactCreateInput
|
Recipient contact. Required, else shipmentInput.required with extensions.field recipient.contact, unless the selected rate is IN_STORE. On a quote it is ignored: names, company, phone and email are not stored, so restate them when the order is placed. |
Example
{
"address": RecipientAddressCreateInput,
"contact": RecipientContactCreateInput
}
RecipientLogistics
Description
Customer-provided logistics company details when using recipient-logistics delivery option.
Example
{
"companyName": "abc123",
"email": "abc123",
"phone": "xyz789"
}
RecipientLogisticsInput
Description
Input for customer-provided logistics company details when using recipient-logistics.
Example
{
"companyName": "xyz789",
"email": "xyz789",
"phone": "xyz789"
}
RequestableOption
Description
A catalogue option a storefront may offer for this eshop and carrier: requested by the buyer or merchant and priced by the eshop's tariff (a zero charge counts). The price depends on the destination; the quote states it.
Fields
| Field Name | Description |
|---|---|
appliesToProducts - [String!]
|
Absent = every product of the carrier. |
code - String!
|
|
name - String!
|
|
paymentMethods - [ShipmentPaymentMethodEnum!]!
|
The payment methods this option applies to, empty when it applies to any. An option that lists any is a way of paying, such as cash on delivery by cheque: it replaces that payment's own option and is quoted only with one of them, so it is not an add-on a storefront offers on its own. |
Example
{
"appliesToProducts": ["abc123"],
"code": "xyz789",
"name": "xyz789",
"paymentMethods": ["AFTERPAY_CLEARPAY"]
}
RetentionHold
Description
An admin's hold on an eshop's records for an open tax audit or dispute: retention deletes none of them while it lasts.
Example
{
"reason": "xyz789",
"setAt": "2007-12-03T10:15:30Z",
"setBy": "5e5677d71bdc2ae76344968c"
}
Rule
Fields
| Field Name | Description |
|---|---|
exclusions - RuleExclusions
|
Optional product exclusion criteria. Products matching any criterion are skipped during rule evaluation. |
type - String
|
|
value - Float
|
Example
{
"exclusions": RuleExclusions,
"type": "xyz789",
"value": 987.65
}
RuleExclusions
Example
{
"categories": ["abc123"],
"extraAttributes": ["xyz789"],
"skus": ["abc123"]
}
SelectedRate
Description
The selected service and rate for a shipment
Fields
| Field Name | Description |
|---|---|
costs - Costs
|
Cost breakdown for the selected service (may include client-specific overrides) |
deliveryCompany - DeliveryCompany
|
Selected delivery company. Null for external/pickup rates. |
fulfillmentType - FulfillmentType
|
How this rate is fulfilled (carrier|external|pickup). Defaults to carrier for legacy rates. |
negotiatedCosts - Costs
|
Original costs based on carrier negotiated rates (before any client-specific overrides). Used for invoice reconciliation to compare against carrier invoices. Absent when no carrier agreement is known (plugin-provided rates, unconfirmed carriers, legacy shipments) — this field never falls back to costs. |
negotiatedPriceComponents - [PricingComponent]
|
Itemised breakdown of the carrier-agreement cost on negotiatedCosts' own ex-VAT basis — the counterpart of priceComponents for the negotiated leg. Absent where the rate source does not itemise it; absence means the agreed per-service split is unknown, not zero. |
priceComponents - [PricingComponent]
|
The producer’s own itemisation for the selected service, stage-mixed by construction: file-based rates carry pre-multiplier net legs beside a final-gross VAT line, while API carriers carry the carrier’s figures rather than the buyer’s. It does NOT sum to finalPriceCents and is not a decomposition of it — the multiplier, the minimum-price floor and the rounding increment all land afterwards and appear in no component. Read one component; never reconcile the sum. |
pricingTrace - PricingTrace
|
What the selected service was priced from, copied from the service at selection. Absent on a client-supplied rate and on quotes before the stamp existed. |
quoteBasis - QuoteBasis
|
Physical inputs (parcels/destination) this rate was priced for. Server-written; absent for legacy/non-carrier rates. |
rating - Float
|
Rating of the selected service |
serviceCode - String
|
Selected service code. Null on a carrier selection that names no service: the carrier cannot fetch rates, and the merchant priced the selection. |
serviceName - String
|
Selected service name |
transitTime - TransitTime
|
Delivery time information |
Example
{
"costs": Costs,
"deliveryCompany": DeliveryCompany,
"fulfillmentType": "CARRIER",
"negotiatedCosts": Costs,
"negotiatedPriceComponents": [PricingComponent],
"priceComponents": [PricingComponent],
"pricingTrace": PricingTrace,
"quoteBasis": QuoteBasis,
"rating": 987.65,
"serviceCode": "abc123",
"serviceName": "xyz789",
"transitTime": TransitTime
}
SelectedRateInput
Description
Input for selecting a shipping rate. Can reference available rates (by serviceCode) or provide complete rate data directly
Fields
| Input Field | Description |
|---|---|
costs - CostsInput
|
Optional cost breakdown. If not provided, will be fetched from available rates based on serviceCode |
deliveryCompany - DeliveryCompanyIDOrSlugInput
|
The carrier providing the service (by ID or slug). Required when fulfillmentType is carrier (the default); omit it for every other type. |
fulfillmentType - FulfillmentType
|
How this rate is fulfilled. Defaults to carrier when omitted. Use external for an unmappable courier, pickup for collect-from-store, or in-store for a counter sale (addShipment only, placed, costs.finalPrice 0 or omitted, serviceName the shop); none of them names a deliveryCompany. |
priceComponents - [PricingComponentInput]
|
Optional detailed breakdown of price components. If not provided, will be fetched from available rates based on serviceCode. Stored as provenance only: the server never sums these to derive or check costs.finalPrice, so a set that does not add up to the price is recorded, not rejected. |
serviceCode - String
|
The service to select from the available rates. A carrier that quotes needs it, or serviceId; a carrier that cannot fetch rates has no services, so omit it and send costs. For external/pickup use serviceName for the display label. |
serviceId - String
|
Exact-reference selection: the Service.id of the quote to select from this shipment's rates (must belong to the named carrier). When it resolves, the server-held quote is used verbatim and any client-sent costs are ignored; when absent or unresolvable, selection falls back to serviceCode. |
serviceName - String
|
Optional service name. If not provided, will use serviceCode or fetch from available rates |
transitTime - TransitTimeInput
|
Optional delivery time information. If not provided, will be fetched from available rates based on serviceCode |
Example
{
"costs": CostsInput,
"deliveryCompany": DeliveryCompanyIDOrSlugInput,
"fulfillmentType": "CARRIER",
"priceComponents": [PricingComponentInput],
"serviceCode": "xyz789",
"serviceId": "xyz789",
"serviceName": "xyz789",
"transitTime": TransitTimeInput
}
Service
Description
A carrier service option with pricing details
Fields
| Field Name | Description |
|---|---|
costs - Costs
|
Cost breakdown for this service |
id - String
|
Stable identifier of this rate object within its shipment. Send it back as selectedRate.serviceId to select this exact quote. |
priceComponents - [PricingComponent]
|
The producer’s own itemisation, stage-mixed by construction: file-based rates carry pre-multiplier net legs beside a final-gross VAT line, while API carriers carry the carrier’s figures rather than the buyer’s. It does NOT sum to finalPriceCents and is not a decomposition of it — the multiplier, the minimum-price floor and the rounding increment all land afterwards and appear in no component. Read one component; never reconcile the sum. |
pricingTrace - PricingTrace
|
What this service was priced from: the rate card and its version, the zone resolution, the itemised ex-VAT legs, the config and VAT in force, the weight and the instant. Absent on a client-supplied rate. |
serviceCode - String
|
Carrier-specific service code (e.g. FEDEX_GROUND, UPS_NEXT_DAY_AIR) |
serviceName - String
|
Human-readable service name |
transitTime - TransitTime
|
Delivery time information |
Example
{
"costs": Costs,
"id": "xyz789",
"priceComponents": [PricingComponent],
"pricingTrace": PricingTrace,
"serviceCode": "abc123",
"serviceName": "abc123",
"transitTime": TransitTime
}
Shipment
Fields
| Field Name | Description |
|---|---|
_id - ObjectID
|
Shipment's id. |
auditLog - [ShipmentAuditEntry!]
|
Append-only activity log of everything done to this shipment after it left "new" status, newest first. |
availableRates - [DeliveryRate]
|
Available delivery rates from all carriers with their services |
buyerNotes - String
|
Buyer's notes. |
charge - ShipmentCharges
|
The delivery charge this shipment bound, as the ledger records it: buyer is what the buyer was bound to pay for delivery, carrier what Pircel expects the carrier to bill. Read this for a finalized shipment’s charge; selectedRate.costs is the quote as selected and can differ from it (free shipping, an override, an admin repricing, a re-rate after checkout). Null until the shipment binds and on shipments the backfill has not reached. |
checkout - ShipmentCheckout
|
How and where the customer placed the order (checkout flow, express flag, entry-point page). Set by the storefront plugin at order creation; null for manually-created or pre-tracking shipments. |
checkoutCompletedAt - DateTime
|
The date and time when the shipment completed checkout. Null for manually-created shipments. |
codCollectible - CodCollectible!
|
What the courier would collect at the door if the label were minted now, with the provenance of that figure. Null is impossible — an unresolvable collectible reports UNRESOLVABLE rather than 0. Once a label exists, codDeclaration is what it actually says. |
codDeclaration - CodDeclaration
|
What the carrier was told to collect, frozen at label creation and cleared on cancellation. Compare against codCollectible to detect an order edited after its label was printed — the courier will still ask for this amount. |
collectedAt - DateTime
|
When the buyer was handed the order at the store: a counter sale is collected when it is booked. Null until the status reaches collected. |
costSummary - CostSummary
|
Pircel's own catalog+quote view of the order. See CostSummary — it is not the buyer's money. |
createdAt - DateTime
|
The date and time when the shipment was created. |
documentUpload - DocumentUploadEligibility!
|
Whether this shipment can take a document upload, and why not when it cannot. Answered by the same predicate the upload endpoint uses, so a rendered control and an accepted upload cannot disagree. reason is the error code the endpoint would return. |
effectiveDate - DateTime
|
The shipment date used for sorting/filtering: checkoutCompletedAt, falling back to createdAt for shipments that never completed checkout. Derived field — safe for client-side sorting. |
eshop - Eshop
|
Reference to the eshop that created this shipment. |
freeShipping - ShipmentFreeShipping
|
Free shipping tracking information when a free shipping promotion was applied to this shipment |
freeShippingDecision - FreeShippingDecision
|
Pircel's free-shipping decision as last settled, applied or not; freeShipping keeps the applied snapshot. Frozen once the buyer charge binds; null on shipments settled before it was recorded. |
geniki - GenikiFields
|
Geniki delivery company specific fields |
holds - [ShipmentHold!]!
|
Reasons not to fulfil the shipment yet; empty when it is not held. A held shipment is refused a label and a pickup list and can still be canceled. |
isB2BInvoice - Boolean
|
Indicates if the shipment is for a B2B invoice (true) or B2C invoice (false). False by default. |
notificationsSent - [NotificationSent]
|
Array tracking which email notifications have been sent for this shipment. |
orderAmounts - OrderAmounts
|
The order totals as the seller stated them, ingested verbatim. Absent on shipments created before the amounts-first contract, and on any order whose originator sent none. |
orderId - String
|
The unique order id |
otherDocuments - [OtherDocument]
|
Additional documents related to the shipment, like invoices. |
parcels - [Parcel]
|
List of parcels in this shipment, each with their own dimensions, weights, and product distribution. |
paymentMethod - ShipmentPaymentMethodEnum
|
Customer's payment method. |
pickupAddress - PickupAddress
|
The address where the package should be picked up from. |
pickupDate - Date
|
Date "YYYY-MM-DD" that the delivery company should receive the package from the shop. Defaults to today |
pricingEtag - String
|
What Eshop.pricingEtag was when availableRates were quoted. An opaque entity tag (RFC 9110): compare two values for equality only; never parse or order them. It changes only when the rates are quoted again, so a replayed request returns the value of the original quote. Null when the shipment was never quoted, was quoted before this field existed, or its rates were priced from two different sets of inputs. |
products - [Product]
|
List of products in the shipment. |
productsQuantity - Int
|
The units that ship: Σ quantity of the lines whose requiresShipping is not false. Derived by the server from the lines; 0 when nothing ships. |
recipient - Recipient!
|
Recipient details including address and contact information. Empty on a counter sale (an IN_STORE rate) with no customer. |
recipientLogistics - RecipientLogistics
|
Customer-provided logistics company details when using recipient-logistics delivery option. |
replacedBy - ShipmentLink
|
The shipment booked for the edited order that replaces this one; null otherwise. |
replaces - ShipmentLink
|
The shipment this one replaces: an edited order is booked as a new shipment naming the original (replacesShipment). Null otherwise. |
requestedOptions - [String!]
|
Catalogue option codes the buyer or merchant asked for (saturday-delivery, cod-cheque). Evaluated against each carrier’s catalogue at quote; a carrier that cannot honour one is refused with a reason on its rate, never quoted without it. |
requiresShipping - Boolean
|
Whether any part of this order is shipped. Resolved by the server from the order lines, or from the value the integration supplied. When false, no rates were requested and costSummary.deliveryCostCents is zero. |
returnShipmentVoucher - ShipmentVoucher
|
Shipment-level RETURN voucher (master tracking number for the reverse-logistics shipment) for carriers that issue one. Independent lifecycle from shipmentVoucher. |
selectedRate - SelectedRate
|
The selected service and rate for this shipment: the quote as selected. Once the shipment binds, costs.charge, deliveryCharge and codFee publish what the buyer was bound to (charge.buyer), not the quote’s derivation: each TaxedMoney whole, its statedCents the bound amount on the record’s basis at the record’s rate. finalPriceCents, vatBasis, vatRate and the itemisation stay the quote’s, and an admin repricing is charge.buyer (source RATE_PRICING_PATCH, its itemisation in patch.components). negotiatedCosts is served from charge.carrier, which the selection does not store. |
senderNotes - String
|
Sender's notes. |
shipmentPurpose - ShipmentPurposeEnum
|
The purpose of the shipment. |
shipmentVoucher - ShipmentVoucher
|
Shipment-level FORWARD voucher (master tracking number) for carriers that issue one. Null for carriers that only return per-piece vouchers. Use this as the canonical handle for shipment-level operations (tracking polling, pickup creation, cascade cancellation). The reverse-logistics counterpart lives on returnShipmentVoucher. |
shipper - Shipper
|
Shipper details including address and contact information. |
shippingRegionType - ShippingRegionTypeEnum
|
The type of shipping region. |
status - ShipmentStatusEnum
|
Transction's status. |
storeConnection - StoreConnection
|
The connection storeConnectionId names, as the eshop holds it now: its platform, store domain and status, DISCONNECTED or RETIRED once it has ended. Null when the shipment records none, when the connection was deleted by a disconnect before connections were kept, or, for a store connection's key, when it is not the key's own connection. |
storeConnectionId - ObjectID
|
The store connection (StoreConnection._id) that created this shipment or bound its order. Order ids are unique per connection; null means none was stated (the dashboard, a CSV import, a caller that sends no connection, and every shipment from before connections were recorded), and those shipments share one scope per eshop. Set once and never changed; kept after the connection is disconnected. A shipment learned any way other than your own response is yours only when this equals your connection id; null proves nothing. |
storeFreeShipping - ShipmentStoreFreeShipping
|
The store's own free shipping as the rate request stated it; null when the shipment has no grant. |
storeManagedFields - [StoreManagedFieldEnum!]!
|
The fields the store owns on this shipment. Empty unless the server applies syncs, the shipment's store connection declares ORDER_SYNC, and the store has synced this shipment: from its first accepted syncStoreOrder (storeSync.appliedSourceVersion set), not from its booking. A non-operator edit that changes one is refused with updateShipment.fieldManagedByStore; an echo of the stored value passes. |
storeShipments - [StoreShipment!]!
|
Shipments the merchant made in the store rather than through Pircel, as the store reported them. Recorded only. |
storeSync - ShipmentStoreSync
|
Where this shipment stands with its store: the order state the store last applied with syncStoreOrder, and the outbound version the store pulls from storeShipmentChanges with its acknowledgement. Null until the store has synced the order or something about the shipment has changed for its store connection. |
syncIssues - [ShipmentSyncIssue!]!
|
Disagreements between the store's order and the shipment that a sync did not settle, open and resolved, oldest first. |
synthetic - ShipmentSynthetic
|
Set when the synthetic shopper created this shipment; null for real orders. |
trackingDetails - TrackingDetails
|
Tracking details for the shipment. |
unassociatedVouchers - [UnassociatedVoucher!]
|
Vouchers returned by the carrier that the adapter could not confidently associate with a specific parcel. Should be empty for healthy shipments; a non-empty list indicates an adapter mapping problem worth auditing. |
unavailableRates - [DeliveryRate]
|
Carriers that could not price this destination (errored or returned no service). Kept separate from availableRates so clients never treat them as selectable or as a €0 option. |
vatDetails - VatDetails
|
VAT preferences and information for this shipment. |
viewerCanOverrideStoreManagedFields - Boolean!
|
Whether the requester may change the fields in storeManagedFields: true for an operator. The override is audited, and the store's next change to the field replaces it. |
viewerEditableStoreManagedFields - [StoreManagedFieldEnum!]!
|
The fields in storeManagedFields the requester may change now, each change listed for the store to write back: every one for an operator; for anyone else, on a connection that declares WRITES_BACK_PIRCEL_EDITS, the recipient's (RECIPIENT_ADDRESS, RECIPIENT_NAME_PHONE, RECIPIENT_EMAIL) unless an open EDIT_CONFLICT holds it. Empty otherwise. |
Example
{
"_id": "5e5677d71bdc2ae76344968c",
"auditLog": [ShipmentAuditEntry],
"availableRates": [DeliveryRate],
"buyerNotes": "xyz789",
"charge": ShipmentCharges,
"checkout": ShipmentCheckout,
"checkoutCompletedAt": "2007-12-03T10:15:30Z",
"codCollectible": CodCollectible,
"codDeclaration": CodDeclaration,
"collectedAt": "2007-12-03T10:15:30Z",
"costSummary": CostSummary,
"createdAt": "2007-12-03T10:15:30Z",
"documentUpload": DocumentUploadEligibility,
"effectiveDate": "2007-12-03T10:15:30Z",
"eshop": Eshop,
"freeShipping": ShipmentFreeShipping,
"freeShippingDecision": FreeShippingDecision,
"geniki": GenikiFields,
"holds": [ShipmentHold],
"isB2BInvoice": true,
"notificationsSent": [NotificationSent],
"orderAmounts": OrderAmounts,
"orderId": "abc123",
"otherDocuments": [OtherDocument],
"parcels": [Parcel],
"paymentMethod": "AFTERPAY_CLEARPAY",
"pickupAddress": PickupAddress,
"pickupDate": "2007-12-03",
"pricingEtag": "abc123",
"products": [Product],
"productsQuantity": 987,
"recipient": Recipient,
"recipientLogistics": RecipientLogistics,
"replacedBy": ShipmentLink,
"replaces": ShipmentLink,
"requestedOptions": ["abc123"],
"requiresShipping": true,
"returnShipmentVoucher": ShipmentVoucher,
"selectedRate": SelectedRate,
"senderNotes": "xyz789",
"shipmentPurpose": "GIFT",
"shipmentVoucher": ShipmentVoucher,
"shipper": Shipper,
"shippingRegionType": "DOMESTIC",
"status": "BOOKING_UNRESOLVED",
"storeConnection": StoreConnection,
"storeConnectionId": "5e5677d71bdc2ae76344968c",
"storeFreeShipping": ShipmentStoreFreeShipping,
"storeManagedFields": ["CANCELLATION"],
"storeShipments": [StoreShipment],
"storeSync": ShipmentStoreSync,
"syncIssues": [ShipmentSyncIssue],
"synthetic": ShipmentSynthetic,
"trackingDetails": TrackingDetails,
"unassociatedVouchers": [UnassociatedVoucher],
"unavailableRates": [DeliveryRate],
"vatDetails": VatDetails,
"viewerCanOverrideStoreManagedFields": false,
"viewerEditableStoreManagedFields": ["CANCELLATION"]
}
ShipmentAuditChange
Fields
| Field Name | Description |
|---|---|
from - JSON
|
Value before the change (null when the field was unset). Enum values are their GraphQL enum names, as Shipment returns the field at path, whatever spelling the entry was stored with; values of fields without an enum are as recorded. |
path - String!
|
Dot path of the changed field |
to - JSON
|
Value after the change (null when the field was cleared). Enum values are their GraphQL enum names, as Shipment returns the field at path, whatever spelling the entry was stored with; values of fields without an enum are as recorded. |
Example
{"from": {}, "path": "xyz789", "to": {}}
ShipmentAuditEntry
Fields
| Field Name | Description |
|---|---|
_id - ID!
|
|
actor - User
|
The user who performed the action. Null for api-key and system actors, and for an ADMIN actor unless an admin reads the entry: everyone else reads actorType: ADMIN only. |
actorType - AuditActorTypeEnum!
|
Which kind of caller performed the action |
changes - [ShipmentAuditChange!]
|
Per-field before/after values for field-edit events (empty otherwise). Enum values in from and to are GraphQL enum names: the STORE_* events record them that way, and older events are mapped on read. |
createdAt - DateTime!
|
When the action was performed |
event - ShipmentAuditEventEnum!
|
The kind of change this entry records |
metadata - JSON
|
Free-form event context (e.g. created/canceled voucher codes), returned as recorded, except that what an operator typed or chose (reason and to on STATUS_FORCED) is returned to admins only. Enum values recorded here are GraphQL enum names, e.g. hold reasons on the STORE_HOLD_* and PIRCEL_HOLD_* events, and an issue's kind, field, severity and resolution on the SYNC_ISSUE_* events. |
store - ShipmentAuditStoreOrigin
|
The store the change came from: set whenever the store's own API key made the request (syncStoreOrder, the booking, cancelShipment, a label), naming the shipment's store connection; null when a person or Pircel made it, and on a shipment with no store connection. |
summary - String
|
Short human-readable description of the event |
Example
{
"_id": "4",
"actor": User,
"actorType": "ADMIN",
"changes": [ShipmentAuditChange],
"createdAt": "2007-12-03T10:15:30Z",
"event": "ADDRESS_CHANGED",
"metadata": {},
"store": ShipmentAuditStoreOrigin,
"summary": "abc123"
}
ShipmentAuditEventEnum
Description
The kinds of events recorded in a shipment audit log entry. Field-edit events carry changes; the rest carry metadata.
Values
| Enum Value | Description |
|---|---|
|
|
The recipient shipping country changed during checkout (see changes) |
|
|
The shipment was finalized at checkout (carrier, service and delivery cost in metadata) |
|
|
The products/parcels of an order-bound shipment changed (see changes) — surfaced because a bound order should not have its contents mutated |
|
|
A manual cost override was applied or changed |
|
|
The shipment was added to a carrier pickup list |
|
|
Pircel held the shipment for an issue it opened (metadata.reasons: SYNC_ISSUE or REPLACES_SHIPPED_ORDER). store names the store when its request caused it. |
|
|
Pircel released its hold because the issue behind it closed, or because the shipment closed (metadata.releasedOn, the status it closed on) (metadata.reasons). store names the store when its request caused it. |
|
|
Individual selected-rate price components were overridden (modifyShipmentRatePricing) |
|
|
The selected delivery company / service rate changed |
|
|
The shipment was canceled |
|
|
One or more editable shipment fields changed (see changes) |
|
|
The order was placed without a shipper, so the eshop's default address-book entry became it (changes: shipper.addressBookEntry). |
|
|
An operator set the status outside the transition table (metadata: from and to, the statuses as ShipmentStatusEnum names, and reason; to and reason are returned to admins only). |
|
|
The store changed the recipient address (changes; store names the store). |
|
|
The store changed the order money or the payment method (changes; store names the store). |
|
|
The store changed the recipient's name, company, phone or email (changes; store names the store). |
|
|
The store changed the lines still to ship (changes; store names the store). |
|
|
The store held the order (metadata.reasons; store names the store). |
|
|
The store released a hold, or the hold was released because the shipment closed (metadata.releasedOn, the status it closed on) (metadata.reasons; store names the store). |
|
|
A sync issue was opened (metadata: issueId, kind, field, severity). |
|
|
A sync issue was closed (metadata: issueId, kind, field, resolution). |
|
|
The shipment / parcel vouchers were canceled (metadata.canceledCodes). By SYSTEM, with metadata.requestedBy naming the mutation, when the carrier voided them for a call whose own move could not land. |
|
|
A voucher / label was created for the shipment |
Example
"ADDRESS_CHANGED"
ShipmentAuditStoreOrigin
Description
The store a change came from.
Example
{
"platform": "MAGENTO2",
"sourceVersion": 987,
"storeConnectionId": "5e5677d71bdc2ae76344968c"
}
ShipmentCharge
Description
One binding of one leg of a shipment’s delivery charge. Append-only: a change is a new record with the next sequence that supersedes the current one, whose amountCents is what it replaced. Integer cents on a stated basis; netCents/taxCents/grossCents are null when the basis is unknown, never guessed.
Fields
| Field Name | Description |
|---|---|
amountCents - Int!
|
The bound figure, integer cents, on basis. |
basis - VatBasis!
|
|
carrierProfile - ChargeCarrierProfile
|
|
contentHash - String!
|
|
createdAt - DateTime
|
|
currencyCode - CurrencyCode!
|
|
event - ChargeEvent!
|
|
freeShipping - ChargeFreeShipping
|
|
grossCents - Int
|
|
id - ObjectID!
|
|
leg - ChargeLegEnum!
|
|
legacy - ChargeLegacy
|
|
lines - [ChargeLine!]
|
|
netCents - Int
|
|
order - ChargeOrder
|
|
override - ChargeOverride
|
|
patch - ChargePatch
|
|
platform - ChargePlatform
|
|
pricingTrace - PricingTrace
|
|
quote - ChargeQuote
|
|
schemaVersion - Int!
|
|
sequence - Int!
|
|
shipment - ObjectID!
|
|
source - ChargeSourceEnum!
|
|
storeFreeShipping - ChargeStoreFreeShipping
|
Present when the store's own free shipping priced this buyer record; null otherwise. |
supersededCharge - ShipmentCharge
|
The record this one replaced, so a CANCELLED record shows what it reversed without a second query; null on the first. |
supersedes - ObjectID
|
The record this one replaced; null on the first. |
taxCents - Int
|
|
vat - ChargeVat
|
Example
{
"amountCents": 987,
"basis": "EX_VAT",
"carrierProfile": ChargeCarrierProfile,
"contentHash": "xyz789",
"createdAt": "2007-12-03T10:15:30Z",
"currencyCode": "EUR",
"event": ChargeEvent,
"freeShipping": ChargeFreeShipping,
"grossCents": 123,
"id": "5e5677d71bdc2ae76344968c",
"leg": "BUYER",
"legacy": ChargeLegacy,
"lines": [ChargeLine],
"netCents": 987,
"order": ChargeOrder,
"override": ChargeOverride,
"patch": ChargePatch,
"platform": ChargePlatform,
"pricingTrace": PricingTrace,
"quote": ChargeQuote,
"schemaVersion": 987,
"sequence": 987,
"shipment": "5e5677d71bdc2ae76344968c",
"source": "CANCELLED",
"storeFreeShipping": ChargeStoreFreeShipping,
"supersededCharge": ShipmentCharge,
"supersedes": "5e5677d71bdc2ae76344968c",
"taxCents": 123,
"vat": ChargeVat
}
ShipmentCharges
Description
The current charge records of a shipment: buyer, what the buyer was bound to pay for delivery; carrier, what Pircel expects the carrier to bill. Absent until the shipment binds (checkout completes, an override, a no-delivery) and on shipments the backfill has not reached.
Fields
| Field Name | Description |
|---|---|
buyer - ShipmentCharge
|
|
carrier - ShipmentCharge
|
Example
{
"buyer": ShipmentCharge,
"carrier": ShipmentCharge
}
ShipmentCheckout
Description
How and where the customer placed the order: checkout flow/architecture, whether it was an express (accelerated) checkout, and the page it started from. Independent of paymentMethod (how they paid) and source (customer-checkout vs merchant-created).
Fields
| Field Name | Description |
|---|---|
entryPoint - ShipmentCheckoutEntryPointEnum
|
Storefront page the order was initiated from. |
flow - ShipmentCheckoutFlowEnum
|
Storefront checkout flow / architecture the order came through. |
isExpress - Boolean
|
Whether the order used an express / accelerated one-tap wallet checkout (e.g. Apple Pay, Google Pay) that bypasses the standard form. Correlate with paymentMethod to identify the specific wallet. |
Example
{"entryPoint": "CART", "flow": "BLOCK", "isExpress": false}
ShipmentCheckoutEntryPointEnum
Description
The storefront page from which the order was initiated. Most meaningful for express checkouts, which can start outside the checkout page.
Values
| Enum Value | Description |
|---|---|
|
|
Initiated from the cart page. |
|
|
Initiated from the checkout page (the default for the standard, non-express flow). |
|
|
Initiated from the mini-cart / cart drawer. |
|
|
Initiated from a product page (e.g. an express button that skips the cart). |
Example
"CART"
ShipmentCheckoutFlowEnum
Description
The storefront checkout flow / architecture an order came through. Platform-agnostic: each platform maps its surfaces onto these buckets.
Values
| Enum Value | Description |
|---|---|
|
|
Modern native block / component checkout rendered by the platform (WooCommerce Cart & Checkout Blocks, backed by the Store API; Shopify's checkout with its UI extensions). |
|
|
Legacy server-rendered native checkout (WooCommerce [woocommerce_checkout] shortcode, Magento Luma one-page). |
|
|
Custom / headless frontend that creates the order programmatically through the platform commerce API (WooCommerce Store API, Shopify Storefront/Cart API, Magento PWA GraphQL). |
Example
"BLOCK"
ShipmentCheckoutInput
Description
Checkout provenance for the order: flow/architecture, express flag, and entry-point page. Set by the storefront plugin at order creation.
Fields
| Input Field | Description |
|---|---|
entryPoint - ShipmentCheckoutEntryPointEnum
|
Storefront page the order was initiated from. |
flow - ShipmentCheckoutFlowEnum
|
Storefront checkout flow / architecture the order came through. |
isExpress - Boolean
|
Whether the order used an express / accelerated one-tap wallet checkout that bypasses the standard form. |
Example
{"entryPoint": "CART", "flow": "BLOCK", "isExpress": true}
ShipmentFreeShipping
Description
Free shipping tracking information when a free shipping promotion was applied to a shipment
Fields
| Field Name | Description |
|---|---|
applied - Boolean!
|
Whether free shipping was applied to this shipment |
appliedRegionSource - AppliedRegionSourceEnum
|
Whether the applied free shipping came from a named rule or the rest-of-world fallback |
appliedRuleId - ObjectID
|
Stable reference to the matched rule subdocument; absent when the rest-of-world fallback was used |
appliedRuleName - String
|
Snapshot of the matched rule name (denormalized so historical shipments survive renames or deletions) |
checkoutDisplay - FreeShippingCheckoutDisplayEnum
|
Snapshot of the checkout display mode when free shipping was applied |
codFeeCharged - Float
|
COD fee the buyer pays when free shipping is applied and they choose cash on delivery (0 if not COD, or waived), on the order's basis: the configured fee as entered on a VAT-inclusive order, its net at the order's rate on a net-priced one. It REPLACES the delivery charge under free shipping rather than adding to it. Read its basis from vatDetails.valueAddedTaxIncluded, never from the eshop or a rate's vatBasis; Costs.codSurchargeCents is always net, so never add the two. |
defaultCarrier - DeliveryCompany
|
The eshop default carrier used for free shipping, populated from the DB to reflect current carrier state |
discountAmount - Float
|
Amount discounted from the delivery cost (originalCost - codFeeCharged for full free shipping) |
originalCost - Float
|
The shipping cost that would have been charged without free shipping, used for analytics and invoicing |
originalCostUnknownReason - FreeShippingOriginalCostUnknownReasonEnum
|
Why originalCost and discountAmount are absent: the saving is unknowable and is recorded as unknown, never as a number |
reason - String
|
Human-readable explanation of why free shipping was applied |
threshold - Float
|
The free shipping threshold at the time this shipment was created |
Example
{
"applied": false,
"appliedRegionSource": "REST_OF_WORLD",
"appliedRuleId": "5e5677d71bdc2ae76344968c",
"appliedRuleName": "abc123",
"checkoutDisplay": "ALL_CARRIERS",
"codFeeCharged": 987.65,
"defaultCarrier": DeliveryCompany,
"discountAmount": 123.45,
"originalCost": 123.45,
"originalCostUnknownReason": "NO_RATE_QUOTED",
"reason": "xyz789",
"threshold": 123.45
}
ShipmentHold
Description
A reason not to fulfil the shipment yet. A held shipment is refused a label (createVoucher.shipmentOnHold) and a pickup list (createPickupList.shipmentOnHold); it can still be canceled, and its status is untouched.
Fields
| Field Name | Description |
|---|---|
note - String
|
The holder's own words, such as the store's status label; null when none was given. |
reason - ShipmentHoldReasonEnum!
|
Why the shipment is held. |
since - DateTime!
|
When Pircel first saw this hold. Set by the server and kept while the same source and reason persist. |
source - ShipmentHoldSourceEnum!
|
Who placed it. STORE holds are released only by the store; PIRCEL holds only by resolving their sync issue. |
Example
{
"note": "xyz789",
"reason": "AWAITING_PAYMENT",
"since": "2007-12-03T10:15:30Z",
"source": "PIRCEL"
}
ShipmentHoldReasonEnum
Description
Why a shipment is held. The store reasons are those of StoreHoldReasonEnum; SYNC_ISSUE and REPLACES_SHIPPED_ORDER are placed by Pircel.
Values
| Enum Value | Description |
|---|---|
|
|
The order waits for a payment the buyer has not completed (Magento state pending_payment). |
|
|
The merchant put the order on hold (Magento state holded); note carries the store status label. |
|
|
Another reason the store has for not fulfilling yet; note says which. |
|
|
The payment is under review by the gateway or the merchant (Magento state payment_review). |
|
|
The store flagged the order as suspected fraud (Magento status fraud, in any state). |
|
|
This shipment books an edited order (replaces) and waits until the shipment it replaces is canceled, so one purchase cannot ship twice. Released when that shipment is canceled, or when a person resolves the REPLACES_SHIPPED_ORDER issue once it is ACTIONABLE. |
|
|
An open ADDRESS_INVALID or ADDRESS_NOT_SERVICEABLE sync issue. Released when the issue resolves. |
Example
"AWAITING_PAYMENT"
ShipmentHoldSourceEnum
Description
Who placed a hold.
Values
| Enum Value | Description |
|---|---|
|
|
Pircel, for a condition it detected. Released only by resolving the sync issue behind it. |
|
|
The store, through the booking or syncStoreOrder. Released only by the store. |
Example
"PIRCEL"
ShipmentLink
Description
Another shipment this one is linked to.
Example
{
"orderId": "xyz789",
"shipmentId": "5e5677d71bdc2ae76344968c"
}
ShipmentPaymentMethodEnum
Description
How the customer paid the eshop for the order. Only cash-on-delivery changes carrier behavior (cash is collected at delivery); for every other method the carrier collects nothing. Use the isCashOnDelivery helper rather than comparing values directly.
Values
| Enum Value | Description |
|---|---|
|
|
Buy now, pay later via Afterpay (Clearpay in the EU/UK). |
|
|
Prepaid via the Amazon Pay wallet. |
|
|
Prepaid via the Apple Pay wallet. |
|
|
Prepaid via Bancontact (Belgium). |
|
|
The customer will pay for the order by bank deposit. |
|
|
The customer will pay for the order by card. |
|
|
Cash paid in person at the store's till, settled at the sale (a counter sale). Not cash on delivery: nothing is collected at delivery. For that, use CASH_ON_DELIVERY. |
|
|
The customer will pay for the order by cash on delivery. |
|
|
Prepaid using a gift card balance. |
|
|
Prepaid via the Google Pay wallet. |
|
|
Prepaid via iDEAL bank transfer (Netherlands). |
|
|
Card installments (e.g. δόσεις); settled as a prepaid card payment. |
|
|
Buy now, pay later via Klarna. |
|
|
The customer will not be charged for the order. |
|
|
Any other method the platform names (e.g. check or money order, purchase order); never cash on delivery. The tender's own label is in orderAmounts.payments[].label. |
|
|
The customer will pay for the order by PayPal. |
|
|
Prepaid via the Revolut Pay wallet. |
|
|
Prepaid via SEPA credit transfer. |
|
|
Prepaid using store credit / voucher balance. |
Example
"AFTERPAY_CLEARPAY"
ShipmentPurposeEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"GIFT"
ShipmentReplacementInput
Description
The shipment an edited order replaces: the original order's. Send shipmentId when known, else orderId, looked up in this booking's order scope.
Example
{
"orderId": "abc123",
"shipmentId": "5e5677d71bdc2ae76344968c"
}
ShipmentSourceEnum
Values
| Enum Value | Description |
|---|---|
|
|
Checkout process |
|
|
Manual entry |
Example
"CHECKOUT"
ShipmentStatusEnum
Values
| Enum Value | Description |
|---|---|
|
|
A label request whose outcome at the carrier is unknown, held for an operator to resolve. A label may exist; nothing is retried on its own. |
|
|
When the shipment has been canceled. |
|
|
The label is being voided at the carrier. Leaves for VOUCHER_CANCELED or CANCELED when the carrier confirms, or back to its label when it refuses. |
|
|
When the customer has completed the checkout process. |
|
|
Handed over to the buyer at the store; closed. Set by the server on a placed counter sale (an IN_STORE rate), never named by a client; it can still be canceled with cancelShipment. |
|
|
When the shipment has been manually created. |
|
|
When the shipment is just created and the customer still edit the delivery form |
|
|
When nothing on the order is shipped, such as a download or a service. A placed order with no parcel: excluded from pickup lists and voucher queues while still counting towards revenue. It returns to CHECKOUT_COMPLETE when the order gains a line that ships, and it can be canceled. |
|
|
When a pickup list has been created for the shipment. |
|
|
When a voucher has been canceled for the shipment. |
|
|
Step 1: The shipping label for the shipment has been created. |
|
|
A label has been requested from the carrier and its answer is awaited. Leaves for VOUCHER_CREATED, or back to the status it was requested from. |
|
|
Step 4 (Optional): The shipment is undergoing customs clearance. |
|
|
Step 6: The shipment has been successfully delivered. |
|
|
Exception: The delivery of the shipment has been canceled. |
|
|
Exception: An exception occurred during shipment delivery. |
|
|
Step 3: The shipment is currently in transit. |
|
|
Step 5: The shipment is out for delivery. |
|
|
Step 2: The shipment has been picked up by the delivery company. |
|
|
Exception: The shipment has been returned. |
Example
"BOOKING_UNRESOLVED"
ShipmentStoreFreeShipping
Description
The store's own free shipping as the rate request stated it. How it priced each rate is Costs.storeFreeShipping.
Example
{"granted": true, "label": "xyz789"}
ShipmentStoreSync
Description
Where this shipment stands with its store. The inbound half is the order state the store last sent with syncStoreOrder; the outbound half counts the changes the store can see, which it pulls with storeShipmentChanges and acknowledges with acknowledgeStoreShipmentChanges.
Fields
| Field Name | Description |
|---|---|
ackedVersion - Int
|
The newest version the store acknowledged. |
appliedSourceVersion - Int
|
The highest syncStoreOrder sourceVersion applied to the shipment; null until the store first syncs the order. |
changedAt - DateTime
|
When version last moved. Null while nothing has changed for the store. |
changedFields - [StoreManagedFieldEnum!]!
|
The store's fields a change made in Pircel (a dashboard user or an operator) altered at a version above the newest one the store acknowledged APPLIED or SKIPPED, for the store to write back to its order. Empty when the store's copy is current. Leaves out a field an open EDIT_CONFLICT holds. A status change, a cancel included, is not listed: version and the status say it. |
lastAckAt - DateTime
|
When the store last acknowledged a version. |
lastAckReason - String
|
The store's reason with its acknowledgement of ackedVersion, when it acknowledged it FAILED or SKIPPED and said why; null otherwise. |
lastChangeOrigin - StoreSyncChangeOriginEnum
|
Who caused the change version last counted. Null while nothing has changed for the store. |
lastError - String
|
The store's reason with its acknowledgement of ackedVersion, when it failed. |
lastInboundAt - DateTime
|
When a syncStoreOrder was last applied to the shipment; null until the store first syncs the order. |
state - StoreSyncStateEnum
|
The store's acknowledgement of the current version: PENDING until it acknowledges that version, then its outcome. Null while nothing has changed for the store. |
version - Int!
|
The outbound version: incremented in the same write as every change the store can see (a label created or voided, a cancellation, a carrier status). A write the store made to its own order fields never moves it. 0 while nothing has changed for the store. The store applies a shipment only when this is greater than the last version it applied. |
Example
{
"ackedVersion": 123,
"appliedSourceVersion": 987,
"changedAt": "2007-12-03T10:15:30Z",
"changedFields": ["CANCELLATION"],
"lastAckAt": "2007-12-03T10:15:30Z",
"lastAckReason": "xyz789",
"lastChangeOrigin": "CARRIER",
"lastError": "abc123",
"lastInboundAt": "2007-12-03T10:15:30Z",
"state": "APPLIED",
"version": 987
}
ShipmentSyncIssue
Description
A disagreement between the store's order and the shipment that a sync did not settle on its own. There is at most one open issue per kind and field: a newer store value updates storeValue, a store value equal to appliedValue resolves it as SUPERSEDED_BY_STORE, and a closed shipment resolves it as MOOT.
Fields
| Field Name | Description |
|---|---|
_id - ObjectID!
|
The issue id, stable across the sync reply and every read; de-duplicate by it. |
appliedValue - JSON
|
What Pircel holds, which is what the label carries, in the field's shape (see storeValue). Null when there is nothing on Pircel's side. |
availableActions - [SyncIssueActionEnum!]!
|
The resolutions resolveShipmentSyncIssue accepts from the requester for this issue now; offer exactly these. Empty once resolved, for an INFORMATIONAL issue, which is a record and closes on its own, and for an operatorOnly issue unless the requester is an operator. APPLY_STORE_VALUE only where the issue holds a store value to put in place; under a live label an address, recipient, contents or collectible value needs the voucher canceled first. A cancel after listing or pickup, a replacement, a hold after listing and a repack offer KEEP_CURRENT only: it acknowledges the issue and Pircel keeps its state. To act on the store's cancel, cancel the shipment with cancelShipment, which settles its open issues as MOOT. |
detectedAt - DateTime!
|
When the issue was opened. |
field - StoreManagedFieldEnum
|
The store-managed field the issue is about. |
kind - SyncIssueKindEnum!
|
What happened. |
operatorOnly - Boolean!
|
Whether only an operator (Pircel support) may resolve it now: a store change to what the label carries (RECIPIENT_AFTER_LABEL, COLLECTIBLE_AFTER_LABEL, CONTENTS_AFTER_LABEL, METHOD_CHANGED) while the shipment is on a pickup list. Read from the shipment's current status, so it follows the shipment on and off the list. Any other requester gets empty availableActions, and resolveShipmentSyncIssue refuses them with resolveShipmentSyncIssue.operatorOnly. |
resolution - SyncIssueResolutionEnum
|
How the issue was closed; null while it is open. |
resolvedAt - DateTime
|
When the issue was closed; null while it is open. |
resolvedBy - User
|
The user who resolved it; null while open, or when the store or Pircel closed it. |
severity - SyncIssueSeverityEnum!
|
ACTIONABLE when a person must decide; only those count in ShipmentsResult.openSyncIssueCount. |
sourceVersion - Int
|
The store's sourceVersion that opened or last updated the issue. Null for an issue no sync opened: a cancel refused after listing or pickup, or an edited order's replacement. |
storeValue - JSON
|
What the store says now. Keys are the GraphQL output field names, by field: RECIPIENT_ADDRESS an Address (addressLine1, addressLine2, addressLine3, city, postcode, county, country, countryCode); RECIPIENT_NAME_PHONE { firstname, lastname, companyName, phone }; RECIPIENT_EMAIL { email }; COD_COLLECTIBLE { amount, currencyCode } in the order currency, appliedValue being the label's declared amount; PAYMENT_METHOD { paymentMethod }; PRODUCT_LINES a list of { _id, storeLineId, externalId, sku, title, quantity, price }; SHIPPING_METHOD { code }, with appliedValue { deliveryCompanySlug, serviceCode }; HOLDS a list of ShipmentHold; CANCELLATION { state }, with appliedValue { status }; STORE_SHIPMENT { storeShipmentId, tracks: [{ number, carrierCode, title }], createdAt }. Null when there is nothing on the store's side. |
Example
{
"_id": "5e5677d71bdc2ae76344968c",
"appliedValue": {},
"availableActions": ["APPLY_STORE_VALUE"],
"detectedAt": "2007-12-03T10:15:30Z",
"field": "CANCELLATION",
"kind": "ADDRESS_INVALID",
"operatorOnly": false,
"resolution": "APPLIED",
"resolvedAt": "2007-12-03T10:15:30Z",
"resolvedBy": User,
"severity": "ACTIONABLE",
"sourceVersion": 123,
"storeValue": {}
}
ShipmentSynthetic
Description
Present only on shipments the synthetic shopper created with a verified token. They never progress past "new" and expire on their own.
Example
{
"expiresAt": "2007-12-03T10:15:30Z",
"issuedAt": "2007-12-03T10:15:30Z",
"nonce": "xyz789",
"verifiedAt": "2007-12-03T10:15:30Z"
}
ShipmentTrackingEventStatusEnum
Values
| Enum Value | Description |
|---|---|
|
|
Step 4 (Optional): The shipment is undergoing customs clearance. |
|
|
Step 6: The shipment has been successfully delivered. |
|
|
Exception: The delivery of the shipment has been canceled. |
|
|
Exception: An exception occurred during shipment delivery. |
|
|
Step 3: The shipment is currently in transit. |
|
|
Step 5: The shipment is out for delivery. |
|
|
Step 2: The shipment has been picked up by the delivery company. |
|
|
Exception: The shipment has been returned. |
|
|
Step 1: The shipping label for the shipment has been created. |
Example
"CUSTOMS_CLEARANCE"
ShipmentVoucher
Description
Shipment-level voucher (master tracking number) for carriers that issue one. Null for carriers that only return per-piece vouchers (TCS).
Fields
| Field Name | Description |
|---|---|
code - String!
|
Carrier-assigned shipment-level identifier. May coincide with the lead parcel's tracking number for some carriers (FedEx, UPS) but is conceptually distinct. |
createdAt - DateTime!
|
|
deliveryCompanyReference - String!
|
Shipment-level reference (INTERNAL_SHORT, no piece suffix) stamped in the carrier's shipment-level reference slot. |
merchantReference - String
|
|
status - VoucherStatusEnum!
|
Example
{
"code": "abc123",
"createdAt": "2007-12-03T10:15:30Z",
"deliveryCompanyReference": "xyz789",
"merchantReference": "xyz789",
"status": "ACTIVE"
}
Shipper
Description
Shipper details including address and contact information.
Example
{
"address": Address,
"addressBookEntry": "5e5677d71bdc2ae76344968c",
"contact": Contact
}
ShipperInput
Description
Input type for shipper details.
Fields
| Input Field | Description |
|---|---|
address - AddressInput
|
Shipper address. |
addressBookEntryId - ObjectID
|
Reference to an address book entry from the Eshop address book. |
contact - ContactInput
|
Shipper contact. |
Example
{
"address": AddressInput,
"addressBookEntryId": "5e5677d71bdc2ae76344968c",
"contact": ContactInput
}
ShippingRegionTypeEnum
Description
Enum representing the type of shipping region.
Values
| Enum Value | Description |
|---|---|
|
|
Shipping within the same country. |
|
|
Shipping between countries in different regions. |
|
|
Shipping between African countries. |
|
|
Shipping between ASEAN member countries. |
|
|
Shipping between Asian countries. |
|
|
Shipping between European countries. |
|
|
Shipping between Middle Eastern countries. |
|
|
Shipping between non-EU European countries. |
|
|
Shipping between North American countries. |
|
|
Shipping between Oceanian countries. |
|
|
Shipping between South American countries. |
|
|
Shipping between USMCA member countries (US, Mexico, Canada). |
|
|
Other shipping region type not covered by other categories. |
Example
"DOMESTIC"
SlaTier
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
Example
"TIER_1"
StatedBasis
Description
Which leg the stated figure is: EX_VAT the net, INC_VAT the gross, UNKNOWN a figure whose VAT position the source did not state (then no other leg is populated).
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
Example
"EX_VAT"
StoreCapabilityEnum
Description
What a connected store declares it does. Pircel keeps no per-platform table: a store states its own capabilities on connectStore or updateStoreConnectionCapabilities.
Values
| Enum Value | Description |
|---|---|
|
|
The store may send a placed order's current state through syncStoreOrder. Declaring it locks nothing by itself: while it is declared and the server runs order sync in enforce mode, a shipment's store fields are store-managed (Shipment.storeManagedFields) from that shipment's first accepted syncStoreOrder. A connection serving several websites declares it when any of them syncs; a website that does not sync leaves its orders editable. To lock an order at once, sync it right after booking it. |
|
|
The store reads Pircel's changes to its shipments from the outbound feed. While it is declared, Pircel alerts its own team when the connection's outboundBacklog stays unacknowledged too long. |
|
|
The store writes the fields storeSync.changedFields lists back to its order, and states outboundVersionApplied on every syncStoreOrder. While it is declared, a dashboard user may change a synced order's recipient (RECIPIENT_ADDRESS, RECIPIENT_NAME_PHONE, RECIPIENT_EMAIL), and a store change to a field Pircel changed first opens EDIT_CONFLICT instead of replacing Pircel's value. |
Example
"ORDER_SYNC"
StoreConnection
Fields
| Field Name | Description |
|---|---|
_id - ObjectID
|
|
apiKey - StoreConnectionKey
|
The key the store authenticates with. Null when none was issued, or when it was revoked while the connection stayed active. |
capabilities - [StoreCapabilityEnum!]!
|
What the store declared it does, on connectStore or updateStoreConnectionCapabilities. Empty when it declared nothing. |
consecutiveFailures - Int
|
Number of consecutive product-cache refresh failures. Resets to 0 on success. When the threshold is reached, status is flipped to ERROR. |
createdAt - DateTime!
|
When Pircel created this connection. A reconnect keeps it; a new installation is a new connection with its own. |
credentialTransport - CredentialTransport
|
How this store accepts its API credentials. Established when the store connects and re-learned if the store stops accepting the header. Read-only; it is a property of the merchant's web server, not a setting. |
disconnectedAt - DateTime
|
When the store or a merchant disconnected this connection. Null unless status is DISCONNECTED. |
expiresAt - DateTime
|
|
externalId - String
|
|
hintDelivery - StoreHintDelivery!
|
How change hints to hintUrl are going; state is NOT_CONFIGURED while the connection has no hintUrl or no signing secret. A connection that is not HEALTHY still syncs, by the store’s poll. |
hintSigningSecretSet - Boolean!
|
Whether the connection holds a secret to sign change hints with. The secret itself is never readable. |
hintUrl - String
|
Where Pircel posts a signed, data-less hint when shipments of this connection change, as the store declared it at connect. |
lastFailedAt - DateTime
|
Timestamp of the most recent failed product-cache refresh |
lastFeedReadAt - DateTime
|
When the store last read storeShipmentChanges for this connection with its own API key; null until it first does. Recorded at most once a minute, so it trails the latest read by up to a minute. An operator's or a user's read is not recorded. |
lastSyncedAt - DateTime
|
|
outboundBacklog - StoreOutboundBacklog
|
The shipment changes this connection's store has not taken yet, whatever its platform, its earlier orders on an ended connection of the same store included, as storeShipmentChanges lists them. Growing while lastFeedReadAt stands still, the store stopped reading the feed; growing while lastFeedReadAt moves, it reads but does not acknowledge. Null when it does not apply: the connection does not declare SHIPMENT_FEED, so its store never acknowledges and a count would mean nothing, or its status is RETIRED or REVOKED. An ERROR connection is still served, and can be overdue: Pircel's own calls to that store are failing, when a stalled backlog is most likely. |
platform - Platform
|
|
pluginVersion - String
|
|
restBaseUrl - String
|
The REST root the store itself reports serving from, as sent at connect. Absent for platforms that don't use one. |
retiredAt - DateTime
|
When a new installation of the same store replaced this connection. Null unless status is RETIRED. |
scopes - [StoreConnectionScope]
|
|
status - ConnectionStatus
|
|
storeCurrencyCode - String
|
ISO 4217 code the store reported at connect. Absent for connections made before the field existed, by a platform that does not send it, and once the connection is disconnected. |
storeDomain - String
|
Example
{
"_id": "5e5677d71bdc2ae76344968c",
"apiKey": StoreConnectionKey,
"capabilities": ["ORDER_SYNC"],
"consecutiveFailures": 987,
"createdAt": "2007-12-03T10:15:30Z",
"credentialTransport": "HEADER",
"disconnectedAt": "2007-12-03T10:15:30Z",
"expiresAt": "2007-12-03T10:15:30Z",
"externalId": "xyz789",
"hintDelivery": StoreHintDelivery,
"hintSigningSecretSet": false,
"hintUrl": "abc123",
"lastFailedAt": "2007-12-03T10:15:30Z",
"lastFeedReadAt": "2007-12-03T10:15:30Z",
"lastSyncedAt": "2007-12-03T10:15:30Z",
"outboundBacklog": StoreOutboundBacklog,
"platform": "MAGENTO2",
"pluginVersion": "xyz789",
"restBaseUrl": "xyz789",
"retiredAt": "2007-12-03T10:15:30Z",
"scopes": ["READ_COUPONS"],
"status": "ACTIVE",
"storeCurrencyCode": "abc123",
"storeDomain": "abc123"
}
StoreConnectionKey
Fields
| Field Name | Description |
|---|---|
expiresAt - DateTime
|
|
hint - String!
|
The key's prefix and its last 4 characters, so a merchant can tell which key a store holds. The key itself is never readable. |
issuedAt - DateTime!
|
|
origin - StoreKeyOrigin!
|
|
revokedAt - DateTime
|
|
revokedReason - StoreKeyRevocationReason
|
|
scopes - [StoreKeyScope!]!
|
Example
{
"expiresAt": "2007-12-03T10:15:30Z",
"hint": "xyz789",
"issuedAt": "2007-12-03T10:15:30Z",
"origin": "AUTHORIZED",
"revokedAt": "2007-12-03T10:15:30Z",
"revokedReason": "RETIRED",
"scopes": ["STORE_INTEGRATION"]
}
StoreConnectionScope
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"READ_COUPONS"
StoreFreeShippingCodFee
Description
Who pays the cash-on-delivery fee when the store grants free shipping itself.
Values
| Enum Value | Description |
|---|---|
|
|
The buyer pays the service's own cash-on-delivery fee (Costs.codFee); delivery stays free. |
|
|
The merchant absorbs the fee and the buyer pays nothing. The default. |
Example
"CHARGE"
StoreFreeShippingInput
Description
The store's own free shipping for a shipment, which the rate request would not show otherwise.
Fields
| Input Field | Description |
|---|---|
granted - Boolean!
|
True when the store gives free shipping for the whole shipment, such as by a cart rule. False states there is none. Free shipping on some items only is not a grant. |
label - String
|
The store's name for the grant, such as the cart rule's label. Recorded, never priced. |
Example
{"granted": true, "label": "xyz789"}
StoreHintDelivery
Description
How change hints to the connection's hintUrl are going. A store whose hints are not delivered still syncs, by its poll, just more slowly.
Fields
| Field Name | Description |
|---|---|
failingSince - DateTime
|
When the current run of failures began. Null while hints are delivered. |
lastAttemptAt - DateTime
|
|
lastDeliveredAt - DateTime
|
|
lastError - String
|
Why the last failed attempt failed: the HTTP status, a timeout or a network error. Never the store’s response body. |
lastFailedAt - DateTime
|
|
lastStatusCode - Int
|
The HTTP status of the last attempt that got an answer, delivered or not. |
state - StoreHintDeliveryStateEnum!
|
Example
{
"failingSince": "2007-12-03T10:15:30Z",
"lastAttemptAt": "2007-12-03T10:15:30Z",
"lastDeliveredAt": "2007-12-03T10:15:30Z",
"lastError": "abc123",
"lastFailedAt": "2007-12-03T10:15:30Z",
"lastStatusCode": 123,
"state": "FAILING"
}
StoreHintDeliveryStateEnum
Values
| Enum Value | Description |
|---|---|
|
|
Hints are failing since failingSince and are retried with backoff for up to six hours each. The store keeps up by its poll. |
|
|
Hints are sent, and the last one was delivered (or none was needed yet). |
|
|
The connection has no hintUrl or no signing secret, so no hints are sent. The store keeps up by its poll. |
|
|
The store refused a hint in a way retrying cannot fix (a rejected signature, an unknown route, a malformed request, a redirect). No hint is retried until the store provisions its url or secret again (connectStore, rotateStoreHintSecret), except one attempt an hour. The store keeps up by its poll. |
Example
"FAILING"
StoreHoldInput
Description
One of the store's holds. Send no since: the server stamps when it first sees each reason.
Fields
| Input Field | Description |
|---|---|
note - String
|
Free text shown with the hold, such as the store's status label. |
reason - StoreHoldReasonEnum!
|
Why the store holds the order. |
Example
{
"note": "abc123",
"reason": "AWAITING_PAYMENT"
}
StoreHoldReasonEnum
Description
Why the store holds an order: what the store itself says means "do not fulfil yet". An unpaid offline order (bank transfer, check) is not a hold.
Values
| Enum Value | Description |
|---|---|
|
|
The order waits for a payment the buyer has not completed (Magento state pending_payment). |
|
|
The merchant put the order on hold (Magento state holded); note carries the store status label. |
|
|
Another reason the store has for not fulfilling yet; note says which. |
|
|
The payment is under review by the gateway or the merchant (Magento state payment_review). |
|
|
The store flagged the order as suspected fraud (Magento status fraud, in any state). |
Example
"AWAITING_PAYMENT"
StoreKeyOrigin
Values
| Enum Value | Description |
|---|---|
|
|
Issued when the merchant approved the store. |
Example
"AUTHORIZED"
StoreKeyRevocationReason
Description
The reasons visible through StoreConnection.apiKey: only an ended connection keeps pointing at its revoked key. A superseded, replayed or operator-revoked key is unlinked from its connection, so its reason lives on the key record and in the audit log.
Values
| Enum Value | Description |
|---|---|
|
|
A new installation of the same store replaced the connection. |
Example
"RETIRED"
StoreKeyScope
Values
| Enum Value | Description |
|---|---|
|
|
Quote, book, update, cancel and read this store's shipments; sync its orders and read its shipment feed; read the eshop's shipping settings; manage its own connection. It cannot change the eshop's settings, carriers, invoices or users, and it sees only its own connection. |
Example
"STORE_INTEGRATION"
StoreManagedFieldEnum
Description
A field the store owns on a shipment. The same names are used by syncStoreOrder's reply, by sync issues and by Shipment.storeManagedFields.
Values
| Enum Value | Description |
|---|---|
|
|
The order's cancellation, reported through cancelShipment. An issue field only. |
|
|
orderAmounts.amountDue on a cash-on-delivery order: what the courier collects.
|
|
|
The store's holds (Shipment.holds with source STORE). |
|
|
orderAmounts.payments, prepaidTotal, refunds and refundedTotal.
|
|
|
Every other orderAmounts field: grandTotal, the subtotal, discount, shipping, fee and tax totals, their lines, pricesIncludeTax and currency. |
|
|
paymentMethod.
|
|
|
The store's paths of each line (storeLineId, externalId, sku, title, quantity, price, lineSubtotal, lineDiscount, lineTotal, requiresShipping, kind, categories, image, metadata). A line's customs and physical paths are Pircel's. |
|
|
recipient.address.
|
|
|
recipient.contact.email.
|
|
|
recipient.contact first name, last name, company name and phone.
|
|
|
What the buyer is charged for delivery: Pircel's buyer charge, which a cost override or an operator's modifyShipmentRatePricing changes. A feed field only (ShipmentStoreSync.changedFields). |
|
|
The shipping method. From the store, its method code, compared only: a sync never re-selects a rate. In the feed (ShipmentStoreSync.changedFields), Pircel's selection, which a move changes. |
|
|
A shipment the merchant made in the store rather than through Pircel. An issue field only. |
Example
"CANCELLATION"
StoreOutboundBacklog
Description
What Pircel changed on a connection's shipments that its store has not taken yet, read from the store's own acknowledgements. A store whose worker stopped shows here even while it still answers hints.
Fields
| Field Name | Description |
|---|---|
failed - Int!
|
Of unacknowledged, the shipments the store acknowledged FAILED at their current storeSync.version. |
oldestUnacknowledgedAt - DateTime
|
The storeSync.changedAt of the oldest of them: since when the store has been behind. Null when there are none. |
overdue - Boolean!
|
True exactly when Pircel's backlog check alerts on this connection, whether or not an alert already went out this hour: oldestUnacknowledgedAt is older than Pircel's alert threshold (30 minutes unless configured otherwise). Decided by the same rule as the alert; read it rather than comparing oldestUnacknowledgedAt with a threshold of your own. False while the backlog is empty or younger. |
unacknowledged - Int!
|
Shipments whose current storeSync.version the store has not acknowledged APPLIED or SKIPPED: not acknowledged at all, or acknowledged FAILED. A shipment counts once however many changes it has waiting. |
Example
{
"failed": 987,
"oldestUnacknowledgedAt": "2007-12-03T10:15:30Z",
"overdue": false,
"unacknowledged": 123
}
StoreShipment
Description
A shipment the merchant made in the store rather than through Pircel. Recorded for the record; Pircel does nothing with it.
Fields
| Field Name | Description |
|---|---|
createdAt - DateTime
|
When the store says it was made. |
recordedAt - DateTime!
|
When Pircel first recorded it. |
storeShipmentId - String!
|
The store's id for its shipment. |
tracks - [StoreTrack!]!
|
Its tracking numbers. |
Example
{
"createdAt": "2007-12-03T10:15:30Z",
"recordedAt": "2007-12-03T10:15:30Z",
"storeShipmentId": "abc123",
"tracks": [StoreTrack]
}
StoreSyncChangeOriginEnum
Values
| Enum Value | Description |
|---|---|
|
|
The carrier reported it (a tracking status). |
|
|
Someone in Pircel did it (the dashboard, an operator). |
|
|
The store's own request did it, such as a cancellation it asked for. The store can skip applying its own echo. |
Example
"CARRIER"
StoreSyncStateEnum
Values
| Enum Value | Description |
|---|---|
|
|
The store applied the current version. |
|
|
The store failed to apply the current version. |
|
|
The store has not acknowledged the current version yet. |
|
|
The store received the current version and had nothing to do. |
Example
"APPLIED"
StoreTrack
Description
A tracking number on a shipment the merchant made in the store.
Example
{
"carrierCode": "xyz789",
"number": "xyz789",
"title": "xyz789"
}
String
Description
The String scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.
Example
"xyz789"
SurchargeType
Description
Types of surcharges
Values
| Enum Value | Description |
|---|---|
|
|
Additional handling surcharge |
|
|
Cash on delivery surcharge |
|
|
Delivery area surcharge |
|
|
Fuel surcharge |
|
|
Other surcharge type |
|
|
Saturday delivery surcharge |
Example
"ADDITIONAL_HANDLING"
SyncIssueActionEnum
Description
A person's decision on a sync issue; ShipmentSyncIssue.availableActions lists those an issue accepts. Resolving an issue that holds the shipment releases the hold, whichever action is taken.
Values
| Enum Value | Description |
|---|---|
|
|
Apply the store's value. Offered only for a kind that holds one: an address, the recipient, the contents, the collectible or the shipping method. Under a live label an address, recipient, contents or collectible value is refused; cancel the voucher first. |
|
|
Keep Pircel's state and close the issue; for a kind with nothing to apply (a cancel after listing or pickup, a replacement) it acknowledges the issue. The store keeps showing its own value until it states another. To act on the store's cancel instead, cancel the shipment with cancelShipment, which settles its open issues as MOOT. |
Example
"APPLY_STORE_VALUE"
SyncIssueKindEnum
Description
Why a store's change was not applied, or what it asks a person to decide.
Values
| Enum Value | Description |
|---|---|
|
|
The store's new address failed validation and was not applied; the shipment is held (SYNC_ISSUE) until it resolves. |
|
|
The new address was applied, but the selected service could not be re-quoted for it; the shipment is held (SYNC_ISSUE) until a rate is re-selected or the issue is resolved. |
|
|
The store canceled the order after the shipment was put on a pickup list; only an operator can take it back. |
|
|
The store canceled the order after the carrier collected the parcel; a return is needed. |
|
|
The cash-on-delivery amount, or a payment method change that moves it, arrived after the label declared another amount. |
|
|
The lines still to ship changed after the label. |
|
|
Both sides edited the field: the store changed it before it had written back the change made in Pircel. Neither value is applied or written back until a person resolves it: APPLY_STORE_VALUE takes the store's, KEEP_CURRENT keeps Pircel's and lists it for the store to write back. A store value equal to Pircel's resolves it as SUPERSEDED_BY_STORE. |
|
|
The store held the order after the shipment was put on a pickup list. |
|
|
The store held the order after the carrier collected it. |
|
|
The store states a shipping method other than the first one it stated. A sync never re-selects a rate. |
|
|
The recipient's address, name, company or phone changed after the label. |
|
|
The lines changed before the label, on a shipment whose parcels a person packed: the lines were applied and the parcels need repacking. |
|
|
The booking named a shipment to replace (replacesShipment) that Pircel does not hold. Recorded; the booking stands and nothing is held. |
|
|
An edited order was booked as a new shipment that replaces this one, or this shipment replaces one that has not been canceled. |
|
|
The merchant made a shipment in the store that Pircel did not make. Recorded; nothing is changed. |
Example
"ADDRESS_INVALID"
SyncIssueResolutionEnum
Description
How a sync issue was closed.
Values
| Enum Value | Description |
|---|---|
|
|
A person applied the store's value. |
|
|
A person kept Pircel's value. |
|
|
The issue's cause went away without anyone deciding it: the shipment closed or was canceled, the shipment a replacement waited on was canceled, or a newer address replaced the one it was about. |
|
|
The store stated a value that settles it: one equal to Pircel's, a newer one that was applied, or the withdrawal of its own hold or store shipment. |
Example
"APPLIED"
SyncIssueSeverityEnum
Description
Whether a sync issue needs a person.
Values
| Enum Value | Description |
|---|---|
|
|
A person must decide. Counted in ShipmentsResult.openSyncIssueCount. |
|
|
Recorded for the record: the carrier has the parcel, or nothing needs changing. |
Example
"ACTIONABLE"
TariffBasisKindEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
Example
"FLAT"
TariffChargeCategoryEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"BASE"
TariffRouteEnum
Description
Which agreement answered: the eshop's own or the carrier default.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
Example
"AGREEMENT"
TariffSourceEnum
Description
Where the rate card came from: a checked-in file or the published version in the database.
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
Example
"FILES"
TariffZoneRouteEnum
Description
How a tariff quote chose its zone: a decided route (settlement-match, exact-postcode, single-zone) or a fallback the data did not decide (priority-among-candidates, unmatched-exception, contested-exceptions, remainder, no-postcode).
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example
"SETTLEMENT_MATCH"
TaxModeEnum
Description
How VAT rates are resolved for the charges Pircel prices.
Values
| Enum Value | Description |
|---|---|
|
|
The effective-dated, law-sourced rate table. Requires this profile's accountant-confirmed facts: without confirmedAt every rate resolution fails closed, so a profile switched to LAW without it cannot price at all, and without distanceSalesTaxation every intra-EU distance sale is refused. |
|
|
Reproduces pre-taxation-module behaviour exactly — zero price movement. The default. ⚠️ Its rate map is Cyprus 19% / Greece 24% and 0% everywhere else, so a legacy eshop charges no VAT on international shipping. |
Example
"LAW"
TaxProfile
Description
How VAT is resolved for the charges Pircel prices (shipping and the COD fee), plus the accountant-confirmed facts law mode requires. Read-only over GraphQL — there is no writer and deliberately so: confirmedAt is an attestation, not a setting, and law-mode resolution fails closed without it. Nothing here describes the eshop's own product tax; that stays with the platform.
Fields
| Field Name | Description |
|---|---|
confirmedAt - DateTime
|
When an accountant confirmed the law-mode facts on this profile. Required for LAW mode — resolution fails closed with law-mode-unconfirmed while it is absent, so LAW without this is a profile that cannot price. Enforced where rates resolve rather than on the document, because the query-level updates that write this profile never run a Mongoose cross-field validator. |
confirmedBy - String
|
Who confirmed the law-mode facts (accountant or owner reference), for the audit trail. |
distanceSalesTaxation - DistanceSalesTaxationEnum
|
Where intra-EU distance sales of goods are taxed. Required for LAW mode: null means unstated, and resolution then refuses an intra-EU distance sale with distance-sales-taxation-unstated (a domestic or export supply does not depend on it). Static: an ORIGIN eshop that crosses the threshold is re-set to DESTINATION. |
establishmentCountry - String
|
ISO 3166-1 alpha-2 country the eshop is established in — its merchant of record. Drives origin-rate resolution in law mode. Defaults to GR. |
goodsRateCategory - GoodsRateCategoryEnum
|
VAT rate class of the eshop's goods; only STANDARD is supported today. |
islandEstablishment - String
|
Qualifying Greek island the eshop is established on (Ε.2113/2025 Annex), if any — it grants the reduced 17/9/4 rates on that eshop's supplies in law mode. Accountant-confirmed and never derived from an address: an eshop with an island postcode is not necessarily established there, and the reduced rate belongs to establishment. |
mode - TaxModeEnum
|
Which rate resolution applies. Defaults to LEGACY. |
ossRegistered - Boolean
|
Whether the eshop is registered for the EU One-Stop Shop. Information only: it records how destination VAT is filed. OSS does not choose the rate; distanceSalesTaxation does. |
pricesIncludeVat - Boolean
|
The eshop's declared default for whether its order amounts include VAT — the last rung of the basis ladder, used only when an order carries no per-order tag of its own (orderAmounts.pricesIncludeTax, or the legacy includeVat). A per-shipment tag always wins. Defaults to true, which is why an untagged order from a VAT-exclusive store resolves wrongly unless this is set. |
vatRegistrations - [VatRegistration!]!
|
The states the eshop is VAT-registered in, over time. A collect-from-store order is a local sale at the store, so a store abroad is only taxed where a registration is in force on the store's local day; otherwise resolution refuses it with store-not-registered. establishmentCountry always counts as registered, so an empty list resolves as before. |
Example
{
"confirmedAt": "2007-12-03T10:15:30Z",
"confirmedBy": "xyz789",
"distanceSalesTaxation": "DESTINATION",
"establishmentCountry": "abc123",
"goodsRateCategory": "STANDARD",
"islandEstablishment": "xyz789",
"mode": "LAW",
"ossRegistered": false,
"pricesIncludeVat": true,
"vatRegistrations": [VatRegistration]
}
TaxedMoney
Description
Money that carries a VAT position, in integer cents. statedCents is the figure as the source stated it, on statedBasis; of netCents, taxCents and grossCents either none, one alone, or all three are populated (netCents + taxCents === grossCents exactly) — never two — and ratePercent only beside a leg. An UNKNOWN basis is load-bearing: the stated figure is all that is known.
Fields
| Field Name | Description |
|---|---|
currencyCode - CurrencyCode!
|
ISO 4217 currency of every amount here. Always EUR. |
grossCents - Int
|
|
netCents - Int
|
|
ratePercent - Float
|
|
statedBasis - StatedBasis!
|
|
statedCents - Int!
|
|
taxCents - Int
|
Example
{
"currencyCode": "EUR",
"grossCents": 987,
"netCents": 123,
"ratePercent": 987.65,
"statedBasis": "EX_VAT",
"statedCents": 123,
"taxCents": 987
}
TrackingAccessGrant
Example
{
"accessToken": "abc123",
"expiresAt": "2007-12-03T10:15:30Z"
}
TrackingAccessLevel
Values
| Enum Value | Description |
|---|---|
|
|
Anyone holding the eshop and shipment ids: status, progress and destination city. |
|
|
The request carried a valid link or access token for this shipment: verified is set. |
Example
"PUBLIC"
TrackingAccessTokenStatus
Values
| Enum Value | Description |
|---|---|
|
|
No accessToken was sent. |
|
|
A token Pircel issued for this shipment, past its expiry. Ask the buyer for the email or phone of the order (verifyTrackingAccess). |
|
|
Anything else: malformed, signed with a key no longer held, for another shipment, or verified tracking is switched off. |
|
|
The token grants this shipment: access is VERIFIED. |
Example
"ABSENT"
TrackingDestination
Description
Where the shipment is going, no finer than the city: shown to anyone holding the shipment's id.
Example
{
"city": "xyz789",
"country": "xyz789",
"countryCode": "abc123"
}
TrackingDetails
Fields
| Field Name | Description |
|---|---|
carrierTrackingUrl - String
|
Link to this shipment on the carrier's tracking site, derived on every read from the carrier's current tracking metadata and the shipment's active voucher (the shipment-level voucher first, then parcel vouchers in order). Null when the shipment has no active voucher (never labelled, voucher canceled, or status CANCELED / VOUCHER_CANCELED) or when the carrier offers no deep link. The link stored at labelling is returned only when the carrier record cannot be read or its metadata cannot build a link. |
deliveredAt - DateTime
|
When the shipment was delivered: while the carrier's latest event is DELIVERED, the time of the first event of that final DELIVERED run, the hand-over rather than paperwork filed after it. Null otherwise. |
deliveryCompany - DeliveryCompany
|
Reference to the delivery company |
eshopTrackingUrl - String
|
The buyer's tracking page for this shipment: the eshop's own when set and https, otherwise Pircel's hosted page. Derived on every read from the eshop's current trackingPageUrl and signed with the buyer's link token (#t=). The link stored at labelling is returned only when the eshop cannot be read or its page is not an https URL, and only if that link is https itself. |
estimatedDelivery - DateTime
|
Estimated delivery date |
events - [TrackingEvent]
|
List of tracking events. The label-created event recorded when the label was made is left out once the carrier reports its own. |
isActive - Boolean
|
Whether this tracking detail is active |
lastStatus - ShipmentTrackingEventStatusEnum
|
Last tracking status |
lastSyncedAt - DateTime
|
When the tracking information was last synced with carrier |
lastUpdated - DateTime
|
When the tracking information was last updated |
nextPollAt - DateTime
|
When to next poll for tracking updates |
returnToSender - Boolean
|
Whether the shipment is being returned to sender |
slaTier - SlaTier
|
Service level agreement tier |
voucherCode - String
|
The voucher code for this tracking detail |
Example
{
"carrierTrackingUrl": "xyz789",
"deliveredAt": "2007-12-03T10:15:30Z",
"deliveryCompany": DeliveryCompany,
"eshopTrackingUrl": "xyz789",
"estimatedDelivery": "2007-12-03T10:15:30Z",
"events": [TrackingEvent],
"isActive": false,
"lastStatus": "CUSTOMS_CLEARANCE",
"lastSyncedAt": "2007-12-03T10:15:30Z",
"lastUpdated": "2007-12-03T10:15:30Z",
"nextPollAt": "2007-12-03T10:15:30Z",
"returnToSender": true,
"slaTier": "TIER_1",
"voucherCode": "abc123"
}
TrackingEvent
Fields
| Field Name | Description |
|---|---|
deliveryCompany - TrackingEventDeliveryCompany
|
Minimal carrier identity for this tracking event |
description - String
|
Human-readable description of the tracking event |
location - TrackingLocation
|
Location information for the tracking event |
status - ShipmentTrackingEventStatusEnum!
|
Status code or description for the tracking event |
timestamp - DateTime
|
When the tracking event occurred |
Example
{
"deliveryCompany": TrackingEventDeliveryCompany,
"description": "xyz789",
"location": TrackingLocation,
"status": "CUSTOMS_CLEARANCE",
"timestamp": "2007-12-03T10:15:30Z"
}
TrackingEventDeliveryCompany
Description
Minimal carrier identity attached to a public tracking event
Example
{
"_id": "4",
"logo": Logo,
"name": "xyz789",
"slug": "xyz789"
}
TrackingLocation
Fields
| Field Name | Description |
|---|---|
address - TrackingLocationAddress
|
|
coordinates - TrackingLocationCoordinates
|
Example
{
"address": TrackingLocationAddress,
"coordinates": TrackingLocationCoordinates
}
TrackingLocationAddress
TrackingLocationCoordinates
TrackingOrderLookup
Fields
| Field Name | Description |
|---|---|
accessToken - String!
|
Send as trackShipment(accessToken:) for the VERIFIED view until expiresAt. Keep it in memory or sessionStorage, never in a URL. |
expiresAt - DateTime!
|
When the token stops granting access: two hours from now. |
shipmentId - ObjectID!
|
Pass to trackShipment with the access token. |
Example
{
"accessToken": "xyz789",
"expiresAt": "2007-12-03T10:15:30Z",
"shipmentId": "5e5677d71bdc2ae76344968c"
}
TrackingProgress
Description
The shipment's progress as anyone may see it. Without an active label there are no events and the dates are null.
Fields
| Field Name | Description |
|---|---|
deliveredAt - DateTime
|
When the shipment was delivered: while the carrier's latest event is DELIVERED, the time of the first event of that final DELIVERED run, the hand-over rather than paperwork filed after it. Null otherwise. |
estimatedDelivery - DateTime
|
Estimated delivery date |
lastUpdated - DateTime
|
When the tracking information was last updated |
events - [TrackingProgressEvent!]!
|
Carrier events, oldest first. The label-created event recorded when the label was made is left out once the carrier reports its own. |
returnToSender - Boolean!
|
Whether the shipment is being returned to sender |
Example
{
"deliveredAt": "2007-12-03T10:15:30Z",
"estimatedDelivery": "2007-12-03T10:15:30Z",
"lastUpdated": "2007-12-03T10:15:30Z",
"events": [TrackingProgressEvent],
"returnToSender": true
}
TrackingProgressEvent
Description
A carrier event as anyone may see it: what happened, when, by which carrier and in which city.
Fields
| Field Name | Description |
|---|---|
city - String
|
|
countryCode - String
|
|
deliveryCompany - TrackingEventDeliveryCompany
|
Minimal carrier identity for this tracking event |
status - ShipmentTrackingEventStatusEnum!
|
Status code or description for the tracking event |
timestamp - DateTime
|
When the tracking event occurred |
Example
{
"city": "abc123",
"countryCode": "abc123",
"deliveryCompany": TrackingEventDeliveryCompany,
"status": "CUSTOMS_CLEARANCE",
"timestamp": "2007-12-03T10:15:30Z"
}
TrackingResult
Fields
| Field Name | Description |
|---|---|
access - TrackingAccessLevel!
|
PUBLIC, or VERIFIED when the request carried a valid token for this shipment. |
accessTokenStatus - TrackingAccessTokenStatus!
|
Why the request is or is not verified. |
destination - TrackingDestination!
|
The destination city and country. |
progress - TrackingProgress!
|
The shipment's carrier progress. |
shipmentStatus - ShipmentStatusEnum!
|
The shipment's status. Without an active label it says why: not labelled yet (NEW, CHECKOUT_COMPLETE, MANUALLY_CREATED), label canceled and not yet replaced (VOUCHER_CANCELED), or shipment canceled (CANCELED). |
verified - VerifiedTracking
|
Null unless access is VERIFIED: the recipient, the lines, the parcels, the voucher code, the carrier link and the event detail. |
Example
{
"access": "PUBLIC",
"accessTokenStatus": "ABSENT",
"destination": TrackingDestination,
"progress": TrackingProgress,
"shipmentStatus": "BOOKING_UNRESOLVED",
"verified": VerifiedTracking
}
TrackingResultAddress
Fields
| Field Name | Description |
|---|---|
addressLine1 - String
|
Address line 1 (original input). |
addressLine2 - String
|
Address line 2 (original input). |
addressLine3 - String
|
Address line 3 (original input). |
city - String
|
City (original input). |
country - String
|
Country (original input). |
countryCode - String
|
Country code in ISO 3166-1 alpha-2 format. |
county - String
|
County (original input). |
postcode - String
|
Postcode (original input). |
Example
{
"addressLine1": "abc123",
"addressLine2": "abc123",
"addressLine3": "abc123",
"city": "abc123",
"country": "abc123",
"countryCode": "xyz789",
"county": "abc123",
"postcode": "abc123"
}
TrackingResultContact
TrackingResultEvent
Description
A carrier event on the tracking page, with its full detail.
Fields
| Field Name | Description |
|---|---|
deliveryCompany - TrackingEventDeliveryCompany
|
Minimal carrier identity for this tracking event |
description - String
|
Human-readable description of the tracking event |
location - TrackingResultEventLocation
|
Location information for the tracking event |
status - ShipmentTrackingEventStatusEnum!
|
Status code or description for the tracking event |
timestamp - DateTime
|
When the tracking event occurred |
Example
{
"deliveryCompany": TrackingEventDeliveryCompany,
"description": "abc123",
"location": TrackingResultEventLocation,
"status": "CUSTOMS_CLEARANCE",
"timestamp": "2007-12-03T10:15:30Z"
}
TrackingResultEventLocation
Fields
| Field Name | Description |
|---|---|
address - TrackingLocationAddress
|
Example
{"address": TrackingLocationAddress}
TrackingResultParcel
Fields
| Field Name | Description |
|---|---|
dimensions - ParcelDimensions
|
|
weight - Float
|
Parcel's weight in kilograms. |
Example
{"dimensions": ParcelDimensions, "weight": 987.65}
TrackingResultProduct
TrackingResultRecipient
Fields
| Field Name | Description |
|---|---|
address - TrackingResultAddress
|
Address details. |
contact - TrackingResultContact
|
Contact details. |
Example
{
"address": TrackingResultAddress,
"contact": TrackingResultContact
}
TrackingUrlInformation
Fields
| Field Name | Description |
|---|---|
baseUrl - String
|
|
exampleUrl - String
|
|
parameterName - String
|
|
supportsDeepLink - Boolean
|
|
urlType - TrackingUrlTypeEnum
|
Example
{
"baseUrl": "abc123",
"exampleUrl": "abc123",
"parameterName": "xyz789",
"supportsDeepLink": false,
"urlType": "PATH"
}
TrackingUrlTypeEnum
Values
| Enum Value | Description |
|---|---|
|
|
|
|
|
Example
"PATH"
TransitTime
Description
Delivery time information
Example
{
"estimatedDeliveryDate": "2007-12-03",
"guaranteed": false,
"maxDays": 123,
"minDays": 123
}
TransitTimeInput
Description
Input for delivery time information
Example
{
"estimatedDeliveryDate": "2007-12-03",
"guaranteed": false,
"maxDays": 987,
"minDays": 987
}
UnassociatedVoucher
Description
Vouchers returned by the carrier that an adapter could not map to a specific parcel. Loud-failure escape hatch; engineering should audit shipments with non-empty unassociated lists.
Fields
| Field Name | Description |
|---|---|
code - String!
|
|
rawDeliveryCompanyResponse - JSON
|
Original carrier response fragment, kept verbatim for debugging. |
reason - String
|
Why this voucher could not be associated to a parcel. |
status - VoucherStatusEnum!
|
Example
{
"code": "xyz789",
"rawDeliveryCompanyResponse": {},
"reason": "abc123",
"status": "ACTIVE"
}
User
Fields
| Field Name | Description |
|---|---|
_id - ObjectID
|
Unique identifier for this user account |
email - String
|
User email address |
eshop - Eshop
|
Reference to the e-shop that this user belongs to or manages |
firstname - String
|
User's first name |
lastname - String
|
User's last name |
type - UserTypeEnum
|
User role type (admin, eshop, customer, deliveryCompany) |
Example
{
"_id": "5e5677d71bdc2ae76344968c",
"email": "abc123",
"eshop": Eshop,
"firstname": "xyz789",
"lastname": "abc123",
"type": "ADMIN"
}
UserTypeEnum
Values
| Enum Value | Description |
|---|---|
|
|
System administrator with full access to all features and e-shops |
|
|
|
|
|
Delivery company staff member with access to carrier-specific features |
|
|
E-shop owner or staff member with access to their store's shipping operations |
Example
"ADMIN"
VatBasis
Description
Whether an amount includes VAT.
Values
| Enum Value | Description |
|---|---|
|
|
No VAT included. |
|
|
VAT included; vatAmountCents states how much. |
|
|
The rate source declared no basis. NOT a synonym for ex-vat — treat the amount as uncomparable with tagged ones rather than assuming either way. |
Example
"EX_VAT"
VatDetails
Description
VAT (Value Added Tax) information for a service
Fields
| Field Name | Description |
|---|---|
basisContradiction - Boolean
|
True when the per-order basis signal disagreed with the eshop's declared basis (taxProfile.pricesIncludeVat); the order's signal still resolved valueAddedTaxIncluded. Absent when the eshop declares nothing or the two agree. |
basisSource - String
|
Which signal resolved valueAddedTaxIncluded: "order-tag" (orderAmounts.pricesIncludeTax), "legacy-include-vat" (the includeVat argument), or "eshop-default". Absent on shipments predating the amounts-first contract. |
valueAddedTaxIncluded - Boolean
|
Whether VAT is included in the service prices |
Example
{
"basisContradiction": false,
"basisSource": "abc123",
"valueAddedTaxIncluded": false
}
VatRegistration
Description
A state the eshop is VAT-registered in, for the days it holds. Read-only, written with the rest of the profile.
Fields
| Field Name | Description |
|---|---|
countryCode - String!
|
EU member state (ISO 3166-1 alpha-2) or XI for Northern Ireland. |
established - Boolean!
|
Whether the eshop has an establishment there (its seat, or premises with staff) rather than only a VAT number. An establishment outside establishmentCountry rules out the ORIGIN regime. |
validFrom - String
|
First local calendar day of the registration (YYYY-MM-DD, in that state's time zone). Null means it predates every order. |
validUntil - String
|
Local calendar day the registration ended (YYYY-MM-DD), exclusive. Null means in force. |
Example
{
"countryCode": "abc123",
"established": true,
"validFrom": "abc123",
"validUntil": "xyz789"
}
VerifiedTracking
Description
What only the buyer sees: set when the request carries a valid link or access token for this shipment.
Fields
| Field Name | Description |
|---|---|
carrierTrackingUrl - String
|
Link to this shipment on the carrier's tracking site, derived on every read from the carrier's current tracking metadata and the shipment's active voucher (the shipment-level voucher first, then parcel vouchers in order). Null when the shipment has no active voucher (never labelled, voucher canceled, or status CANCELED / VOUCHER_CANCELED) or when the carrier offers no deep link. The link stored at labelling is returned only when the carrier record cannot be read or its metadata cannot build a link. |
events - [TrackingResultEvent!]!
|
The same events as progress.events, in the same order, with their description and location. |
parcels - [TrackingResultParcel!]!
|
The shipment's parcels: weight and dimensions. |
products - [TrackingResultProduct!]!
|
The shipment's lines: title, quantity and image. |
recipient - TrackingResultRecipient!
|
The recipient's name, company and delivery address. Never an email, phone or geocoded position. |
voucherCode - String
|
The voucher code for this tracking detail |
Example
{
"carrierTrackingUrl": "xyz789",
"events": [TrackingResultEvent],
"parcels": [TrackingResultParcel],
"products": [TrackingResultProduct],
"recipient": TrackingResultRecipient,
"voucherCode": "abc123"
}
VoucherCancellationModeEnum
Values
| Enum Value | Description |
|---|---|
|
|
Canceling the shipment-level voucher cancels every parcel voucher in one carrier call (e.g. UPS void by ShipmentIdentificationNumber). |
|
|
Each parcel voucher must be canceled individually (e.g. FedEx). |
|
|
Carrier doesn't support multi-piece shipments, so there is only one voucher to cancel. |
Example
"CASCADE"
VoucherCapabilityScopeEnum
Values
| Enum Value | Description |
|---|---|
|
|
Carrier accepts customer references both at the shipment level and per parcel. |
|
|
Carrier does not accept any customer reference field. |
|
|
Carrier accepts customer references per parcel only. |
|
|
Carrier accepts customer references at the shipment level only. |
Example
"BOTH"
VoucherStatusEnum
Values
| Enum Value | Description |
|---|---|
|
|
Voucher issued by the carrier and currently valid for tracking, pickup, and printing. |
|
|
Voucher voided by user or system action (cancelVoucher mutation, cascade cancellation, re-issue replacement), or canceled by the carrier before it collected the parcel. Terminal. |
|
|
Voucher auto-expired in the carrier's system, typically by exceeding the carrier's printable / usable window. Terminal. |
|
|
Carrier rejected voucher creation. Terminal; a fresh voucher record must be created to retry. |
|
|
Async voucher creation in flight: carrier accepted the request but hasn't returned a tracking number yet. Most carriers respond synchronously and skip this state. |
Example
"ACTIVE"
VoucherTracking
Example
{
"checkpointAction": "abc123",
"checkpointDateTime": "2007-12-03T10:15:30Z",
"checkpointLocation": "abc123",
"checkpointNotes": "abc123",
"code": "xyz789",
"shipmentId": "5e5677d71bdc2ae76344968c"
}