I’m having trouble with the Shopify fulfillment API endpoint. When I try to create a new fulfillment using the /fulfillments.json endpoint, I keep getting a {"errors":"Not Found"} response.
The API keeps returning a 404 error no matter what I try. Has anyone successfully used this endpoint with the 2023-01 API version? I’m wondering if there’s something wrong with my request structure or if the endpoint has changed.
That 404 happens because Shopify killed the global fulfillments endpoint in 2023-01. Hit this same issue during a client migration - wasted hours figuring out the new workflow. Your request structure looks right for the old API, but now you’ve got to use fulfillment orders only. First, GET /orders/{order_id}/fulfillment_orders.json to grab the fulfillment order details. Then POST to /fulfillment_orders/{fulfillment_order_id}/fulfillments.json with that ID. Main difference: ditch the line_items_by_fulfillment_order wrapper completely and use fulfillment_order_line_items straight in your payload. Use the line item IDs from the fulfillment order response, not the original order ones.
This is happening because the 2023-01 API version changed how endpoints work. They deprecated the direct /fulfillments.json endpoint and replaced it with a new flow that uses fulfillment orders first. Instead of posting to /fulfillments.json, you now need /fulfillment_orders/{fulfillment_order_id}/fulfillments.json. Get the fulfillment order ID from the order’s fulfillment_orders array first. I hit this same issue migrating from an older API version last year. Here’s what you need to do: fetch the order details, grab the fulfillment order ID, then create the fulfillment against that specific fulfillment order. They made this change to handle multi-location fulfillment better. Update your endpoint URL to include the fulfillment order ID in the path - don’t pass it in the request body anymore.
yeah, same issue here! the old endpoint’s broken in 2023-01. you need to switch to the fulfillment orders workflow - grab the fulfillment_order_id from your order, then POST to /fulfillment_orders/{id}/fulfillments.json instead of /fulfillments.json. pain in the ass but that’s the new way.
Hit the same nightmare updating our app. Use the fulfillment orders endpoint like everyone’s saying, but double-check your access token scopes first - you need write_fulfillments and read_fulfillment_orders. Test with a fresh token before rewriting all your code.
Had the exact same issue when I upgraded our integration. What tripped me up was the fulfillment_order_id in your request body doesn’t match the new endpoint structure. When you switch to /fulfillment_orders/{fulfillment_order_id}/fulfillments.json, you need to ditch the line_items_by_fulfillment_order wrapper from your payload. Just send the fulfillment object with tracking_info, notify_customer, and line_items directly. Also, the line item IDs are different now - they’re fulfillment order line item IDs, not the original order line item IDs. Pull those from the fulfillment order response, not the original order. This caught me off guard since the docs weren’t clear about the payload differences.