Development discussions around Shopify APIs
This has been posted before, but the Shopify support hasn't answered it yet... And it is a good and reasonable question.
I want to get all the metafields for all the products.
My understanding is that there is no API like:
/admin/products/metafields.json
The only one is like this:
/admin/products/#productid#/metafields.json
Therefore, the only way is to get all the metafields for all the products is to make one API call per product!
It is also impossible to cache the data, because it takes one API call per product just to check if the metafields for that product have been updated! For large stores, it is handicapping API applications and forcing one call per product, resulting in extremely time-consuming fetches for tiny amounts of data.
Can you please add an API call that works like this? /admin/products/metafields.json
It would return all the metafields for all the products, 250 at a time. We can then page through in a reasonable amount of time.
Or, does anyone know some other workaround to get all the product metafields at once?
I must say I don't always understand why many people seem to very often push back on feature requests.
This is just that, a feature request.
I don't expect Shopify to implement all of them. I trust they have the intelligence and inside knowledge to prioritize the various requests based on the number of people asking for it, complexity of implementation, risk, peformance, etc... If they don't implement it that is fine, but are we allowed to at least express that we would like some enhancement?
Yes the work around is acceptable, but why wouldn't we strive for better? Again I don't expect Shopify to implement all requests, but it seems to me they are the one that have the knowledge to priortize. One important input is the number of people requesting it in the forums.
IMO Jamie's answer was good enough, but +1 are ok.
I really wish that Shopify would use something like uservoice to keep track feature requests.
Something like Xero does: https://xero.uservoice.com/forums/5528-xero-accounting-api
Regarding the question at hand, my own context is that I want to generate a large report that shows some metafields.
My comments are not push back, though I do like more info on the whys.
Context is important and this thread is seen internally.
I cache the retrieved data once it's received so the call doesn't go out often. However should the shop owner wish to resync their product data manually then it's a 10 minute wait while everything is re-cached.
For now to get around this long wait time I'm just storing all custom meta data on my end and skipping Shopify's metafields.
I can see HunkyBill's point that should the feature be introduced it could have a negative impact on Shopify as people might cram all their misc data into metafields.
However should the shop owner wish to resync their product data manually then it's a 10 minute wait while everything is re-cached.
If you're storing the product updated_at value you can use that as an early indicator if you even need to sync a product or not. If it matches your last cache time you know the metafields haven't changed. May save you a call or two.
Good point, thanks.
Problem will never be solved because developers doesn't understand why other CMS have SKU by default in main table (like product id and product name). Attributes (include features and combinations) alwais contained in other tables but product SKU available as main field any time.
We have simple behaviour: user create new product. Fill all data one time. And next time just search product by SKU to update price and quantity.
We can't cache data because if user change something directly in shop: data from cache will lie and user will have invalid data.
Also local cache means that customer must write functional identical to your CMS and backend to it. There is no need to buy CMS if you must develop new CMS just to work with CMS.
Your CMS is not the first CMS with which we work and we know these problems.
Problem will never be solved because developers doesn't understand why other CMS have SKU by default in main table (like product id and product name). Attributes (include features and combinations) alwais contained in other tables but product SKU available as main field any time.
We have simple behaviour: user create new product. Fill all data one time. And next time just search product by SKU to update price and quantity.
We can't cache data because if user change something directly in shop: data from cache will lie and user will have invalid data.
Also local cache means that customer must write functional identical to your CMS and backend to it. There is no need to buy CMS if you must develop new CMS just to work with CMS.
Your CMS is not the first CMS with which we work and we know these problems.
Initially I also wanted to get metafields with a call to products.json, but after read all replies here, I changed my mind 🙂
+1 HunkyBill
Hey Guys,
Is there any update on this issue?
I am trying to read all products from Shopify Admin API. I also need to include the product metafields.
I have abou 7000 products and if I use the currentl solution it will took almost an hour to get these products, which is very very long time.
Kiflay
@fadi. 7000 products is 28 API calls. You get about 40 without delay, so without dwelling on what that exactly means, consider it quick, not very very long time.
Additionally, now with GraphQL at your disposal, you are free to get your products with the metafield data you crave at the same time. So it seems you are one lucky customer! Not only can you get your get products fast, but you no longer need to make secondary calls for the metafields.
@HUnkyBIll Thanks for the quick response.
You right to get all products is 28 API call.
To get metafield for each product will be
(7000/2) seconds
I have to fire a single request for each product. it Will take more than an hour.
So am not sure what do you mean it will be only 28 API
@fadi.
You missed something crucial in my explanation. Read it again. Closely. With GraphQL you can retrieve a product AND its metafield data of interest to you.
So your math is off. I told you you now get to skip those 7000 extra calls. Pay attention man! I waste no words. They all matter.
@HunkBill,
Look man I didn't ask you an advice with what I can and I can't do with GraphQL.My question is related to the REST API and metafields
You said
"7000 products is 28 API calls. You get about 40 without delay, so without dwelling on what that exactly means, consider it quick, not very very long time."
So how does getting the metafields for each product is not taking long calls for my example about an hour.
Allow me to interject here.
With the new GraphQL Admin API, it is possible to obtain metafields for products in a way that does not add to your REST Admin API call limit. It is possible to combine your existing REST calls, which gathers a ton of data at the Product level, and then use the "admin_graphql_api_id" from that call to query the metafields for those products using GraphQL.
Starting with the assumption that you already have the REST Admin API call to the Product endpoint, which gets you the "admin_graphql_api_id" of the individual products, you can use a GraphQL query similar to the following to get the metafields.
{
product(id: "gid://shopify/Product/1321540321336"){
metafields(first:10) {
edges {
node {
id
key
value
valueType
namespace
}
cursor
}
pageInfo {
hasNextPage
}
}
}
}
The "cursor" and "pageInfo/hasNextPage" fields are there to help you determine if pagination is necessary on the metafields.
Performing this query in my test store on a product that has 2 metafields costs 5, which means with the GraphQL Admin APIs restoreRate of 50, you could get metafields on 10 products per second without getting throttled.
For more information on the GraphQL Admin API call limits, see the docs here.
Alex | Shopify
- Was my reply helpful? Click Like to let me know!
- Was your question answered? Mark it as an Accepted Solution
- To learn more visit the Shopify Help Center or the Shopify Blog
Thanks Alex
That could help.
To get product metafields using the REST API there is no solution other than firing a single request for each product. Is this right Alex?
@ Fadi, you get spoon-fed an answer that saves your bacon and you get upset? Chill out. If you can make a call to the RestAPI endpoints, you can make a GraphQL call. And as Alex and I told you, with ONE call you can get 250 products AND their metafields.
So move on, write your code and be happy someone filled you in and gave you free correct advice. It is common courtesy to be gracious and not defensive, as if I did something to offend you.
Hi All,
As everyone recommended GraphQL for better querying, we thought of trying this but from our initial testing, it seems like it's not giving a big advantage to us in querying.
using a REST API, we can get one product's 250 metafields in one call using "admin/products/{{id}}/metafields.json?limit=250" call. When it comes to GraphQL, the query cost is controlling us to have a maximum of 3 products at a time in the call i.e
{ products(first: 3) { edges { node { legacyResourceId metafields (first: 250) { edges { node { legacyResourceId value namespace key } } } } } } }
Hi All,
Can anyone respond to these queries?
Kind of amazed that this issue is not made easier after years.
In my use case i just need to get a list of all metafields, to know what the partner has created already, so i can update their content.
Getting all their metafields is a pain in the ass though.
Should be made possible to get all metafrields with a resource owner. ie. all metafields on a owner_resource=product, or variant or image whatever.
The point that has been made by all the contributors are totally valid and I view the last response from a so called expect as both narrow and unhelpful in the extreme. There is a clear requirement for this resource from a large number of customers, please address the problem rather than dismissing it in a banal manner.
User | RANK |
---|---|
50 | |
11 | |
6 | |
5 | |
5 |
Thanks to all who participated in our AMA with 2H Media on planning your 2023 marketing bu...
By Jacqui Mar 30, 2023Thanks to all Community members that participated in our inaugural 2 week AMA on the new E...
By Jacqui Mar 10, 2023Upskill and stand out with the new Shopify Foundations Certification program
By SarahF_Shopify Mar 6, 2023