Skip to main content
View as Markdown

Step 3: Managing Your Orders

This guide walks you through the full FBPI order lifecycle — from receiving a webhook notification to handing the shipment off to noon logistics. By the end, your system will process live orders end to end.

How It Works

Every FBPI order follows this sequence:

Key points about this flow:

  • Acknowledgment happens at the webhook level. Returning HTTP 200 to noon's webhook notification is how you acknowledge receipt. noon retries delivery on any non-2xx response.
  • Retrieving full details requires a GET call. The webhook payload contains only order_nr. Call GetFbpiOrder to get items, statuses, and pricing.
  • Marking items out of stock is optional. Only call UpdateOrder if some items cannot be fulfilled. Skip it entirely if all items are available.
  • Manifestation is manual. There is no API for creating manifests. You must complete this step in Seller Lab.
  • Unacknowledged orders become Killed. If your webhook fails to return HTTP 200 after all retries, noon marks the order as Killed and the partner absorbs the impact.

Prerequisites


Step 1 — Retrieve Your Order Details

When a customer places an order, noon sends a notification to your webhook. Return HTTP 200 immediately, then call GetFbpiOrder (GET /fbpi/v1/fbpi-order/{fbpi_order_nr}/get) to retrieve the full order.

warning

Return HTTP 200 to the webhook as quickly as possible — before any downstream processing. If noon does not receive a 2xx within the timeout window, it will retry, and eventually mark the order as Killed.

session = get_authenticated_session()

order_nr = "NFBO123456789" # extracted from the webhook payload

response = session.get(
f"https://noon-api-gateway.noon.partners/fbpi/v1/fbpi-order/{order_nr}/get",
headers={"User-Agent": "MyApp/1.0.0"},
timeout=30,
)
response.raise_for_status()
order = response.json()

Response:

<!-- from: v1GetFbpiOrderResponse -->
{
"fbpi_order_nr": "NFBO123456789",
"mp_code": "noon",
"mp_order_nr": "NF123456789",
"mp_country_code": "ae",
"customer_country_code": "ae",
"merchant_code": "STR-12345",
"currency_code": "AED",
"warehouse_code": "WH-NOON-001",
"order_created_at": "2026-04-09T08:42:15Z",
"items": [
{
"mp_item_nr": "NFBO123456789-1",
"partner_sku": "MY-SKU-001",
"mp_status": "MP_ITEM_STATUS_CONFIRMED",
"integration_status": "INTEGRATION_ITEM_STATUS_ACKNOWLEDGED",
"delivered_invoice_price": 149.99,
"cancellation_reason_code": null
}
]
}

mp_status values — the marketplace's view of the item:

ValueMeaning
MP_ITEM_STATUS_CONFIRMEDItem confirmed and active on the marketplace
MP_ITEM_STATUS_CANCELLEDItem cancelled by the marketplace
MP_ITEM_STATUS_UNSPECIFIEDDefault — treat as unresolved

integration_status values — your integration's view of the item:

ValueMeaning
INTEGRATION_ITEM_STATUS_ACKNOWLEDGEDOrder received and acknowledged by your webhook
INTEGRATION_ITEM_STATUS_OUT_OF_STOCKItem marked out of stock by your integration
INTEGRATION_ITEM_STATUS_SHIPPEDShipment created for this item
INTEGRATION_ITEM_STATUS_UNSPECIFIEDDefault — treat as unresolved

You'll know this worked when you receive a response with items populated and integration_status set to INTEGRATION_ITEM_STATUS_ACKNOWLEDGED.

To retrieve customer shipping details, call GetFbpiOrderCustomerData (GET /fbpi/v1/fbpi-order/{fbpi_order_nr}/customer-details/get). See GetFbpiOrderCustomerData.


Step 2 — Mark Out-of-Stock Items

If any items in the order cannot be fulfilled, call UpdateOrder (POST /fbpi/v1/fbpi-order/update) to mark them as out of stock before creating a shipment. Skip this step if all items are available.

warning

Unacknowledged items that are not marked OOS and not shipped within the SLA window cause the order to become Killed. A Killed order cannot be recovered.

session = get_authenticated_session()

response = session.post(
"https://noon-api-gateway.noon.partners/fbpi/v1/fbpi-order/update",
json={
"fbpi_order_nr": "NFBO123456789",
"items": [
{
"mp_item_nr": "NFBO123456789-2",
"status": "UPDATE_ORDER_REQUEST_ITEM_STATUS_OUT_OF_STOCK"
}
]
},
headers={"User-Agent": "MyApp/1.0.0"},
timeout=30,
)
response.raise_for_status()
result = response.json()

The status field accepts one value: UPDATE_ORDER_REQUEST_ITEM_STATUS_OUT_OF_STOCK.

You'll know this worked when a subsequent GetFbpiOrder call shows the marked items with integration_status: INTEGRATION_ITEM_STATUS_OUT_OF_STOCK.

For the full schema, see UpdateOrder.


Step 3 — Create a Shipment

