Question

I'm trying to use the categoryId in my findItemsAdvanced query:

api.execute('findItemsAdvanced', {
         'keywords': 'laptop',
         'categoryId': '51148'}

The results I get are, for example (printing the searchResult dictionary):

'itemId': {'value': '200971548007'}, 'isMultiVariationListing': .............
'primaryCategory': {'categoryId': {'value': '69202'}, 'categoryName': {'value': 'Air Conditioning'}}  
....."

You can see that the result has a categoryId of 69202, and not 51148.

What am I doing wrong here? I'm just using the finding.py code at:

https://github.com/timotheus/ebaysdk-python

Thanks


Edit

I've done some tests. I extracted the XML that the SDK builds. If I call with:

'categoryId': '177'

The response is:

    the request_xml is  <?xml version='1.0' encoding='utf-8'?><findItemsAdvancedRequest 
xmlns="http://www.ebay.com/marketplace/search/v1/services"><categoryId>177</categoryId>
<itemFilter><name>Condition</name><value>Used</value></itemFilter><itemFilter>
<name>LocatedIn</name><value>GB</value></itemFilter><keywords>laptop</keywords>
<paginationInput><entriesPerPage>100</entriesPerPage><pageNumber>1</pageNumber>
</paginationInput></findItemsAdvancedRequest>

and I get the same with

'categoryId': ['177']

I find this a bit odd, I thought the appropriate name for the XML categoryId was 'CategoryId' with a capital C. If I do that I don't get an error, but the result is not restricted to the categoryId requested. Doing it like above, I still get the error:

Exception: findItemsAdvanced: Domain: Marketplace, Severity: Error, errorId: 3, Invalid category ID.

Was it helpful?

Solution

The code below will do a keyword search for 'laptops' across the UK eBay site and restrict the search to the two categories Apple Laptops(111422) and PC Laptops & Netbooks(177). In addition the results are filtered to only show the first 25 used items that are priced between £200 and £400. The results are also sorted by price from high to low.

There are a few things to keep in mind about this example.

  • It assumes that you have already installed ebaysdk-python.
  • According to the eBay docs the categoryId field is a string and more than one category can be specified. An array is therefore used to hold the category ids that we are interested in.
  • Our request needs to search for items in the UK eBay site. We therefore pass EBAY-GB as the siteid parameter.
  • Category ids are different across each eBay site. For example the category PC Laptops & Netbooks(177) does not exist in Belgium. (Which incidently is the site that is used in the ebaysdk-python finding.py example.)

This example is also available as a Gist

import ebaysdk
from ebaysdk import finding

api = finding(siteid='EBAY-GB', appid='<REPLACE WITH YOUR OWN APPID>')

api.execute('findItemsAdvanced', {
    'keywords': 'laptop',
    'categoryId' : ['177', '111422'],
    'itemFilter': [
        {'name': 'Condition', 'value': 'Used'},
        {'name': 'MinPrice', 'value': '200', 'paramName': 'Currency', 'paramValue': 'GBP'},
        {'name': 'MaxPrice', 'value': '400', 'paramName': 'Currency', 'paramValue': 'GBP'}
    ],
    'paginationInput': {
        'entriesPerPage': '25',
        'pageNumber': '1'
    },
    'sortOrder': 'CurrentPriceHighest'
})

dictstr = api.response_dict()

for item in dictstr['searchResult']['item']:
    print "ItemID: %s" % item['itemId'].value
    print "Title: %s" % item['title'].value
    print "CategoryID: %s" % item['primaryCategory']['categoryId'].value

I hope the following will explain why performing a search on the Belgium site results in items that contain the category 177 even though this is not valid for Belgium but is valid for the UK.

Basically eBay allow sellers from one site to appear in the search results of another site as long as they meet the required criteria, such as offering international shipping. It allows sellers to sell to other countries without the need to actually list on those sites.

From the example XML that elelias provided I can see that a keyword search for 'laptop' was made on the Belgium site with the results filtered so that only items located in the UK was to be returned.

<itemFilter>
    <name>LocatedIn</name>
    <value>GB</value>
</itemFilter>

Because the search was limited to those located in the UK you won't see any Belgium items in the results. Since the items where listed on the UK site they will contain information relevant to the UK. For example the category id 177. eBay does not convert the information to make it relevant to the site that you are searching on.

It is important to remember that what ever you are trying to do with the Finding API can also be repeated using the actual advance search on eBay. For example it is possible to re-create the issue by performing a keyword search for used items on the Belgium site.

This url is the equivalent of your code that was performing the search without specifying the category 177. As you can see from the results it returns items that where listed on the UK site but which are appearing in the Belgium site. It you click on some of the items, for example, you can even see that it displays the UK category PC Laptops & Netbooks (177) even though this does not exist on the Belgium site. This matches the results form your code where it was returning 177 but would not let you specify the same value in the request as you was searching the Belgium site.

I hope this helps.

OTHER TIPS

Because categoryId is repeatable. You will need to pass an array into the call. Something like this should work.

api.execute('findItemsAdvanced', {
        'keywords': 'laptop',
        'categoryId': [
             {'51148'}
    ]
}

Note: See how the itemFilter element is an array in the sample file of the SDK.

'itemFilter': [
        {'name': 'Condition',
         'value': 'Used'},
        {'name': 'LocatedIn',
         'value': 'GB'},
    ],
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top