В этом руководстве представлена техническая справочная информация по API и схемы полезной нагрузки для отправки полных обновлений статуса заказа, событий выполнения и корректировок в Google с помощью веб-хуков для версии 2026-04-08 протокола Universal Commerce Protocol (UCP).
Прежде чем создавать конечные точки, убедитесь, что вы ознакомились с обзором жизненного цикла заказа , где изложены основные концепции, обязательные события и подробная информация о конечных точках веб-перехватчика.
Аутентификация и подписание запросов
Ключевые изменения в версии 2026-04-08 включают введение новых обязательных заголовков веб-перехватчика и специальных процедур подписания запросов.
Обязательные заголовки веб-перехватчика
Для всех запросов веб-хуков обязательны следующие HTTP-заголовки:
-
Webhook-Id: Уникальный идентификатор для данного события веб-перехватчика. Этот идентификатор должен совпадать сidосновного отправляемого события (например, идентификатором события выполнения или идентификатором события корректировки). -
Webhook-Timestamp: Временная метка, указывающая, когда произошло событие.
Эти заголовки заменяют поля id и created_time которые ранее ожидались в полезной нагрузке заказа.
Запрос на подписание
- Вычислите дайджест SHA-256 из исходного тела запроса и установите заголовок
Content-Digest. - Выберите ключ подписи из
signing_keysв вашем профиле UCP. - Создать базу сигнатур в соответствии с RFC 9421 .
- См. спецификацию для компонентов с печатной платой.
- Установите заголовки
UCP-Agent,Signature-InputиSignature.-
UCP-Agent— это ссылка на ваш профиль UCP в форматеprofile="https://merchant.example.com/.well-known/ucp". -
Signature-Input— это поле со структурой словаря, описывающее компоненты, содержащиеся в подписи, а такжеkeyidиспользуемый для подписи, который должен совпадать сkidвыбранного вами ключа подписи изsigning_keysв вашем профиле UCP. - Заголовок
Signatureсодержит базовый код вашей подписи, который подписывается с использованием вашего закрытого ключа и затем кодируется в формате Base64.
-
Для получения более подробной информации см. инструкции по подписанию на сайте ucp.dev .
Событие создания заказа
- Триггер: Сразу после подтверждения заказа (
status: processing).
Основные изменения в этой версии:
- Теперь поле
currencyявляется обязательным на верхнем уровне объекта Order. - Теперь поле
typeвнутри каждого объекта в массивеtotalsпредставляет собой открывающую строку (например, "промежуточная сумма", "налог", "сбор", "итоговая сумма"). - Обязательный заголовок
Webhook-Idсодержит уникальный идентификатор события веб-перехватчика. Обратите внимание, что полеidв полезной нагрузке, содержащее идентификатор подтверждения заказа, по-прежнему является обязательным. - Обязательный заголовок
Webhook-Timestampуказывает время создания, заменяя прежнее полеcreated_timeв полезной нагрузке.
Пример: В этом примере показан заказ, созданный после того, как покупатель завершил оформление заказа.
Обязательные заголовки:
-
Webhook-Id: order_01 -
Webhook-Timestamp: 2026-03-23T19:00:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_01",
"checkout_id": "checkout_01",
"currency": "USD",
// Always include all line items, even for single-item checkouts. This ensures any add-ons, gifts, or separate charges are accounted for.
"line_items": [
{
"id": "line_1",
"item":
{
"id": "product_123",
"title": "Running Shoes",
"price": 10000
},
"quantity": { "total": 1, "fulfilled": 0 },
"totals": [
{"type": "subtotal", "display_text": null, "amount": 10000},
{"type": "total", "display_text": null, "amount": 10000}
],
// The status of a line item must match total and fulfilled quantities (e.g., total 1, fulfilled 0 -> status: processing).
"status": "processing"
}
],
"totals": [
{"type": "subtotal", "display_text": "Subtotal", "amount": 10000}, // Tax-inclusive markets: Set display_text to "Subtotal (including taxes)". Amount must include tax.
{"type": "fee", "display_text": "Service Fee", "amount": 100},
{"type": "tax", "display_text": "Tax", "amount": 800}, // Tax-inclusive markets: Omit this entry.
{"type": "total", "display_text": "Total", "amount": 10900}
],
"fulfillment": {
"expectations": [
{
"id": "exp_1",
"line_items": [{ "id": "line_1", "quantity": 1 }],
"method_type": "shipping",
"destination": {
"first_name": "Alice",
"last_name": "Example",
"street_address": "123 Main St",
"address_locality": "Austin",
"address_region": "TX",
"address_country": "US",
"postal_code": "78701"
},
"description": "Arrives in 2-3 business days", // Maximum length: 200 characters.
"fulfillable_on": "now"
}
]
},
"permalink_url": "https://merchant.example.com/orders/789"
}
События, связанные с исполнением желаний
Эти события отправляются как часть массива fulfillment.events .
Заказ отправлен
Когда товары в заказе отправлены. Поля tracking_number и tracking_url обязательны для отслеживания отправленных товаров, поскольку они необходимы для корректной группировки товаров на странице «Мои заказы».
Заказ доставлен
Когда товары из заказа будут доставлены.
Пример ( shipped и delivered ): В этом примере показано обновление заказа после того, как товар был отправлен, а затем доставлен.
Обязательные заголовки:
-
Webhook-Id: fulfill_evt_2 -
Webhook-Timestamp: 2026-02-10T14:00:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_01",
"checkout_id": "checkout_01",
"currency": "USD",
"line_items": [
{
"id": "line_1",
"item":
{
"id": "product_123",
"title": "Running Shoes",
"price": 10000
},
"quantity": { "total": 1, "fulfilled": 1 },
"totals": [
{"type": "subtotal", "amount": 10000},
{"type": "total", "amount": 10000}
],
"status": "fulfilled"
}
],
"totals": [
{"type": "subtotal", "amount": 10000},
{"type": "total", "amount": 10000}
],
// Updated fulfillment details
"fulfillment": {
"events": [
{
"id": "fulfill_evt_1",
"occurred_at": "2026-02-08T10:30:00Z",
"type": "shipped",
"line_items": [{ "id": "line_1", "quantity": 1 }],
"tracking_number": "123456789",
"tracking_url": "https://fedex.com/track/123456789",
"carrier": "FedEx",
"description": "Shipping departed from warehouse"
},
{
"id": "fulfill_evt_2",
"occurred_at": "2026-02-10T14:00:00Z",
"type": "delivered",
"line_items": [{ "id": "line_1", "quantity": 1 }],
"tracking_number": "123456789",
"tracking_url": "https://fedex.com/track/123456789",
"carrier": "FedEx",
"description": "Package delivered"
}
],
"expectations": [{ "...": "..." }]
},
"permalink_url": "https://merchant.example.com/orders/123"
}
Примеры заказов, содержащих несколько товаров.
Приведенные ниже примеры демонстрируют, как структурировать обновления для заказов, содержащих несколько товаров, и для раздельных отправок. Правила определения статуса посылки см. в разделе «Как определяется статус посылки» .
Заказ нескольких товаров, доставка в одной посылке.
В этом примере показано обновление заказа для одной посылки, содержащей несколько товаров. Все позиции сгруппированы в рамках одного события shipped и имеют один и тот же номер отслеживания.
Обязательные заголовки:
-
Webhook-Id: fulfill_evt_1 -
Webhook-Timestamp: 2026-02-08T10:30:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_multi_01",
"checkout_id": "checkout_multi_01",
"currency": "USD",
"line_items": [
{
"id": "line_1",
"item": { "id": "product_1", "title": "Item 1", "price": 5000 },
"quantity": { "total": 1, "fulfilled": 1 },
"totals": [
{"type": "subtotal", "display_text": null, "amount": 5000},
{"type": "total", "display_text": null, "amount": 5000}
],
"status": "fulfilled"
},
{
"id": "line_2",
"item": { "id": "product_2", "title": "Item 2", "price": 5000 },
"quantity": { "total": 1, "fulfilled": 1 },
"totals": [
{"type": "subtotal", "display_text": null, "amount": 5000},
{"type": "total", "display_text": null, "amount": 5000}
],
"status": "fulfilled"
}
],
"totals": [
{"type": "subtotal", "display_text": "Subtotal", "amount": 10000},
{"type": "fee", "display_text": "Shipping", "amount": 500},
{"type": "total", "display_text": "Total", "amount": 10500}
],
"fulfillment": {
"expectations": [
{
"id": "exp_1",
"line_items": [
{ "id": "line_1", "quantity": 1 },
{ "id": "line_2", "quantity": 1 }
],
"method_type": "shipping",
"destination": {
"first_name": "Alice",
"last_name": "Example",
"street_address": "123 Main St",
"address_locality": "Austin",
"address_region": "TX",
"address_country": "US",
"postal_code": "78701"
},
"description": "Standard Shipping",
"fulfillable_on": "now"
}
],
"events": [
{
"id": "fulfill_evt_1",
"occurred_at": "2026-02-08T10:30:00Z",
"type": "shipped",
"line_items": [
{ "id": "line_1", "quantity": 1 },
{ "id": "line_2", "quantity": 1 }
],
"tracking_number": "123456789",
"tracking_url": "https://fedex.com/track/123456789",
"carrier": "FedEx",
"description": "Both items shipped together"
}
]
},
"permalink_url": "https://merchant.example.com/orders/456"
}
Заказ из нескольких товаров, раздельная отправка.
В этом примере показано обновление заказа для разделенных отправок. Имеется несколько событий shipped , каждое из которых ссылается на конкретные line_items в соответствующей посылке с разными номерами отслеживания. Поскольку каждая посылка представляет собой отдельное обязательство по выполнению заказа (например, разные скорости и стоимость при оформлении заказа с несколькими группами товаров), expectations также разделены.
Обязательные заголовки:
-
Webhook-Id: fulfill_evt_2 -
Webhook-Timestamp: 2026-02-09T14:00:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_multi_02",
"checkout_id": "checkout_multi_02",
"currency": "USD",
"line_items": [
{
"id": "line_1",
"item": { "id": "product_1", "title": "Item 1", "price": 5000 },
"quantity": { "total": 1, "fulfilled": 1 },
"totals": [
{"type": "subtotal", "display_text": null, "amount": 5000},
{"type": "total", "display_text": null, "amount": 5000}
],
"status": "fulfilled"
},
{
"id": "line_2",
"item": { "id": "product_2", "title": "Item 2", "price": 5000 },
"quantity": { "total": 1, "fulfilled": 1 },
"totals": [
{"type": "subtotal", "display_text": null, "amount": 5000},
{"type": "total", "display_text": null, "amount": 5000}
],
"status": "fulfilled"
}
],
"totals": [
{"type": "subtotal", "display_text": "Subtotal", "amount": 10000},
{"type": "fee", "display_text": "Shipping", "amount": 1500},
{"type": "total", "display_text": "Total", "amount": 11500}
],
"fulfillment": {
"expectations": [
{
"id": "exp_1",
"line_items": [{ "id": "line_1", "quantity": 1 }],
"method_type": "shipping",
"destination": {
"first_name": "Alice",
"last_name": "Example",
"street_address": "123 Main St",
"address_locality": "Austin",
"address_region": "TX",
"address_country": "US",
"postal_code": "78701"
},
"description": "Standard Shipping",
"fulfillable_on": "now"
},
{
"id": "exp_2",
"line_items": [{ "id": "line_2", "quantity": 1 }],
"method_type": "shipping",
"destination": {
"first_name": "Alice",
"last_name": "Example",
"street_address": "123 Main St",
"address_locality": "Austin",
"address_region": "TX",
"address_country": "US",
"postal_code": "78701"
},
"description": "Express Shipping",
"fulfillable_on": "now"
}
],
"events": [
{
"id": "fulfill_evt_1",
"occurred_at": "2026-02-08T10:30:00Z",
"type": "shipped",
"line_items": [{ "id": "line_1", "quantity": 1 }],
"tracking_number": "PKG1_TRACKING",
"tracking_url": "https://fedex.com/track/PKG1_TRACKING",
"carrier": "FedEx",
"description": "First item shipped in package 1"
},
{
"id": "fulfill_evt_2",
"occurred_at": "2026-02-09T14:00:00Z",
"type": "shipped",
"line_items": [{ "id": "line_2", "quantity": 1 }],
"tracking_number": "PKG2_TRACKING",
"tracking_url": "https://fedex.com/track/PKG2_TRACKING",
"carrier": "FedEx",
"description": "Second item shipped in package 2"
}
]
},
"permalink_url": "https://merchant.example.com/orders/457"
}
Примеры событий корректировки
Приведенные ниже примеры демонстрируют, как структурировать обновления для возвратов, отмен и возвратов средств. Список поддерживаемых событий и их определений см. в разделе «События корректировки» в обзоре жизненного цикла заказа.
Отмена заказа и возврат средств
В этом примере показан заказ, в котором товар был отменен, а деньги возвращены вскоре после оформления заказа.
В этом примере в данной версии произошли ключевые изменения:
- В основном массиве
line_itemsдля позиций, затронутыхcancellationтеперь используется"status": "removed". - Когда
line_items.statusremoved:- Значение
line_items.quantity.totalустановлено равным0. - Исходное количество сохраняется в новом поле
line_items.quantity.original.
- Значение
Обязательные заголовки:
-
Webhook-Id: adj_refund_1 -
Webhook-Timestamp: 2026-02-09T11:05:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_02",
"checkout_id": "checkout_02",
"currency": "USD",
"line_items": [
{
"id": "line_2",
"item": {
"id": "product_456",
"title": "Smart Watch",
"price": 29900
},
"quantity": {
"total": 0, // Item removed from order total.
"original": 1, // Original quantity before removal.
"fulfilled": 0 // Item was not fulfilled before cancellation.
},
"totals": [
{"type": "subtotal", "amount": 29900},
{"type": "tax", "amount": 2400},
{"type": "total", "amount": 32300}
],
"status": "removed" // Item is cancelled, returned, or refunded.
}
],
"totals": [
{"type": "subtotal", "amount": 29900},
{"type": "tax", "amount": 2400},
{"type": "total", "amount": 32300}
],
// Fulfillment expectations should still be present even if cancelled early.
"fulfillment": {
"expectations": [
{
"id": "exp_1",
"line_items": [{ "id": "line_2", "quantity": 1 }],
"method_type": "shipping",
"destination": {
"first_name": "Bob",
"last_name": "Consumer",
"street_address": "456 Oak Ave",
"address_locality": "Anytown",
"address_region": "CA",
"address_country": "US",
"postal_code": "90210"
},
"description": "Standard Shipping",
"fulfillable_on": "now"
}
]
// "events": [] // No fulfillment events occurred before cancellation.
},
"adjustments": [
{
"id": "adj_cancel_1",
"type": "cancellation",
"description": "Customer changed mind",
"line_items": [{ "id": "line_2", "quantity": -1 }],
"occurred_at": "2026-02-09T11:00:00Z",
"status": "completed"
},
{
"id": "adj_refund_1",
"type": "refund",
"description": "Refund for cancelled item",
"line_items": [{ "id": "line_2", "quantity": -1 }],
"totals": [
{"type": "subtotal", "display_text": "Subtotal", "amount": -29900}, // Negative amounts indicate money returned to the buyer. Tax-inclusive markets: Set display_text to "Subtotal (including taxes)". Amount must include tax.
{"type": "tax", "amount": -2400}, // Tax-inclusive markets: Omit this entry.
{"type": "total", "display_text": "Total", "amount": -32300}
],
"occurred_at": "2026-02-09T11:05:00Z",
"status": "completed"
}
],
"permalink_url": "https://merchant.example.com/orders/12345"
}
Возврат заказа и возмещение средств
В этом примере показан заказ, в котором товар был отправлен, доставлен, а затем возвращен, и деньги были возвращены.
В этом примере в данной версии произошли ключевые изменения:
- В основном массиве
line_itemsдля позиций, затронутыхreturnтеперь используется"status": "removed". - Когда
line_items.statusremoved:- Значение
line_items.quantity.totalустановлено равным0. - Исходное количество сохраняется в новом поле
line_items.quantity.original.
- Значение
- В
adjustmentsтипаreturnполеline_items.quantityв рамках корректировки использует отрицательное значение (например,-1) для обозначения товаров, которые возвращаются.
Обязательные заголовки:
-
Webhook-Id: adj_refund_2 -
Webhook-Timestamp: 2026-02-10T10:00:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_03",
"checkout_id": "checkout_03",
"currency": "USD",
"line_items": [
{
"id": "line_3",
"item": {
"id": "product_789",
"title": "Wireless Earbuds",
"price": 14900
},
"quantity": {
"total": 0, // Item removed from order total.
"original": 1, // Original quantity before removal.
"fulfilled": 1 // Was fulfilled before return.
},
"totals": [
{"type": "subtotal", "amount": 14900},
{"type": "tax", "amount": 1200},
{"type": "total", "amount": 16100}
],
"status": "removed" // Item is cancelled, returned, or refunded.
}
],
"totals": [
{"type": "subtotal", "amount": 14900},
{"type": "tax", "amount": 1200},
{"type": "total", "amount": 16100}
],
"fulfillment": {
"events": [
{
"id": "fulfill_evt_1",
"occurred_at": "2026-02-05T09:00:00Z",
"type": "shipped",
"line_items": [{ "id": "line_3", "quantity": 1 }],
"tracking_number": "987654321",
"tracking_url": "https://fedex.com/track/987654321",
"carrier": "FedEx",
"description": "Item shipped"
},
{
"id": "fulfill_evt_2",
"occurred_at": "2026-02-07T16:00:00Z",
"type": "delivered",
"line_items": [{ "id": "line_3", "quantity": 1 }],
"tracking_number": "987654321",
"tracking_url": "https://fedex.com/track/987654321",
"carrier": "FedEx",
"description": "Item delivered"
},
{
"id": "fulfill_evt_3",
"occurred_at": "2026-02-09T09:00:00Z",
"type": "returned",
"line_items": [{ "id": "line_3", "quantity": 1 }],
"tracking_number": "987654321",
"tracking_url": "https://fedex.com/track/987654321",
"carrier": "FedEx",
"description": "Item returned"
}
],
"expectations": [{ "...": "..." }]
},
"adjustments": [
{
"id": "adj_return_1",
"type": "return", // a matching fulfillment event is also added to represent return shipping.
"description": "Item not compatible",
"line_items": [{ "id": "line_3", "quantity": -1 }], // Uses a negative value (such as -1) to indicate a return.
"occurred_at": "2026-02-09T09:00:00Z",
"status": "completed"
},
{
"id": "adj_refund_2",
"type": "refund",
"description": "Refund for returned item",
"line_items": [{ "id": "line_3", "quantity": -1 }],
"totals": [
{"type": "subtotal", "amount": -14900}, // Negative amounts indicate money returned to the buyer.
{"type": "tax", "amount": -1200},
{"type": "total", "amount": -16100}
],
"occurred_at": "2026-02-10T10:00:00Z",
"status": "completed"
}
],
"permalink_url": "https://merchant.example.com/orders/67890"
}
В этом руководстве представлена техническая справочная информация по API и схемы полезной нагрузки для отправки полных обновлений статуса заказа, событий выполнения и корректировок в Google с помощью веб-хуков для версии 2026-04-08 протокола Universal Commerce Protocol (UCP).
Прежде чем создавать конечные точки, убедитесь, что вы ознакомились с обзором жизненного цикла заказа , где изложены основные концепции, обязательные события и подробная информация о конечных точках веб-перехватчика.
Аутентификация и подписание запросов
Ключевые изменения в версии 2026-04-08 включают введение новых обязательных заголовков веб-перехватчика и специальных процедур подписания запросов.
Обязательные заголовки веб-перехватчика
Для всех запросов веб-хуков обязательны следующие HTTP-заголовки:
-
Webhook-Id: Уникальный идентификатор для данного события веб-перехватчика. Этот идентификатор должен совпадать сidосновного отправляемого события (например, идентификатором события выполнения или идентификатором события корректировки). -
Webhook-Timestamp: Временная метка, указывающая, когда произошло событие.
Эти заголовки заменяют поля id и created_time которые ранее ожидались в полезной нагрузке заказа.
Запрос на подписание
- Вычислите дайджест SHA-256 из исходного тела запроса и установите заголовок
Content-Digest. - Выберите ключ подписи из
signing_keysв вашем профиле UCP. - Создать базу сигнатур в соответствии с RFC 9421 .
- См. спецификацию для компонентов с печатной платой.
- Установите заголовки
UCP-Agent,Signature-InputиSignature.-
UCP-Agent— это ссылка на ваш профиль UCP в форматеprofile="https://merchant.example.com/.well-known/ucp". -
Signature-Input— это поле со структурой словаря, описывающее компоненты, содержащиеся в подписи, а такжеkeyidиспользуемый для подписи, который должен совпадать сkidвыбранного вами ключа подписи изsigning_keysв вашем профиле UCP. - Заголовок
Signatureсодержит базовый код вашей подписи, который подписывается с использованием вашего закрытого ключа и затем кодируется в формате Base64.
-
Для получения более подробной информации см. инструкции по подписанию на сайте ucp.dev .
Событие создания заказа
- Триггер: Сразу после подтверждения заказа (
status: processing).
Основные изменения в этой версии:
- Теперь поле
currencyявляется обязательным на верхнем уровне объекта Order. - Теперь поле
typeвнутри каждого объекта в массивеtotalsпредставляет собой открывающую строку (например, "промежуточная сумма", "налог", "сбор", "итоговая сумма"). - Обязательный заголовок
Webhook-Idсодержит уникальный идентификатор события веб-перехватчика. Обратите внимание, что полеidв полезной нагрузке, содержащее идентификатор подтверждения заказа, по-прежнему является обязательным. - Обязательный заголовок
Webhook-Timestampуказывает время создания, заменяя прежнее полеcreated_timeв полезной нагрузке.
Пример: В этом примере показан заказ, созданный после того, как покупатель завершил оформление заказа.
Обязательные заголовки:
-
Webhook-Id: order_01 -
Webhook-Timestamp: 2026-03-23T19:00:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_01",
"checkout_id": "checkout_01",
"currency": "USD",
// Always include all line items, even for single-item checkouts. This ensures any add-ons, gifts, or separate charges are accounted for.
"line_items": [
{
"id": "line_1",
"item":
{
"id": "product_123",
"title": "Running Shoes",
"price": 10000
},
"quantity": { "total": 1, "fulfilled": 0 },
"totals": [
{"type": "subtotal", "display_text": null, "amount": 10000},
{"type": "total", "display_text": null, "amount": 10000}
],
// The status of a line item must match total and fulfilled quantities (e.g., total 1, fulfilled 0 -> status: processing).
"status": "processing"
}
],
"totals": [
{"type": "subtotal", "display_text": "Subtotal", "amount": 10000}, // Tax-inclusive markets: Set display_text to "Subtotal (including taxes)". Amount must include tax.
{"type": "fee", "display_text": "Service Fee", "amount": 100},
{"type": "tax", "display_text": "Tax", "amount": 800}, // Tax-inclusive markets: Omit this entry.
{"type": "total", "display_text": "Total", "amount": 10900}
],
"fulfillment": {
"expectations": [
{
"id": "exp_1",
"line_items": [{ "id": "line_1", "quantity": 1 }],
"method_type": "shipping",
"destination": {
"first_name": "Alice",
"last_name": "Example",
"street_address": "123 Main St",
"address_locality": "Austin",
"address_region": "TX",
"address_country": "US",
"postal_code": "78701"
},
"description": "Arrives in 2-3 business days", // Maximum length: 200 characters.
"fulfillable_on": "now"
}
]
},
"permalink_url": "https://merchant.example.com/orders/789"
}
События, связанные с исполнением желаний
Эти события отправляются как часть массива fulfillment.events .
Заказ отправлен
Когда товары в заказе отправлены. Поля tracking_number и tracking_url обязательны для отслеживания отправленных товаров, поскольку они необходимы для корректной группировки товаров на странице «Мои заказы».
Заказ доставлен
Когда товары из заказа будут доставлены.
Пример ( shipped и delivered ): В этом примере показано обновление заказа после того, как товар был отправлен, а затем доставлен.
Обязательные заголовки:
-
Webhook-Id: fulfill_evt_2 -
Webhook-Timestamp: 2026-02-10T14:00:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_01",
"checkout_id": "checkout_01",
"currency": "USD",
"line_items": [
{
"id": "line_1",
"item":
{
"id": "product_123",
"title": "Running Shoes",
"price": 10000
},
"quantity": { "total": 1, "fulfilled": 1 },
"totals": [
{"type": "subtotal", "amount": 10000},
{"type": "total", "amount": 10000}
],
"status": "fulfilled"
}
],
"totals": [
{"type": "subtotal", "amount": 10000},
{"type": "total", "amount": 10000}
],
// Updated fulfillment details
"fulfillment": {
"events": [
{
"id": "fulfill_evt_1",
"occurred_at": "2026-02-08T10:30:00Z",
"type": "shipped",
"line_items": [{ "id": "line_1", "quantity": 1 }],
"tracking_number": "123456789",
"tracking_url": "https://fedex.com/track/123456789",
"carrier": "FedEx",
"description": "Shipping departed from warehouse"
},
{
"id": "fulfill_evt_2",
"occurred_at": "2026-02-10T14:00:00Z",
"type": "delivered",
"line_items": [{ "id": "line_1", "quantity": 1 }],
"tracking_number": "123456789",
"tracking_url": "https://fedex.com/track/123456789",
"carrier": "FedEx",
"description": "Package delivered"
}
],
"expectations": [{ "...": "..." }]
},
"permalink_url": "https://merchant.example.com/orders/123"
}
Примеры заказов, содержащих несколько товаров.
Приведенные ниже примеры демонстрируют, как структурировать обновления для заказов, содержащих несколько товаров, и для раздельных отправок. Правила определения статуса посылки см. в разделе «Как определяется статус посылки» .
Заказ нескольких товаров, доставка в одной посылке.
В этом примере показано обновление заказа для одной посылки, содержащей несколько товаров. Все позиции сгруппированы в рамках одного события shipped и имеют один и тот же номер отслеживания.
Обязательные заголовки:
-
Webhook-Id: fulfill_evt_1 -
Webhook-Timestamp: 2026-02-08T10:30:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_multi_01",
"checkout_id": "checkout_multi_01",
"currency": "USD",
"line_items": [
{
"id": "line_1",
"item": { "id": "product_1", "title": "Item 1", "price": 5000 },
"quantity": { "total": 1, "fulfilled": 1 },
"totals": [
{"type": "subtotal", "display_text": null, "amount": 5000},
{"type": "total", "display_text": null, "amount": 5000}
],
"status": "fulfilled"
},
{
"id": "line_2",
"item": { "id": "product_2", "title": "Item 2", "price": 5000 },
"quantity": { "total": 1, "fulfilled": 1 },
"totals": [
{"type": "subtotal", "display_text": null, "amount": 5000},
{"type": "total", "display_text": null, "amount": 5000}
],
"status": "fulfilled"
}
],
"totals": [
{"type": "subtotal", "display_text": "Subtotal", "amount": 10000},
{"type": "fee", "display_text": "Shipping", "amount": 500},
{"type": "total", "display_text": "Total", "amount": 10500}
],
"fulfillment": {
"expectations": [
{
"id": "exp_1",
"line_items": [
{ "id": "line_1", "quantity": 1 },
{ "id": "line_2", "quantity": 1 }
],
"method_type": "shipping",
"destination": {
"first_name": "Alice",
"last_name": "Example",
"street_address": "123 Main St",
"address_locality": "Austin",
"address_region": "TX",
"address_country": "US",
"postal_code": "78701"
},
"description": "Standard Shipping",
"fulfillable_on": "now"
}
],
"events": [
{
"id": "fulfill_evt_1",
"occurred_at": "2026-02-08T10:30:00Z",
"type": "shipped",
"line_items": [
{ "id": "line_1", "quantity": 1 },
{ "id": "line_2", "quantity": 1 }
],
"tracking_number": "123456789",
"tracking_url": "https://fedex.com/track/123456789",
"carrier": "FedEx",
"description": "Both items shipped together"
}
]
},
"permalink_url": "https://merchant.example.com/orders/456"
}
Заказ из нескольких товаров, раздельная отправка.
В этом примере показано обновление заказа для разделенных отправок. Имеется несколько событий shipped , каждое из которых ссылается на конкретные line_items в соответствующей посылке с разными номерами отслеживания. Поскольку каждая посылка представляет собой отдельное обязательство по выполнению заказа (например, разные скорости и стоимость при оформлении заказа с несколькими группами товаров), expectations также разделены.
Обязательные заголовки:
-
Webhook-Id: fulfill_evt_2 -
Webhook-Timestamp: 2026-02-09T14:00:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_multi_02",
"checkout_id": "checkout_multi_02",
"currency": "USD",
"line_items": [
{
"id": "line_1",
"item": { "id": "product_1", "title": "Item 1", "price": 5000 },
"quantity": { "total": 1, "fulfilled": 1 },
"totals": [
{"type": "subtotal", "display_text": null, "amount": 5000},
{"type": "total", "display_text": null, "amount": 5000}
],
"status": "fulfilled"
},
{
"id": "line_2",
"item": { "id": "product_2", "title": "Item 2", "price": 5000 },
"quantity": { "total": 1, "fulfilled": 1 },
"totals": [
{"type": "subtotal", "display_text": null, "amount": 5000},
{"type": "total", "display_text": null, "amount": 5000}
],
"status": "fulfilled"
}
],
"totals": [
{"type": "subtotal", "display_text": "Subtotal", "amount": 10000},
{"type": "fee", "display_text": "Shipping", "amount": 1500},
{"type": "total", "display_text": "Total", "amount": 11500}
],
"fulfillment": {
"expectations": [
{
"id": "exp_1",
"line_items": [{ "id": "line_1", "quantity": 1 }],
"method_type": "shipping",
"destination": {
"first_name": "Alice",
"last_name": "Example",
"street_address": "123 Main St",
"address_locality": "Austin",
"address_region": "TX",
"address_country": "US",
"postal_code": "78701"
},
"description": "Standard Shipping",
"fulfillable_on": "now"
},
{
"id": "exp_2",
"line_items": [{ "id": "line_2", "quantity": 1 }],
"method_type": "shipping",
"destination": {
"first_name": "Alice",
"last_name": "Example",
"street_address": "123 Main St",
"address_locality": "Austin",
"address_region": "TX",
"address_country": "US",
"postal_code": "78701"
},
"description": "Express Shipping",
"fulfillable_on": "now"
}
],
"events": [
{
"id": "fulfill_evt_1",
"occurred_at": "2026-02-08T10:30:00Z",
"type": "shipped",
"line_items": [{ "id": "line_1", "quantity": 1 }],
"tracking_number": "PKG1_TRACKING",
"tracking_url": "https://fedex.com/track/PKG1_TRACKING",
"carrier": "FedEx",
"description": "First item shipped in package 1"
},
{
"id": "fulfill_evt_2",
"occurred_at": "2026-02-09T14:00:00Z",
"type": "shipped",
"line_items": [{ "id": "line_2", "quantity": 1 }],
"tracking_number": "PKG2_TRACKING",
"tracking_url": "https://fedex.com/track/PKG2_TRACKING",
"carrier": "FedEx",
"description": "Second item shipped in package 2"
}
]
},
"permalink_url": "https://merchant.example.com/orders/457"
}
Примеры событий корректировки
Приведенные ниже примеры демонстрируют, как структурировать обновления для возвратов, отмен и возвратов средств. Список поддерживаемых событий и их определений см. в разделе «События корректировки» в обзоре жизненного цикла заказа.
Отмена заказа и возврат средств
В этом примере показан заказ, в котором товар был отменен, а деньги возвращены вскоре после оформления заказа.
В этом примере в данной версии произошли ключевые изменения:
- В основном массиве
line_itemsдля позиций, затронутыхcancellationтеперь используется"status": "removed". - Когда
line_items.statusremoved:- Значение
line_items.quantity.totalустановлено равным0. - Исходное количество сохраняется в новом поле
line_items.quantity.original.
- Значение
Обязательные заголовки:
-
Webhook-Id: adj_refund_1 -
Webhook-Timestamp: 2026-02-09T11:05:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_02",
"checkout_id": "checkout_02",
"currency": "USD",
"line_items": [
{
"id": "line_2",
"item": {
"id": "product_456",
"title": "Smart Watch",
"price": 29900
},
"quantity": {
"total": 0, // Item removed from order total.
"original": 1, // Original quantity before removal.
"fulfilled": 0 // Item was not fulfilled before cancellation.
},
"totals": [
{"type": "subtotal", "amount": 29900},
{"type": "tax", "amount": 2400},
{"type": "total", "amount": 32300}
],
"status": "removed" // Item is cancelled, returned, or refunded.
}
],
"totals": [
{"type": "subtotal", "amount": 29900},
{"type": "tax", "amount": 2400},
{"type": "total", "amount": 32300}
],
// Fulfillment expectations should still be present even if cancelled early.
"fulfillment": {
"expectations": [
{
"id": "exp_1",
"line_items": [{ "id": "line_2", "quantity": 1 }],
"method_type": "shipping",
"destination": {
"first_name": "Bob",
"last_name": "Consumer",
"street_address": "456 Oak Ave",
"address_locality": "Anytown",
"address_region": "CA",
"address_country": "US",
"postal_code": "90210"
},
"description": "Standard Shipping",
"fulfillable_on": "now"
}
]
// "events": [] // No fulfillment events occurred before cancellation.
},
"adjustments": [
{
"id": "adj_cancel_1",
"type": "cancellation",
"description": "Customer changed mind",
"line_items": [{ "id": "line_2", "quantity": -1 }],
"occurred_at": "2026-02-09T11:00:00Z",
"status": "completed"
},
{
"id": "adj_refund_1",
"type": "refund",
"description": "Refund for cancelled item",
"line_items": [{ "id": "line_2", "quantity": -1 }],
"totals": [
{"type": "subtotal", "display_text": "Subtotal", "amount": -29900}, // Negative amounts indicate money returned to the buyer. Tax-inclusive markets: Set display_text to "Subtotal (including taxes)". Amount must include tax.
{"type": "tax", "amount": -2400}, // Tax-inclusive markets: Omit this entry.
{"type": "total", "display_text": "Total", "amount": -32300}
],
"occurred_at": "2026-02-09T11:05:00Z",
"status": "completed"
}
],
"permalink_url": "https://merchant.example.com/orders/12345"
}
Возврат заказа и возмещение средств
В этом примере показан заказ, в котором товар был отправлен, доставлен, а затем возвращен, и деньги были возвращены.
В этом примере в данной версии произошли ключевые изменения:
- В основном массиве
line_itemsдля позиций, затронутыхreturnтеперь используется"status": "removed". - Когда
line_items.statusremoved:- Значение
line_items.quantity.totalустановлено равным0. - Исходное количество сохраняется в новом поле
line_items.quantity.original.
- Значение
- В
adjustmentsтипаreturnполеline_items.quantityв рамках корректировки использует отрицательное значение (например,-1) для обозначения товаров, которые возвращаются.
Обязательные заголовки:
-
Webhook-Id: adj_refund_2 -
Webhook-Timestamp: 2026-02-10T10:00:00Z
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.order": [{"version": "2026-04-08"}]
}
},
"id": "order_03",
"checkout_id": "checkout_03",
"currency": "USD",
"line_items": [
{
"id": "line_3",
"item": {
"id": "product_789",
"title": "Wireless Earbuds",
"price": 14900
},
"quantity": {
"total": 0, // Item removed from order total.
"original": 1, // Original quantity before removal.
"fulfilled": 1 // Was fulfilled before return.
},
"totals": [
{"type": "subtotal", "amount": 14900},
{"type": "tax", "amount": 1200},
{"type": "total", "amount": 16100}
],
"status": "removed" // Item is cancelled, returned, or refunded.
}
],
"totals": [
{"type": "subtotal", "amount": 14900},
{"type": "tax", "amount": 1200},
{"type": "total", "amount": 16100}
],
"fulfillment": {
"events": [
{
"id": "fulfill_evt_1",
"occurred_at": "2026-02-05T09:00:00Z",
"type": "shipped",
"line_items": [{ "id": "line_3", "quantity": 1 }],
"tracking_number": "987654321",
"tracking_url": "https://fedex.com/track/987654321",
"carrier": "FedEx",
"description": "Item shipped"
},
{
"id": "fulfill_evt_2",
"occurred_at": "2026-02-07T16:00:00Z",
"type": "delivered",
"line_items": [{ "id": "line_3", "quantity": 1 }],
"tracking_number": "987654321",
"tracking_url": "https://fedex.com/track/987654321",
"carrier": "FedEx",
"description": "Item delivered"
},
{
"id": "fulfill_evt_3",
"occurred_at": "2026-02-09T09:00:00Z",
"type": "returned",
"line_items": [{ "id": "line_3", "quantity": 1 }],
"tracking_number": "987654321",
"tracking_url": "https://fedex.com/track/987654321",
"carrier": "FedEx",
"description": "Item returned"
}
],
"expectations": [{ "...": "..." }]
},
"adjustments": [
{
"id": "adj_return_1",
"type": "return", // a matching fulfillment event is also added to represent return shipping.
"description": "Item not compatible",
"line_items": [{ "id": "line_3", "quantity": -1 }], // Uses a negative value (such as -1) to indicate a return.
"occurred_at": "2026-02-09T09:00:00Z",
"status": "completed"
},
{
"id": "adj_refund_2",
"type": "refund",
"description": "Refund for returned item",
"line_items": [{ "id": "line_3", "quantity": -1 }],
"totals": [
{"type": "subtotal", "amount": -14900}, // Negative amounts indicate money returned to the buyer.
{"type": "tax", "amount": -1200},
{"type": "total", "amount": -16100}
],
"occurred_at": "2026-02-10T10:00:00Z",
"status": "completed"
}
],
"permalink_url": "https://merchant.example.com/orders/67890"
}