Call CreateShipment (POST /fbpi/v1/shipment/create) to register each shipment with noon. Include the noon-issued AWBAirway Bill — a tracking code assigned to each shipment for each package.

Getting an AWB: Call GetNoonLogisticsAWBs (POST /fbpi/v1/shipment/noon-logistics-awbs/get) to get AWB numbers from noon. You can request them in bulk (e.g. 500 at a time) for pre-allocation, or one per shipment.

session = get_authenticated_session()

response = session.post(
"https://noon-api-gateway.noon.partners/fbpi/v1/shipment/create",
json={
"warehouse_code": "WH-NOON-001",
"integration_shipment_nr": "SHIP-2026-001",
"fbpi_order_nr": "NFBO123456789",
"awbs": [
{
"courier": "noon",
"awb_nr": "AWB123456789"
}
],
"items": [
{
"mp_item_nr": "NFBO123456789-1"
}
]
},
headers={"User-Agent": "MyApp/1.0.0"},
timeout=30,
)
response.raise_for_status()
result = response.json()

Key request fields:

FieldTypeDescription
warehouse_codestringYour integration warehouse code
integration_shipment_nrstringYour internal shipment ID — no specific format required
fbpi_order_nrstringThe FBPI order number from Step 1
awbs[].courierstring"noon" for noon logistics, or your courier's name
awbs[].awb_nrstringAWB number from GetNoonLogisticsAWBs or your courier
items[].mp_item_nrstringMarketplace item number for each item in this shipment

Response:

<!-- from: FbpiService_CreateShipment 200 response -->
{}

A successful CreateShipment call returns HTTP 200 with an empty body — the status code is the success signal. The response carries no shipment identifier, so use the integration_shipment_nr you supplied (or fbpi_order_nr) to look the shipment up afterwards.

You'll know this worked when a subsequent GetShipment call returns the shipment with a confirmed AWB. See GetShipment.

If a shipment must be cancelled, use CancelShipment.


Step 4 — Complete the Manifest

Once shipments are created, they appear as pending in Seller Lab. noon will not schedule a pickup until you create a manifest. There is no API for this step — complete it manually in Seller Lab.

  1. Log in to noon Partner Platform.
  2. Click the menu icon (☰) at the top left and select Fulfilled by Partner → Manifestation.

  1. Select your warehouse.

  1. Click Create Manifest.

  1. Enter the number of shipments you are handing over and click Save Changes.

info

We are working on an automatic manifestation option that will make this step optional.

You'll know this worked when the manifest appears as confirmed in Seller Lab and the shipments are no longer in pending status.


Step 5 — Pack and Hand Over

Packing: Pack the order in noon-approved packaging material and print the shipment label returned by GetShipment. Affix the label to the package.

Handover: noon collects based on the handover preference you selected during warehouse setup:

  • Pickup — noon's courier collects from your warehouse based on processing time, manifestation data, and your handover settings.
  • Drop-off — you deliver the packages directly to a noon logistics hub.

Once handed over, the shipment status updates automatically in the noon system.


Testing

Use CreateSandboxOrder (POST /fbpi/v1/sandbox-order/create) to place a test order against your warehouse without involving a real customer.

session = get_authenticated_session()

response = session.post(
"https://noon-api-gateway.noon.partners/fbpi/v1/sandbox-order/create",
json={
"warehouse_code": "WH-NOON-001",
"idempotency_key": "test-001",
"items": [
{
"status": "MP_ITEM_STATUS_CONFIRMED",
"partner_sku": "MY-SKU-001"
}
],
"country_code": "ae"
},
headers={"User-Agent": "MyApp/1.0.0"},
timeout=30,
)
response.raise_for_status()
sandbox_order = response.json()
# sandbox_order["fbpi_order_nr"] — use this to run the full order flow

Key notes for CreateSandboxOrder:

  • idempotency_key must be unique per test run and at most 10 characters.
  • partner_sku is optional — the server assigns a dummy value if omitted.
  • country_code defaults to "ae" if omitted.

Running the test:

  1. Call CreateSandboxOrder — your webhook receives a notification with the returned fbpi_order_nr.
  2. Confirm your webhook returns HTTP 200.
  3. Call GetFbpiOrder with the sandbox fbpi_order_nr and verify the response includes all expected fields.
  4. Run the acknowledgment and shipment steps as you would in production.
  5. Check the FBPI Orders Dashboard — the sandbox order should show a successful webhook acknowledgment and a created shipment.

Common failures:

SymptomLikely causeWhat to do
Webhook never firesWarehouse not active or webhook URL misconfiguredCheck warehouse status in Seller Lab
GetFbpiOrder returns 404Order not yet created or wrong fbpi_order_nrWait a few seconds and retry
Shipment creation failsAWB already used or invalid mp_item_nrUse a new AWB from GetNoonLogisticsAWBs; verify item numbers match
Order shows as KilledWebhook timed out or returned non-2xxCheck webhook logs; ensure your endpoint responds within the timeout

Next Steps