{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Inbound"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"inbound","__idx":0},"children":["Inbound"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Applies to the Fulfilment API only."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["An inbound is a booked delivery of stock into a Quiqup warehouse. It is how inventory comes into existence."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The warehouse is resolved automatically from your account's facility configuration. There is no warehouse parameter to send. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /api/fulfilment/slots/available"]}," ignores any ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["warehouse_code"]}," you pass it."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"the-normal-path","__idx":1},"children":["The normal path"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["1. Find a slot."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /api/fulfilment/slots/available"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["start_time"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["end_time"]},". Both are required. It returns the windows the warehouse can take a delivery in."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["2. Book it."]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /api/fulfilment/inbound/book"]},"."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Notes"},"children":["Notes"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["items"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The SKUs you are sending. Required, at least one. Each item needs ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sku"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["quantity"]}," (at least 1) and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["unit_price"]}," (not 0). Every SKU must be an active product on your account."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["slot_start_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["slot_end_at"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The window from step 1. Send both, or neither. The start must be in the future. Without a slot the inbound lands as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PENDING"]}," rather than ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BOOKED"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["attendees"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Who will be at the delivery. Required, with at least one name, when you send a slot."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["inbound"]}," (default), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_return"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["facility_return"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["original_order_ids"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["On each item. Required on every item for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_return"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["facility_return"]},": the orders the stock came back from."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["partner_inbound_id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Your own reference. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#duplicates"},"children":["Duplicates"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["courier_name"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["courier_contact"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plate_number"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The driver. Required when the warehouse needs a gate pass and the booking has a slot; otherwise they can be added later."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pickup_address"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pickup_contact"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Only if Quiqup is collecting from your supplier rather than you delivering. Send both: the inbound is a collection only when both are present."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["documents"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Invoices, manifests, gate passes."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On each item you can also send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["batch_number"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["expiry_date"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["manufacturing_date"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["uom"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["uom_units"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"partner_inbound_id\": \"PO-2026-0042\",\n  \"slot_start_at\": \"2030-03-04T06:00:00Z\",\n  \"slot_end_at\": \"2030-03-04T08:00:00Z\",\n  \"attendees\": [\"Omar Khalid\"],\n  \"items\": [\n    { \"sku\": \"TSHIRT-BLK-M\", \"quantity\": 200, \"unit_price\": 22.5 },\n    { \"sku\": \"VITC-60\", \"quantity\": 48, \"unit_price\": 31, \"batch_number\": \"LOT-2030-02\", \"expiry_date\": \"2031-02-28T00:00:00Z\" }\n  ],\n  \"courier_name\": \"Omar Khalid\",\n  \"courier_contact\": \"+971500000002\",\n  \"plate_number\": \"DXB-A-12345\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The response carries ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["inbound_id"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["asn_id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["already_existed"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["3. Send the stock."]}," Off-API."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["4. Wait for the GRN (goods received note)."]}," The warehouse counts what arrived. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /api/fulfilment/inbounds/{id}/items"]}," returns the line items: SKU, expected quantity, received, usable, unusable, quarantine, plus batch number, expiry date and manufacturing date."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Expected and received will not always match. That difference is the whole reason to read this endpoint rather than assume the booking was the outcome."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"duplicates","__idx":2},"children":["Duplicates"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["One slot, one inbound."]}," A booking for a window your account has already booked returns the existing inbound with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["already_existed: true"]},". Nothing new is created, and the items you sent are not added to it, so a second shipment needs a window of its own."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["partner_inbound_id"]}," is a reference for you, not a uniqueness key. For a booking without a slot, a retry with the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["partner_inbound_id"]}," that arrives while the first request is still being processed returns the same inbound. After that, Quiqup does not check it, and every unscheduled booking creates a new inbound. Send it anyway: it is how you follow a shipment across a cancel and rebook."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"reading-inbounds","__idx":3},"children":["Reading inbounds"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /api/fulfilment/inbound/{id}"]}," returns one inbound with its items and documents."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /api/fulfilment/inbounds"]}," lists them, 100 to a page unless you send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["limit"]},". Filter by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["state"]}," (the status), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ids"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["asn_id"]},", or by the start of the delivery window with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["slot_from"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["slot_to"]}," (dates, inclusive; unscheduled inbounds have no window and are left out)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /api/fulfilment/inbounds/{id}/items"]}," returns the GRN lines, as above."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The inbound carries a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["services"]}," object (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["barcode_printing"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customs_clearance"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["lab_testing"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["stickering"]},"). It is read-only: these added-value services are recorded by Quiqup and cannot be requested through the API."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"statuses","__idx":4},"children":["Statuses"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Status"},"children":["Status"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PENDING"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Created without a slot. Not yet scheduled."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BOOKED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Slot confirmed. The ASN (advance shipping notice) exists in the WMS (the warehouse management system)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IN_PROGRESS"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Being received at the warehouse."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["COMPLETED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Received and counted."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CLOSED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Finished."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CANCELLED"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Cancelled. Soft delete: the record stays."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ERROR"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Something failed."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The statuses are uppercase on the API. The matching webhook events are lowercase: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BOOKED"]}," arrives as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["inbound.booked"]},". Each ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["inbound.*"]}," event carries the inbound (its id, your reference, the ASN number, type, new and previous status, warehouse, slot and timestamps) and its item lines with expected and received quantities. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/webhooks"},"children":["Webhooks"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /api/fulfilment/inbound/{id}/state-history"]}," returns every transition with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["old_status"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["new_status"]},", who changed it, the reason, the source (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["webhook"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pull"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["manual"]},") and the underlying ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["wms_status"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"scheduling-a-pending-inbound","__idx":5},"children":["Scheduling a pending inbound"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["An inbound booked without a slot sits at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PENDING"]},". Two ways to give it one:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /api/fulfilment/inbounds/{id}/schedule"]}," with slot times and attendees."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PATCH /api/fulfilment/inbounds/{id}"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["slot_start_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["slot_end_at"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["attendees"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Either moves it to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BOOKED"]}," and triggers the full workflow: ASN creation, calendar booking, facility notification. Both refuse slot times on an inbound that is not ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PENDING"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PATCH"]}," is also how you attach courier details and documents after booking, on a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PENDING"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BOOKED"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IN_PROGRESS"]}," inbound. Fields you leave out are kept."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"cancelling","__idx":6},"children":["Cancelling"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /api/fulfilment/inbounds/{id}/cancel"]},", with an optional ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reason"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PENDING"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BOOKED"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IN_PROGRESS"]}," inbounds can be cancelled. It is a soft delete: the record stays with status ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CANCELLED"]},", and the WMS ASN, the scheduling event and the facility notification are cleaned up. A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PENDING"]}," inbound that has no warehouse ASN yet is cancelled at once, and the response message is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Inbound cancelled"]},". Any inbound with an ASN is cancelled in the background: that includes a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PENDING"]}," inbound booked without a slot whose ASN was registered at booking, and every ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BOOKED"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["IN_PROGRESS"]}," inbound. The call then returns the message ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Inbound cancellation signaled"]},", and the status becomes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CANCELLED"]}," shortly after. Read the inbound back with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /api/fulfilment/inbound/{id}"]}," to confirm."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["A booked inbound cannot be moved to another slot."]}," Cancel it and book again. That gets you a new inbound ID, so carry your own ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["partner_inbound_id"]}," if you need to follow the shipment across the change. A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PENDING"]}," inbound you no longer need is dropped the same way: cancel it."]}]},"headings":[{"value":"Inbound","id":"inbound","depth":1},{"value":"The normal path","id":"the-normal-path","depth":2},{"value":"Duplicates","id":"duplicates","depth":2},{"value":"Reading inbounds","id":"reading-inbounds","depth":2},{"value":"Statuses","id":"statuses","depth":2},{"value":"Scheduling a pending inbound","id":"scheduling-a-pending-inbound","depth":2},{"value":"Cancelling","id":"cancelling","depth":2}],"frontmatter":{"seo":{"title":"Inbound"}},"lastModified":"2026-10-16T10:38:45.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/fulfilment/inbound","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}