Getting the list of all vendors - the best method

Topic summary

Developers are struggling to retrieve a complete list of all product vendors from a Shopify store via API, particularly when there are more than 250 vendors.

Current Methods & Limitations:

  • Iterating through all products (Option 1): Works but is inefficient, requiring pagination through entire product catalog and deduplication of vendor names
  • Using productVendors query (Option 2): Limited to 250 results with no pagination support—lacks an after parameter to accept cursors for retrieving additional records
  • Custom page templates: Requires creating password-protected pages that output vendor lists, adding authentication complexity
  • Web scraping: Possible but fragile workaround

Key Issues:

  • Shopify treats vendors as simple product attributes rather than a proper taxonomy or collection
  • The productVendors query exists in both Admin API and Storefront API but cannot paginate beyond 250 results
  • Similar problems exist for product tags, acknowledged by Shopify staff years ago but still unresolved
  • Bulk editing vendor names requires tedious manual copy-paste operations

Current Status:

One user reported contacting Shopify Partner Support in July, who confirmed the missing pagination parameter as an issue and added it to their internal GitHub backlog. No timeline for resolution has been provided. Most developers continue using Option 1 (iterating all products) despite its inefficiency.

Summarized with AI on November 5. AI used: claude-sonnet-4-5-20250929.

Another day another struggle.

Needing a list of ALL vendors of the shop. After searching for quite a while, came up with these solutions:

  1. Iterating through all products. Obviously, less effective.

Example: https://community.shopify.com/c/shopify-apis-and-sdks/is-there-any-way-to-get-list-of-vendors-and-type-from-shopify/m-p/666701/highlight/true#M45201

{
  products(first: 250, after: "#{cursor}") {
    edges {
      cursor
      node {
        id
        vendor
      }
    }
    pageInfo {
      hasNextPage
    }
  }
}
  1. Getting vendors through Shop’s productVendors object. Has limit of 250 records though “first” parameter and no way to iterate, thus absolutely useless when we need to get them all.

Code example: https://community.shopify.com/c/shopify-apis-and-sdks/json-list-of-vendors-api/m-p/600737/highlight/true#M40690

query productVendors {
  shop {
    productVendors(first: 200) {
      edges {
        node
      }
    }
  }
}

There is a similar problem with product tags as mentioned in this thread. There even Shopify official staff admitted the problem but years passed, the problem is still there.

  1. Creating a template accessible via store custom page with content similar to:
{% layout none %}{{shop.vendors|json}}

Code example from the same thread as above.

There is even a blog post that describes how to use similar method to get all the vendors and product tags as it’s impossible to do with API. His code for the vendors seems to be more complicate from the quoted above.

Well this solution likely works, and in one of the threads above it’s been reported as the year-proof solution, but there is a problem in my case. The store is password protected so to access this page from within my app, I would need to write a separate authentication code just for this task. So I thought I could query the page through admin API. And I actually could, but page’s body_html is empty, so it returns an uninterpreted page content and I haven’t figured out how can you request the actual page content though the API.

  1. As found on this stackoverflow thread you can also get this straight without the need to create any page templates by querying
https://{{ shop_doamin }}/admin/products/vendors.json

This is probably something that the web based Shopify app uses by itself and is not intended to be used by an external API which again would require another layer of authorization to code.

So how could I query all the vendors with API or access the contents of the generated page which uses a custom template as in case 3. ?

5 Likes

Tragically, I do not think you can solve this “perfectly” (as desired in case 3)

First off: GREAT post here, I am dealing with a similar problem

Second: I was horrified to see Shopify does not treat “vendors” like a Taxonomy or a Collection, so I am in a situation where a vendor name needs to change, but seems like our only option is to use the bulk editor and copy/paste them all one.at.a.time

Lastly: I think your only 2 solutions for CASE 3 (as you describe it) is to

1- manually enter ALL the vendors you want on the server side of your system [yuk]

  • or -

2- you COULD (in theory) scrape the page. For example, this may be absurd but might work: create a CUSTOM page template that spits out XML! then use that “page template” as your makeshift feed into your system to “access the contents of the generated page”. In this case you need yet another page.

For example:

New Page Template: MyVendorsAPI = have that page spit out JSON or XML for your vendors, just code it up in liquid. Make sure that page does not render HTML (nor the template, nor header, nor anything) - then try to SCRAPE that page for your JSON or XML list of “all vendors”. Once you have that then you can “do stuff” with it.

But yea… Its crazy to me there is no way to just “get all vendors” via the API.

2 Likes

up !

This is still busted and inefficient. After finding no other support, I’m settling with option 1 to query vendor and cursor for all products then I remove duplicates.

I would rather use the after argument with a cursor in the productVendors query to collect all vendors.

It’s a long shot, but can anyone internally propose this change to the graphql Admin API?

1 Like

The fact that they have both productTypes and productTags available to query, is ever more reason to give us productVendors.

https://shopify.dev/docs/api/storefront/2024-07/queries/productTypes

they actually do have it now, you can use this query in Shopify’s GraphiQL:

query productVendors {
shop {
productVendors(first: 200) {
edges {
node
}
}
}
}

If you have over 200 vendors you need to have pagination.

2 Likes

What API version are you using? I’m getting this error when I run that query on the Storefront API (2024-07):

Field ‘productVendors’ doesn’t exist on type ‘Shop’

1 Like

Confirmed this works—however, this is for the Admin API, not the Storefront API.

You can use productVendors GraphQL query.

More than a few people have brought up the productVendors query is now available for this exact case, but since the beginning of this thread (evidenced in the original post) that query has existed in the same insufficient form as it does now.

As @webxtor showed in option 2 of the original post, yes you can use productVendors; the caveat is that the productVendor type has only the first parameter and lacks an after param that could accept a cursor to facilitate pagination. Without access to pagination, the productVendors query is only useful if you know you’re only dealing with 250 vendors or less.

Back in July I got in touch with Shopify Partner Support and they confirmed the missing parameter for productVendors was an issue, adding it to their internal Github issues backlog for the Admin GraphQL API. I requested an update today, but I expect that they have not begun work to make the change, as there is no evidence of a change in the API’s latest release candidate. I’ll report back here if/when I do receive any tangible update on their progress.

I am still using and recommend option 1 for stores where there are 250+ vendors, in spite of its clunkiness.

1 Like

Its 2025 November 6th and finally there is a way to directly query and paginate through the list of vendors using Shopify’s GraphQL Admin API.

Here’s how to:

Get the first Page:
query { productVendors(first: 250) { edges { node } pageInfo { hasNextPage endCursor } } }

Get Subsequent Pages Once you have the endCursor from the previous page call…
query { productVendors(first: 250, after: “CURSOR_FROM_PREVIOUS_PAGE”) { edges { node } pageInfo { hasNextPage endCursor } } }

Happy Programming!!