What's your biggest current challenge? Have your say in Community Polls along the right column.
Our Partner & Developer boards on the community are moving to a brand new home: the .dev community forums! While you can still access past discussions here, for all your future app and storefront building questions, head over to the new forums.

Second and further pages of Variant are missing product_id when using Shopify Python API

Second and further pages of Variant are missing product_id when using Shopify Python API

nik0
Visitor
2 0 0

According to the documentation to obtain Product Variant data it is required to provide product_id. This is not very convenient when pulling the Variant data for all products regularly - every day or every few hours. It would require 1 call for each product_id. Apparently there is undocumented easier way to get all the product variants without providing product_id.

 

I'm using Shopify Python API (tried both 8.4.2 and 12.0.0). In that package I use the shopify.Variant class to get the variants. If product_id is provided in the request, the API path is in this format:

/admin/products/<product_id>/variants.json

or if explicitly putting the api version

/admin/api/2022-04/products/<product_id>/variants.json

but apparently, when product_id is not provided, the class utilizes the undocumented functionality mentioned above and requests this path:

/admin/variants.json

or with the explicit api version

/admin/api/2022-04/variants.json

 

When I use the python package the second and further pages return results with all the keys in the payload of the first page, besides the product_id, i.e.:

page1 = shopify.Variant.find(**{'limit': 250, 'since_id': 0}) // page one has the first 250 records
page2 = page1.next_page() // page two has the next 250 records
page3 = page2.next_page() // page three has the next 250 records

page1[0].pop('product_id')
page1[0].keys() == page2[0].attributes.keys() // evaluates to True for any of the 250 objects in page2
page1[0].keys() == page3[0].attributes.keys() // evaluates to True for any of the 250 objects in page3

 

I've also pulled the same data using curl and the next_page_url and surprisingly the second and further pages in those responses contain the product_id! I suspect something within the python package functionality is omitting the product_ids from the response.

 

I cannot provide you with specific examples of the URLs since that is private client's data, but I hope you get enough information from the description above to be able to recreate the issue.

 

Thanks

Reply 1 (1)

nik0
Visitor
2 0 0

This is how I test if when using curl and the api urls from the Python Shopify API Variant objects the product_id are present in all pages. Of course in this case there are more than 3 pages of 250 variants each.

Get and save the pages to files:

curl 'https://api_key:password@shop.myshopify.com/admin/api/2022-04/variants.json?limit=250' -i > variants_p01.json
curl 'https://api_key:password@shop.myshopify.com/admin/api/2022-04/variants.json?limit=250&page_info=eyJ....' -i > variants_p02.json
curl 'https://api_key:password@shop.myshopify.com/admin/api/2022-04/variants.json?limit=250&page_info=eyJ....' -i > variants_p03.json

 Count the number of product_ids in each file:

% cat variants_p01.json| grep -o 'product_id' | wc -l
     250
% cat variants_p02.json| grep -o 'product_id' | wc -l 250
% cat variants_p03.json| grep -o 'product_id' | wc -l 250