---
title: "Receive tracking webhook"
method: POST
path: "/parcels-webhook"
tags: ["Webhooks"]
---

# Receive tracking webhook

`POST /parcels-webhook`

## Request

- Base URL: `https://your-domain.example`
- URL: `https://your-domain.example/parcels-webhook`
- Auth: none declared. Required headers: `Parcels-Signature`
- TypeScript: <https://skmtc.dev/parcelsapp/apis/parcels-api-v4/docs/parcels-webhook/post.ts> (a function with typed inputs; its response is checked against the schema)

Parcels sends this JSON payload to the `webhook_url` supplied in `POST /trackings` when an individual shipment finishes or when the full request is complete. Delivery is scoped to that request; it is not a persistent shipment subscription. To check for carrier updates later, create another tracking request with the same tracking number and `webhook_url`.

The `Parcels-Signature` header has format `t=<unix>,v1=<hex>`. Verify it by computing `HMAC_SHA256(secret, t + "." + raw_body)` and comparing it to `v1` with a timing-safe comparison. Reject signatures with an old timestamp, for example older than 5 minutes.

Webhook delivery is retried on network errors or HTTP 4xx/5xx responses. Return any 2xx status after you persist the payload.

## Headers

- `Parcels-Signature` string, required

## Request body

- WebhookPayload
  - `event` 'shipment_completed' | 'batch_completed' | 'tracking_error', required
  - `request_id` string, required
  - `timestamp` string, date-time, required
  - `done` boolean, required
  - `result` TrackingResult
    - `tracking_number` string, required
    - `state` 'processing' | 'completed', required
    - `from_cache` boolean, required: True when Parcels returned fresh cached data immediately instead of starting a new carrier request.
    - `shipment` Shipment
      - `trackingId` string
      - `error` string: Terminal shipment-level tracking error. `ADDITIONAL_FIELDS_REQUIRED` means a carrier such as SEUR needs more recipient identification to complete the lookup; this does not confirm that the tracking number exists. Inspect `input_requirements` to see required fields and alternatives, then retry with valid recipient details. `TIMEDOUT` means Parcels stopped waiting for a stale in-progress request and returned a final result instead of leaving the request processing forever.
      - `accepted_fields` string[]: For `ADDITIONAL_FIELDS_REQUIRED`, API v4 shipment item fields accepted for a retry. Consult `input_requirements` for which fields are required and which are alternatives.
      - `input_requirements` TrackingInputRequirements: Published input rule for a carrier. Absent when a complete rule has not been verified; absence does not promise that no recipient fields are needed. Required fields must be supplied together with at least one any_of field when both lists are present.
        - `required` TrackingInputFieldName[]: Fields to provide for every lookup.
        - `any_of` TrackingInputFieldName[]: Provide at least one of these fields in addition to required fields.
        - `conditional` TrackingInputFieldName[]: The carrier may require these fields for some shipments. Check the carrier-specific instructions for fields that must be supplied together.
      - `status` string
      - `origin` string
      - `destination` string
      - `originCode` string
      - `destinationCode` string
      - `transportMode` 'parcel' | 'postal' | 'express' | 'road_freight' | 'air_cargo' | 'ocean_container': Concrete transport mode. Forecast fallback never crosses this boundary.
      - `fromAirport` string: Origin IATA airport code when explicitly provided for an air-cargo shipment.
      - `toAirport` string: Destination IATA airport code when explicitly provided for an air-cargo shipment.
      - `fromPort` string: Origin UN/LOCODE when explicitly provided for an ocean shipment.
      - `toPort` string: Destination UN/LOCODE when explicitly provided for an ocean shipment.
      - `pieces` number: Shipment piece count when supplied by the carrier.
      - `weight` number: Shipment weight when supplied by the carrier.
      - `weight_unit` string: Unit for `weight`.
      - `volume` number: Shipment volume when supplied by the carrier.
      - `volume_unit` string: Unit for `volume`.
      - `flight_legs` FlightLeg[]: Carrier-supplied air-cargo routing legs. Schedule fields are kept separate from booking/milestone event timestamps and omitted when the carrier does not supply them.
        - `flight_number` string
        - `origin` string: Flight-leg origin IATA code.
        - `destination` string: Flight-leg destination IATA code.
        - `status` string: Carrier-reported status of this leg.
        - `scheduled_departure_date` string, date: Scheduled departure date when the carrier supplies a date but no reliable time.
        - `scheduled_departure` string, date-time: Scheduled departure with the carrier station's offset.
        - `scheduled_arrival` string, date-time: Scheduled arrival with the destination station's offset.
        - `actual_departure` string, date-time: Actual departure confirmed by the carrier.
        - `actual_arrival` string, date-time: Actual arrival confirmed by the carrier.
        - `pieces` number
        - `weight` number
        - `weight_unit` string
        - `volume` number
        - `volume_unit` string
      - `states` TrackingEvent[]: Carrier tracking events. Interactive prompts asking for recipient fields are omitted from API responses and webhooks; when no real events are available this array can be empty.
        - `state` string
        - `location` string
        - `date` string, date-time: Carrier event time with its airport-local UTC offset when the carrier provides only local wall time.
        - `event_code` string: Carrier milestone code when supplied by the source.
        - `station` string: IATA station or airport code associated with the event.
        - `timezone` string: IANA time zone used to interpret the carrier-local event time.
        - `pieces` number: Pieces covered by this event, useful for partial movements.
        - `weight` number: Weight covered by this event when supplied by the carrier.
        - `weight_unit` string
        - `volume` number: Volume covered by this event when supplied by the carrier.
        - `volume_unit` string
        - `flight_number` string: Flight number associated with the event.
        - `flight_origin` string: IATA origin of the associated flight leg.
        - `flight_destination` string: IATA destination of the associated flight leg.
        - `scheduled_departure_date` string, date: Carrier-supplied scheduled flight date when no reliable scheduled departure time is available.
        - `scheduled_departure` string, date-time: Carrier-supplied scheduled departure, distinct from this event's `date`.
        - `scheduled_arrival` string, date-time: Carrier-supplied scheduled arrival for the flight leg.
        - `actual_departure` string, date-time: Confirmed actual departure for the associated flight leg when available.
        - `actual_arrival` string, date-time: Confirmed actual arrival for the associated flight leg when available.
        - `uld_number` string: Unit load device number associated with the event when supplied by the carrier.
        - `carrier` integer
      - `services` Carrier[]
        - `slug` string
        - `name` string
      - `detectedCarrier` Carrier
        - `slug` string
        - `name` string
      - `detected` integer[]
      - `attributes` ShipmentAttribute[]
        - `l` string
        - `val` string
        - `code` string
      - `externalTracking` ExternalTracking[]
        - `slug` string
        - `url` string
        - `trackingId` string
        - `method` string
    - `delivery_estimate` DeliveryEstimateResult
      - `client_reference` string
      - `carrier_slug` string, required
      - `transport_mode` 'parcel' | 'postal' | 'express' | 'road_freight' | 'air_cargo' | 'ocean_container', required: Concrete transport mode. Forecast fallback never crosses this boundary.
      - `completion_scope` 'carrier_acceptance_to_delivery' | 'airport_to_airport' | 'airport_to_availability' | 'port_to_port' | 'port_to_availability' | 'port_to_gate_out', required: Defines what event counts as completion, and therefore which historical durations are compared. It is not a transport phase or route precision setting. Most callers should omit it and use the mode default. In v1 the start is the earliest confirmed physical carrier event, such as acceptance, pickup, RCS, or origin-terminal gate-in. The `airport_*` and `port_*` names describe the route family and completion boundary; they do not guarantee that the first timestamp is a flight departure or vessel departure. | Value | Measured journey | | --- | --- | | `carrier_acceptance_to_delivery` | Physical carrier acceptance or pickup to delivered/POD. Default for `parcel`, `postal`, `express`, and `road_freight`. | | `airport_to_airport` | First confirmed physical air-cargo event (often pickup or RCS) to arrival received at the destination airport (usually RCF). Default for `air_cargo`. | | `airport_to_availability` | First confirmed physical air-cargo event to ready-for-collection/available at the destination airport. | | `port_to_port` | First confirmed physical ocean event, such as origin-terminal gate-in, to arrival/discharge at the destination port. Default for `ocean_container`. | | `port_to_availability` | First confirmed physical ocean event to available/released for pickup at the destination port. | | `port_to_gate_out` | First confirmed physical ocean event to gate-out or terminal handoff at destination; this is not delivery to a final street address. | Fallback never crosses a completion-scope boundary. If the selected scope lacks enough observations, the API returns `INSUFFICIENT_DATA` rather than using a different endpoint meaning.
      - `route_scope_used` string: Diagnostic name of the selected statistics bucket, including whether it is carrier specific or a mode fallback. Most integrations can ignore it.
      - `route` DeliveryEstimateRoute: Route-selection diagnostics. Most integrations can ignore this object.
        - `origin_dimension` 'city' | 'admin1' | 'country' | 'airport' | 'port', nullable
        - `origin_key` string, nullable
        - `destination_dimension` 'city' | 'admin1' | 'country' | 'airport' | 'port', nullable
        - `destination_key` string, nullable
        - `carrier_specific` boolean
      - `estimate` DeliveryEstimateValues
        - `mean_days` number, required: Arithmetic mean for analytics. Use median_days as the normal point estimate.
        - `median_days` number, required: Primary point estimate.
        - `typical_days` DeliveryEstimateRange, required: Typical P10-P90 range in calendar days.
          - `min` number
          - `max` number
        - `remaining_status` 'not_requested' | 'estimated' | 'insufficient_censored_data' | 'insufficient_tail_data', required: Whether remaining_days was not requested, safely estimated, or withheld. insufficient_censored_data means the right-censored risk set or identifiable tail is too small; insufficient_tail_data is the fail-closed completed-tail fallback used before a survival generation exists.
        - `remaining_days` DeliveryEstimateRemaining, nullable: Estimated days still remaining. The censored model requires at least 100 subjects, 30 completed events, cohort age of 120 days (300 for ocean), at least five journeys and 10% of subjects in the current risk set, and identifiable P10, P50, and P90. Otherwise remaining_status explains why the API withheld it.
          - `mean` number, nullable: Null for Kaplan-Meier output; use median, min, and max.
          - `median` number
          - `min` number
          - `max` number
        - `estimated_delivery_at` DeliveryEstimateWindow, nullable: Estimated UTC delivery window. Present only when the request supplied a start timestamp or usable elapsed duration.
          - `from` string, date-time
          - `to` string, date-time
      - `confidence` DeliveryEstimateConfidence: Quality of statistical support, not the probability of delivery on one promised date.
        - `level` 'low' | 'medium' | 'high', required: Simple evidence-quality label for normal integrations.
        - `score` number, required: Diagnostic evidence-quality score, not an on-time-delivery probability.
        - `sample_count` integer, required
        - `effective_sample_count` number, required
        - `remaining_effective_sample_count` number: For Kaplan-Meier, the right-censored risk-set size at elapsed time; for the completed-tail fallback, time-decayed completed-tail support. Present only for a progress request.
        - `minimum_remaining_effective_sample_count` number: Safety floor applied by the active remaining-time method. Kaplan-Meier requires at least five journeys and 10% of subjects in the risk set, in addition to the per-mode subject floor and identifiable P10-P90 tail.
        - `survival_subject_count` integer
        - `survival_completed_count` integer
        - `survival_censored_count` integer
        - `survival_risk_set` integer
        - `survival_minimum_subject_count` integer
        - `survival_minimum_completed_count` integer
        - `survival_cohort_age_days` number
        - `survival_minimum_maturation_days` integer
        - `lookback_days` integer, required
        - `last_observation_at` string, date-time, nullable
        - `freshness_days` number
        - `fallback_level` integer, required
      - `model` object: Model diagnostics for reproducibility. Most integrations can ignore this object.
        - `version` string
        - `unit` 'calendar_days'
        - `histogram_bucket_hours` integer
        - `remaining_method` 'kaplan_meier_right_censored_v1' | 'completed_tail_guard_v1': Kaplan-Meier uses active right-censored journeys and delayed entry. The completed-tail guard remains a fail-closed fallback when no survival generation is published.
      - `error` DeliveryEstimateInsufficientData
        - `code` 'INSUFFICIENT_DATA', required
        - `message` string, required
        - `available_sample_count` integer, required
        - `minimum_sample_count` integer, required
  - `results` TrackingResult[]
    - `tracking_number` string, required
    - `state` 'processing' | 'completed', required
    - `from_cache` boolean, required: True when Parcels returned fresh cached data immediately instead of starting a new carrier request.
    - `shipment` Shipment
      - `trackingId` string
      - `error` string: Terminal shipment-level tracking error. `ADDITIONAL_FIELDS_REQUIRED` means a carrier such as SEUR needs more recipient identification to complete the lookup; this does not confirm that the tracking number exists. Inspect `input_requirements` to see required fields and alternatives, then retry with valid recipient details. `TIMEDOUT` means Parcels stopped waiting for a stale in-progress request and returned a final result instead of leaving the request processing forever.
      - `accepted_fields` string[]: For `ADDITIONAL_FIELDS_REQUIRED`, API v4 shipment item fields accepted for a retry. Consult `input_requirements` for which fields are required and which are alternatives.
      - `input_requirements` TrackingInputRequirements: Published input rule for a carrier. Absent when a complete rule has not been verified; absence does not promise that no recipient fields are needed. Required fields must be supplied together with at least one any_of field when both lists are present.
        - `required` TrackingInputFieldName[]: Fields to provide for every lookup.
        - `any_of` TrackingInputFieldName[]: Provide at least one of these fields in addition to required fields.
        - `conditional` TrackingInputFieldName[]: The carrier may require these fields for some shipments. Check the carrier-specific instructions for fields that must be supplied together.
      - `status` string
      - `origin` string
      - `destination` string
      - `originCode` string
      - `destinationCode` string
      - `transportMode` 'parcel' | 'postal' | 'express' | 'road_freight' | 'air_cargo' | 'ocean_container': Concrete transport mode. Forecast fallback never crosses this boundary.
      - `fromAirport` string: Origin IATA airport code when explicitly provided for an air-cargo shipment.
      - `toAirport` string: Destination IATA airport code when explicitly provided for an air-cargo shipment.
      - `fromPort` string: Origin UN/LOCODE when explicitly provided for an ocean shipment.
      - `toPort` string: Destination UN/LOCODE when explicitly provided for an ocean shipment.
      - `pieces` number: Shipment piece count when supplied by the carrier.
      - `weight` number: Shipment weight when supplied by the carrier.
      - `weight_unit` string: Unit for `weight`.
      - `volume` number: Shipment volume when supplied by the carrier.
      - `volume_unit` string: Unit for `volume`.
      - `flight_legs` FlightLeg[]: Carrier-supplied air-cargo routing legs. Schedule fields are kept separate from booking/milestone event timestamps and omitted when the carrier does not supply them.
        - `flight_number` string
        - `origin` string: Flight-leg origin IATA code.
        - `destination` string: Flight-leg destination IATA code.
        - `status` string: Carrier-reported status of this leg.
        - `scheduled_departure_date` string, date: Scheduled departure date when the carrier supplies a date but no reliable time.
        - `scheduled_departure` string, date-time: Scheduled departure with the carrier station's offset.
        - `scheduled_arrival` string, date-time: Scheduled arrival with the destination station's offset.
        - `actual_departure` string, date-time: Actual departure confirmed by the carrier.
        - `actual_arrival` string, date-time: Actual arrival confirmed by the carrier.
        - `pieces` number
        - `weight` number
        - `weight_unit` string
        - `volume` number
        - `volume_unit` string
      - `states` TrackingEvent[]: Carrier tracking events. Interactive prompts asking for recipient fields are omitted from API responses and webhooks; when no real events are available this array can be empty.
        - `state` string
        - `location` string
        - `date` string, date-time: Carrier event time with its airport-local UTC offset when the carrier provides only local wall time.
        - `event_code` string: Carrier milestone code when supplied by the source.
        - `station` string: IATA station or airport code associated with the event.
        - `timezone` string: IANA time zone used to interpret the carrier-local event time.
        - `pieces` number: Pieces covered by this event, useful for partial movements.
        - `weight` number: Weight covered by this event when supplied by the carrier.
        - `weight_unit` string
        - `volume` number: Volume covered by this event when supplied by the carrier.
        - `volume_unit` string
        - `flight_number` string: Flight number associated with the event.
        - `flight_origin` string: IATA origin of the associated flight leg.
        - `flight_destination` string: IATA destination of the associated flight leg.
        - `scheduled_departure_date` string, date: Carrier-supplied scheduled flight date when no reliable scheduled departure time is available.
        - `scheduled_departure` string, date-time: Carrier-supplied scheduled departure, distinct from this event's `date`.
        - `scheduled_arrival` string, date-time: Carrier-supplied scheduled arrival for the flight leg.
        - `actual_departure` string, date-time: Confirmed actual departure for the associated flight leg when available.
        - `actual_arrival` string, date-time: Confirmed actual arrival for the associated flight leg when available.
        - `uld_number` string: Unit load device number associated with the event when supplied by the carrier.
        - `carrier` integer
      - `services` Carrier[]
        - `slug` string
        - `name` string
      - `detectedCarrier` Carrier
        - `slug` string
        - `name` string
      - `detected` integer[]
      - `attributes` ShipmentAttribute[]
        - `l` string
        - `val` string
        - `code` string
      - `externalTracking` ExternalTracking[]
        - `slug` string
        - `url` string
        - `trackingId` string
        - `method` string
    - `delivery_estimate` DeliveryEstimateResult
      - `client_reference` string
      - `carrier_slug` string, required
      - `transport_mode` 'parcel' | 'postal' | 'express' | 'road_freight' | 'air_cargo' | 'ocean_container', required: Concrete transport mode. Forecast fallback never crosses this boundary.
      - `completion_scope` 'carrier_acceptance_to_delivery' | 'airport_to_airport' | 'airport_to_availability' | 'port_to_port' | 'port_to_availability' | 'port_to_gate_out', required: Defines what event counts as completion, and therefore which historical durations are compared. It is not a transport phase or route precision setting. Most callers should omit it and use the mode default. In v1 the start is the earliest confirmed physical carrier event, such as acceptance, pickup, RCS, or origin-terminal gate-in. The `airport_*` and `port_*` names describe the route family and completion boundary; they do not guarantee that the first timestamp is a flight departure or vessel departure. | Value | Measured journey | | --- | --- | | `carrier_acceptance_to_delivery` | Physical carrier acceptance or pickup to delivered/POD. Default for `parcel`, `postal`, `express`, and `road_freight`. | | `airport_to_airport` | First confirmed physical air-cargo event (often pickup or RCS) to arrival received at the destination airport (usually RCF). Default for `air_cargo`. | | `airport_to_availability` | First confirmed physical air-cargo event to ready-for-collection/available at the destination airport. | | `port_to_port` | First confirmed physical ocean event, such as origin-terminal gate-in, to arrival/discharge at the destination port. Default for `ocean_container`. | | `port_to_availability` | First confirmed physical ocean event to available/released for pickup at the destination port. | | `port_to_gate_out` | First confirmed physical ocean event to gate-out or terminal handoff at destination; this is not delivery to a final street address. | Fallback never crosses a completion-scope boundary. If the selected scope lacks enough observations, the API returns `INSUFFICIENT_DATA` rather than using a different endpoint meaning.
      - `route_scope_used` string: Diagnostic name of the selected statistics bucket, including whether it is carrier specific or a mode fallback. Most integrations can ignore it.
      - `route` DeliveryEstimateRoute: Route-selection diagnostics. Most integrations can ignore this object.
        - `origin_dimension` 'city' | 'admin1' | 'country' | 'airport' | 'port', nullable
        - `origin_key` string, nullable
        - `destination_dimension` 'city' | 'admin1' | 'country' | 'airport' | 'port', nullable
        - `destination_key` string, nullable
        - `carrier_specific` boolean
      - `estimate` DeliveryEstimateValues
        - `mean_days` number, required: Arithmetic mean for analytics. Use median_days as the normal point estimate.
        - `median_days` number, required: Primary point estimate.
        - `typical_days` DeliveryEstimateRange, required: Typical P10-P90 range in calendar days.
          - `min` number
          - `max` number
        - `remaining_status` 'not_requested' | 'estimated' | 'insufficient_censored_data' | 'insufficient_tail_data', required: Whether remaining_days was not requested, safely estimated, or withheld. insufficient_censored_data means the right-censored risk set or identifiable tail is too small; insufficient_tail_data is the fail-closed completed-tail fallback used before a survival generation exists.
        - `remaining_days` DeliveryEstimateRemaining, nullable: Estimated days still remaining. The censored model requires at least 100 subjects, 30 completed events, cohort age of 120 days (300 for ocean), at least five journeys and 10% of subjects in the current risk set, and identifiable P10, P50, and P90. Otherwise remaining_status explains why the API withheld it.
          - `mean` number, nullable: Null for Kaplan-Meier output; use median, min, and max.
          - `median` number
          - `min` number
          - `max` number
        - `estimated_delivery_at` DeliveryEstimateWindow, nullable: Estimated UTC delivery window. Present only when the request supplied a start timestamp or usable elapsed duration.
          - `from` string, date-time
          - `to` string, date-time
      - `confidence` DeliveryEstimateConfidence: Quality of statistical support, not the probability of delivery on one promised date.
        - `level` 'low' | 'medium' | 'high', required: Simple evidence-quality label for normal integrations.
        - `score` number, required: Diagnostic evidence-quality score, not an on-time-delivery probability.
        - `sample_count` integer, required
        - `effective_sample_count` number, required
        - `remaining_effective_sample_count` number: For Kaplan-Meier, the right-censored risk-set size at elapsed time; for the completed-tail fallback, time-decayed completed-tail support. Present only for a progress request.
        - `minimum_remaining_effective_sample_count` number: Safety floor applied by the active remaining-time method. Kaplan-Meier requires at least five journeys and 10% of subjects in the risk set, in addition to the per-mode subject floor and identifiable P10-P90 tail.
        - `survival_subject_count` integer
        - `survival_completed_count` integer
        - `survival_censored_count` integer
        - `survival_risk_set` integer
        - `survival_minimum_subject_count` integer
        - `survival_minimum_completed_count` integer
        - `survival_cohort_age_days` number
        - `survival_minimum_maturation_days` integer
        - `lookback_days` integer, required
        - `last_observation_at` string, date-time, nullable
        - `freshness_days` number
        - `fallback_level` integer, required
      - `model` object: Model diagnostics for reproducibility. Most integrations can ignore this object.
        - `version` string
        - `unit` 'calendar_days'
        - `histogram_bucket_hours` integer
        - `remaining_method` 'kaplan_meier_right_censored_v1' | 'completed_tail_guard_v1': Kaplan-Meier uses active right-censored journeys and delayed entry. The completed-tail guard remains a fail-closed fallback when no survival generation is published.
      - `error` DeliveryEstimateInsufficientData
        - `code` 'INSUFFICIENT_DATA', required
        - `message` string, required
        - `available_sample_count` integer, required
        - `minimum_sample_count` integer, required
  - `error` ErrorObject
    - `code` 'MISSING_API_KEY' | 'INVALID_API_KEY' | 'INVALID_PARAMS' | 'INVALID_TRACKING_NUMBER' | 'DESTINATION_COUNTRY_REQUIRED' | 'INVALID_WEBHOOK_URL' | 'INVALID_CURSOR' | 'UNCONFIRMED_ACCOUNT' | 'SUBSCRIPTION_NOT_FOUND' | 'SUBSCRIPTION_INACTIVE' | 'SUBSCRIPTION_LIMIT_REACHED' | 'INVALID_SUBSCRIPTION_STATE' | 'FORBIDDEN' | 'NO_SHIPMENTS' | 'NO_REQUEST_FOUND' | 'MISSING_REQUEST_ID' | 'INVALID_REQUEST_ID' | 'INVALID_DELIVERY_ESTIMATE_REQUEST' | 'BATCH_TOO_LARGE' | 'INVALID_TRANSPORT_MODE' | 'RATE_LIMITED' | 'BUSY' | 'SERVER_ERROR', required: Public error code. - `MISSING_API_KEY`: Authorization header is absent. Use `Authorization: Bearer <API_KEY>`. - `INVALID_API_KEY`: Bearer token is invalid. - `INVALID_PARAMS`: Request body is malformed. - `INVALID_TRACKING_NUMBER`: A shipment item failed validation and was placed in `rejected`; valid batch items continue. - `DESTINATION_COUNTRY_REQUIRED`: A shipment item was rejected because an ordinary tracking number needs `destination_country` or `carrier_hint`. - `INVALID_WEBHOOK_URL`: Webhook URL is invalid or not allowed. - `INVALID_CURSOR`: Tracking-carrier pagination cursor is malformed, stale, or belongs to another query/catalog version. - `UNCONFIRMED_ACCOUNT`: Account email is not confirmed. Response includes `confirmation_url` when available. - `SUBSCRIPTION_NOT_FOUND`: API key does not map to a subscription. - `SUBSCRIPTION_INACTIVE`: Subscription is inactive. - `SUBSCRIPTION_LIMIT_REACHED`: The valid batch contains more new unique tracking numbers than the remaining monthly quota; the whole valid batch is rejected without partial charging. - `INVALID_SUBSCRIPTION_STATE`: Subscription state does not allow tracking. - `FORBIDDEN`: Tracking is disabled for this account. - `NO_SHIPMENTS`: Every submitted shipment was filtered out by per-item validation. - `NO_REQUEST_FOUND`: Tracking request does not exist, has expired after `expires_at`, or belongs to another account. - `MISSING_REQUEST_ID`: Polling URL is missing `request_id`. - `INVALID_REQUEST_ID`: `request_id` is not valid. - `RATE_LIMITED`: Too many requests from this client. - `BUSY`: Tracking service is temporarily busy; retry later. - `SERVER_ERROR`: Unexpected server error.
    - `message` string, required
    - `limit` integer: Subscription shipment limit. Returned with SUBSCRIPTION_LIMIT_REACHED.
    - `current` integer: Unique tracking numbers already charged in the current period.
    - `requested_new` integer: New unique valid tracking numbers in this request.
    - `available` integer: Remaining new unique tracking numbers available in the current period.
    - `confirmation_url` string: Returned with UNCONFIRMED_ACCOUNT. Open this URL to confirm the account.
    - `confirmation_expires_at` string, date-time
    - `rejected` RejectedShipment[]
      - `index` integer, required: Zero-based index in the submitted shipments array.
      - `tracking_number` string: Trimmed tracking number from the submitted item, when it was a non-empty string.
      - `code` 'INVALID_TRACKING_NUMBER' | 'DESTINATION_COUNTRY_REQUIRED' | 'INVALID_ADDITIONAL_FIELDS', required
      - `message` string, required

## Response `200`

Return any 2xx status after persisting the webhook.

## Changes

- **2026-11-06** `dd6315a8bc4e`: 54 info
  - added the new optional request property `result/delivery_estimate`
  - added the new optional request property `result/shipment/accepted_fields`
  - added the new optional request property `result/shipment/flight_legs`
  - added the new optional request property `result/shipment/input_requirements`
  - …50 more
- **2026-07-19** `f8d02f819394`: 8 breaking, 4 warning, 9 info
  - added the new required `header` request parameter `Parcels-Signature`
  - added the new required request property `error/code`
  - added the new required request property `error/message`
  - added the new required request property `request_id`
  - …17 more

[Operation history](https://skmtc.dev/parcelsapp/apis/parcels-api-v4/changes/parcels-webhook/post.md)

---

[API](https://skmtc.dev/parcelsapp/apis/parcels-api-v4.md) - [All operations](https://skmtc.dev/parcelsapp/apis/parcels-api-v4/llms.txt) - [OpenAPI document](https://skmtc.dev/parcelsapp/apis/parcels-api-v4/revisions/dd6315a8bc4e?raw)
