Search code examples
shopifyshopify-api

Shopify API Paginate Through Orders to Get Accurate Count


In Shopify ORDERS API, I use

/admin/api/2021-01/orders/count.json

In order to get the orders count, so I wanted to get all the orders. And by followign the REST API Documentation, I used two endpoints to do this.

/admin/api/2021-01/orders.json?status=any

/admin/api/2021-01/orders.json?limit=250&status=any; rel=next

First I would request the orders using the first endpoint where I get up to 50 orders/items in a list.

Then by using the counter as a limit, lets say I have 550 orders that I got from the response of orders/count.json

I do:

accumulated = []
iter = 0
while True:
    if len(accumulated) > count:
        break
    if iter != 1:
        url = #user first url
    else:
        url = $use second url that has next

    items = #make a request here for that url and save each order item
    accumulated+=items #this saves each list to the accumulated list so we know that we hit the count

But for some reason im only getting a fraction of the count. Lets say out of 550 on count, I only get 350 that are not duplicates of each other. Im thinking that maybe the second url, only requests the second page and doesnt proceed to the third page. Hence I was doing

first iteration = first page
second iteration = second page
third iteration = second page

all those gets into the accumulated list and stops the loop because of the condition that when accumulated exceeds count the loop will stop.

How can I make it so when I request ORDERS Endpoint in shopify. I go from the next pages properly?

I tried following shopify's tutorial in making paginated requests, but its unclear for me. on how to use it. THeres this page_info variable thats hard to me to understand where to find it and how to use it.


Solution

  • Hy! In Shopify REST api you can get max 250 orders per api call and if there are more orders you get LINK from header which contain URL for your next page request like Here you can see I have LINK variable in my response headers you just need to get this LINK and check for rel='next' flag

    But keep in mind when you hit the new URL and still you have more orders to fetch then the Header sent LINK with two URL 1 for Previous and 1 for the next.

    run this snippet to get LINK from headers

    var flag = false;
    var next_url = order.headers.link;
    if(next_url){
      flag = true
      next_url = next_url.replace("<","");
      next_url = next_url.replace(">", "");
      var next_url_array = next_url.split('; ');
      var link_counter_start = next_url_array[0].indexOf("page_info=")+10;
      var link_counter_length = (next_url_array[0].length);
      var next_cursor="";
      var link_counter;
      for(link_counter=link_counter_start; link_counter<link_counter_length; link_counter++){
        next_cursor+=(next_url_array[0][link_counter])
      }
    }
    

    for the very first api But if you have more then two pages use the following code to seprate next link from previos and next flag

    next_url = order.headers.link;
          var next_url_array,
           link_counter_start, link_counter_length,
            link_counter;
          if(next_url.includes(',')){
            next_url = next_url.split(',');
            next_url = next_url[1];
          }
      
      next_url = next_url.replace("<","");
      next_url = next_url.replace(">", "");
      next_url_array = next_url.split('; ');
      link_counter_start = next_url_array[0].indexOf("page_info=")+10;
      link_counter_length = (next_url_array[0].length);
      next_cursor="";
      for(link_counter=link_counter_start; link_counter<link_counter_length; link_counter++){
        next_cursor+=(next_url_array[0][link_counter])
      }
      if(next_url_array[1] != 'rel="next"'){
        flag = false;
      }