eBay Node API in TypeScript with Browser support
ATTENTION:
The package name was renamed from @hendt/ebay-api
to ebay-api
and can be found here.
Description
This eBay API implements both Traditional (xml) and the RESTful eBay API.
It supports client credentials grant
and authorization code grant
(Auth'N'Auth, OAuth2 and IAF).
eBay Docs
Changelog
v6.0.0
is the latest release.- See here for the full changelog.
Implementation status
RESTful API
API | Implemented |
---|
Buy API | ✔ Browse API v1.10.0 ✔ Deal API v1.3.0 ✔ Feed API ✔ Marketing API ✔ Offer API ✔ Order API ✔ Marketplace Insights API |
Commerce API | ✔ Catalog API ✔ Charity API v1.2.0 ✔ Identity API ✔ Notification API v1.2.0 ✔ Taxonomy API v1.0.0 ✔ Translation API v1_beta.1.4 |
Developer API | ✔ Analytics API |
Post Order API | ✔ Cancellation API ✔ Case Management API ✔ Inquiry API ✔ Return API |
Sell API | ✔ Account API v1.6.3 ✔ Analytics API v1.3.0 ✔ Compliance API v1.4.1 ✔ Feed API ✔ Finance API v1.9.0 ✔ Fulfillment API v1.19.10 ✔ Inventory API v1.14.0 ✔ Listing API ✔ Logistics API ✔ Marketing API v1.10.0 ✔ Metadata API ✔ Negotiation API v1.1.0 ✔ Recommendation API v1.1.0 |
Traditional API
API | Implemented |
---|
Finding API | ✔ |
Shopping API | ✔ |
Merchandising API | ✔ |
Trading API | ✔ |
Client Alerts API | ✔ |
Feedback API | ✔ |
Install
npm install ebay-api
yarn add ebay-api
🚀 Usage & Quick start
Sign up for an API key here: Developer Account.
Checkout API examples.
NodeJS
import eBayApi from 'ebay-api';
const eBay = new eBayApi({
appId: '-- also called Client ID --',
certId: '-- also called Client Secret --',
sandbox: false
});
const item = await eBay.buy.browse.getItem('v1|254188828753|0');
console.log(JSON.stringify(item, null, 2));
Detailed configuration example
import eBayApi from 'ebay-api';
const eBay = new eBayApi({
appId: '-- also called Client ID --',
certId: '-- also called Client Secret --',
sandbox: false,
siteId: eBayApi.SiteId.EBAY_US,
marketplaceId: eBayApi.MarketplaceId.EBAY_US,
acceptLanguage: eBayApi.Locale.en_US,
contentLanguage: eBayApi.ContentLanguage.en_US,
devId: '-- devId --',
ruName: '-- eBay Redirect URL name --',
authToken: '-- Auth\'n\'Auth for traditional API (used by trading) --',
});
Browser
Check out live example: https://hendt.github.io/ebay-api/.
Because of the eBay CORS problems a Proxy server is required to use the API in the Browser.
For testing purpose you can use https://ebay.hendt.workers.dev/
url as proxy. You can also set up your own Proxy server. We have added a example for cloudfront workers: https://github.com/hendt/ebay-api/blob/master/proxy/worker.js
Or use [https://github.com/Rob--W/cors-anywhere](CORS Anywhere is a NodeJS proxy) (works very well with heroku.com).
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ebay-api@latest/lib/ebay-api.min.js"></script>
<script>
const eBay = new eBayApi({
appId: 'appId',
certId: 'certId',
sandbox: false
});
eBay.req.instance.interceptors.request.use((request) => {
request.url = 'https://ebay.hendt.workers.dev/' + request.url;
return request;
});
eBay.buy.browse.getItem('v1|254188828753|0').then(item => {
console.log(JSON.stringify(item, null, 2));
}).catch(e => {
console.error(e);
});
</script>
🔧 eBayApi Config
The first (required) parameter in eBayApi instance takes an object with following properties:
Name | Occurrence | Description |
---|
appId | Required | App ID (Client ID) from Application Keys. |
certId | Required | Cert ID (Client Secret) from Application Keys. |
devId | Conditionally | The Dev Id from Application Keys. |
sandbox | Required
Default: false | If true, the Sandbox Environment will be used. |
ruName | Conditionally | The redirect_url value. More info. |
autoRefreshToken | RequiredDefault: true | Auto refresh the token if it's expired. |
siteId Traditional | Required
Default: SiteId.EBAY_US | eBay site to which you want to send the request (Trading API, Shopping API). |
authToken Traditional | Optional | The Auth'N'Auth token. The traditional authentication and authorization technology used by the eBay APIs. |
marketplaceId RESTful | Required
Default: MarketplaceId.EBAY_US | Docs REST HTTP Header. X-EBAY-C-MARKETPLACE-ID identifies the user's business context and is specified using a marketplace ID value. Note that this header does not indicate a language preference or consumer location. |
scope RESTful | ConditionallyDefault:
['https://api.ebay.com/oauth/api_scope'] | The scopes assigned to your application allow access to different API resources and functionality. |
endUserCtx RESTful | Conditionally recommended RESTful | Docs X-EBAY_C_ENDUSERCTX provides various types of information associated with the request. |
contentLanguage RESTful | Conditionally required
Default: ContentLanguage.en_US | DocsContent-Language indicates the locale preferred by the client for the response. |
acceptLanguage RESTful | OptionalDefault: Locale.en_US | Docs Accept-Language indicates the natural language the client prefers for the response. This specifies the language the client wants to use when the field values provided in the request body are displayed to consumers. |
Load config from environment
Use eBayApi.fromEnv()
to load data from environment variables.
Name | Value |
---|
appId | process.env.EBAY_APP_ID |
certId | process.env.EBAY_CERT_ID |
devId | process.env.EBAY_DEV_ID |
authToken | process.env.EBAY_AUTH_TOKEN |
siteId | process.env.EBAY_SITE_ID |
marketplaceId | process.env.EBAY_MARKETPLACE_ID |
ruName | process.env.EBAY_RU_NAME |
sandbox | process.env.EBAY_SANDBOX === 'true' |
🐞 Debug
To see debug logs use DEBUG=ebay:*
environment variable.
🔑 Access token types
See the full Documentation here.
Client credentials grant flow mints a new Application access token.
Authorization code grant flow mints a new User access token.
User access token (authorization code grant flow)
👉 Recommended for all API Calls.
You must employ a User token to call any interface that accesses or modifies data that is owned by the user (such as user information and account data).
To get a User token, the users of your app must grant your application the permissions it needs to act upon their behalf. This process is called user consent. With the user consent flow, each User token contains the set of scopes for which the user has granted their permission (eBay Token Types).
Application access token (client credentials grant flow)
👉 Recommended for API calls that will only request application data (GET
method, and it's also restricted).
Application tokens are general-use tokens that give access to interfaces that return application data. For example, many GET requests require only an Application token for authorization.
(eBay Token Types)
If no other token is set, this token will be obtained automatically in the process of calling an RESTful API.
Auth'N'Auth
👉 The "old" way. Only works with Traditional API.
Checkout the Auth'N'Auth example.
You can also generate the token on eBay developer page and use it directly (see Detailed configuration example).
OAuth2: Exchanging the authorization code for a User access token
eBay Docs
import eBayApi from 'ebay-api';
const eBay = eBayApi.fromEnv();
eBay.OAuth2.setScope([
'https://api.ebay.com/oauth/api_scope',
'https://api.ebay.com/oauth/api_scope/sell.fulfillment.readonly',
'https://api.ebay.com/oauth/api_scope/sell.fulfillment'
]);
const url = eBay.OAuth2.generateAuthUrl();
console.log('Open URL', url);
After you granted success, eBay will redirect you to your 'Auth accepted URL' and add a query parameter code
Express example
This is how it would look like if you use express
:
import eBayApi from 'ebay-api';
app.get('/success', async function(req, res) {
const code = req.query.code;
const eBay = eBayApi.fromEnv();
try {
const token = await eBay.OAuth2.getToken(code);
eBay.OAuth2.setCredentials(token);
req.session.token = token
const orders = await eBay.sell.fulfillment.getOrders()
res.send(orders);
} catch(e) {
console.error(e)
res.sendStatus(400)
}
});
If token is already in session:
import eBayApi from 'ebay-api';
app.get('/orders/:id', async function(req, res) {
const id = req.params.id;
const eBay = eBayApi.fromEnv();
const token = req.session.token;
if (!token) {
return res.sendStatus(403);
}
eBay.OAuth2.setCredentials(token);
eBay.OAuth2.on('refreshAuthToken', (token) => {
req.session.token = token;
});
try {
const order = await eBay.sell.fulfillment.getOrder(id);
res.send(order);
} catch(e) {
console.error(e)
res.sendStatus(400)
}
});
RESTful API
How to set the Scope
const eBay = new eBayApi({
scope: ['https://api.ebay.com/oauth/api_scope']
});
eBay.OAuth2.setScope([
'https://api.ebay.com/oauth/api_scope',
'https://api.ebay.com/oauth/api_scope/sell.fulfillment.readonly',
'https://api.ebay.com/oauth/api_scope/sell.fulfillment'
]);
Use apix.ebay.com or apiz.ebay.com (beta) endpoints
For some APIs, eBay use a apix
/apiz
subdomain. To use these subdomains you can use .apix
/.apiz
before the api call like this:
eBay.buy.browse.apix.getItem()
eBay.buy.browse.apiz.getItem()
In any case eBay adds a new subdomain, it's also possible to configure whatever you want:
eBay.buy.browse.api({subdomain: 'apiy'}).getItem()
How to refresh the token
If autoRefreshToken
is set to true (default value) the token will be automatically refreshed when eBay response with invalid access token
error.
Use Event Emitter to get the token when it gets successfully refreshed.
eBay.OAuth2.on('refreshAuthToken', (token) => {
console.log(token)
});
eBay.OAuth2.on('refreshClientToken', (token) => {
console.log(token)
});
To manuel refresh the auth token use eBay.OAuth2.refreshAuthToken()
and for the client token eBay.OAuth2.refreshClientToken()
.
Keep in mind that you need the 'refresh_token' value set.
const token = await eBay.OAuth2.refreshToken();
Sometimes you want to add additional headers to the request like a GLOBAL-ID X-EBAY-SOA-GLOBAL-ID
.
You have multiple options to do this.
const eBay = new eBayApi();
eBay.buy.browse.api({headers: {
'X-EBAY-SOA-GLOBAL-ID': 'EBAY-DE'
}}).getItem('v1|382282567190|651094235351').then((item) => {
console.log(item)
})
You can pass headers directly in the method call in the second parameter:
eBay.trading.AddFixedPriceItem({
Item: {
Title: 'title',
Description: {
__cdata: '<div>test</div>'
}
}
}, {
headers: {
'X-EBAY-SOA-GLOBAL-ID': 'EBAY-DE'
}
})
Low level: use the Axios interceptor to manipulate the request
import eBayApi from 'ebay-api';
const eBay = new eBayApi();
eBay.req.instance.interceptors.request.use((request) => {
request.headers['X-EBAY-SOA-GLOBAL-ID'] = 'EBAY-DE';
return request;
})
Handle JSON GZIP response e.g fetchItemAspects
You need a decompress library installed like zlib
.
npm install zlib
import eBayApi from 'ebay-api';
import zlib from 'zlib';
const toString = (data) => new Promise((resolve) => {
zlib.gunzip(data, (err, output) => {
if (err) throw err;
resolve(output.toString());
});
});
const eBay = new eBayApi();
try {
const data = await eBay.commerce.taxonomy.fetchItemAspects();
const result = await toString(data);
console.log(result)
} catch (e) {
console.error(e);
}
Controlling Traditional XML request and response
The second parameter in the traditional API has the following options:
export type Options = {
raw?: boolean
parseOptions?: object
useIaf?: boolean
headers?: Headers
hook?: (xml) => BodyHeaders
};
Fast XML is used to parse the XML. You can pass the parse option to parseOptions
parameter.
Examples
Trading - AddFixedPriceItem (CDATA)
You can submit your description using CDATA if you want to use HTML or XML.
eBay.trading.AddFixedPriceItem({
Item: {
Title: 'title',
Description: {
__cdata: '<div>test</div>'
}
}
})
Trading - ReviseFixedPriceItem (Update the price of an item)
eBay.trading.ReviseFixedPriceItem({
Item: {
ItemID: 'itemId',
StartPrice: 'startPrice'
}
})
Buy - getItem
eBay.buy.browse.getItem('v1|382282567190|651094235351').then(a => {
console.log(a);
}).catch(e => {
console.log(e)
});
Post-Order - getReturn
eBay.postOrder.return.getReturn('5132021997').then(a => {
console.log(a);
}).catch(e => {
console.log(e)
});
Finding - findItemsByProduct (use XML attributes and value)
eBay.finding.findItemsByProduct({
productId: {
'@_type': 'ReferenceID',
'#value': '53039031'
}
})
Finding - findItemsIneBayStores
eBay.finding.findItemsIneBayStores({
storeName: 'HENDT'
}, {raw: true}).then(result => {
console.log(result);
});
Finding - findItemsAdvanced (findItemsByKeywords)
eBay.finding.findItemsAdvanced({
itemFilter: [{
name: 'Seller',
value: 'hendt_de'
}],
keywords: 'katze'
}).then(result => {
console.log(result);
});
Trading - GetMyeBaySelling
eBay.trading.GetMyeBaySelling({
SoldList: {
Include: true,
Pagination: {
EntriesPerPage: 20,
PageNumber: 1
}
}
}).then(data => {
console.log(data.results)
});
FAQ
- Do I need the eBay OAuth Client dependency?
No. This library has already all authentication implemented and support also auto refreshing token.
- What does IAF mean?
IAF stands for IDENTITY ASSERTION FRAMEWORK.
The traditional API supports IAF. That means you can use the OAuth2 token with the traditional APIs.
- Is it possible to Upload Pictures directly to EPS?
Yes. Checkout the Browser example and Node Example here.
Contribution
Check here
Supported By
hendt.de
rootle.de
📝 License
MIT.