Coder Social home page Coder Social logo

amazon-sp-api's People

Contributors

alexotano avatar altruer avatar amz-tools avatar cohlar avatar ctiospl avatar dlamb22 avatar erayalakese avatar fmalekpour avatar goldbird-solutions avatar harelbaruchi avatar idom818 avatar igrybkov avatar jakeleventhal avatar jebirch avatar jesusvalle avatar juliensnz avatar livingforjesus avatar mgecmez avatar mihai9-lab avatar nifrigel avatar nohara-embark avatar omrishaked avatar roman991 avatar taimoor0217 avatar tho-masn avatar valentinmouret avatar vhle-ms avatar wangjue666 avatar yuriiherasymchuk avatar zirkelc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

amazon-sp-api's Issues

Create Solicitation API Issue

Hi
I am working on create Solicitation API , But it provide me Error that marketplaceIds is missing or invalid,
When I check the code of npm repository I saw the marketplaceIds is not added in API route ,
We are able to create Solicitation by postman . The Example of request URL is
https://sellingpartnerapi-eu.amazon.com/solicitations/v1/orders/{orderId}/solicitations/productReviewAndSellerFeedback?marketplaceIds={marketpalaceId}
And After adding marketpalaceId in node module of amazon-sp-api in Create Solicitation the Error Changes to
The request signature we calculated does not match the signature you provided.
But by postman we are able to create Solicitation with same AWS credentials.

Calling the OrderAPI -> InvalidInput

Hello together,

we are trying to call the Order-API with e.g. getOrderBuyerinfo, getOrderArddress or getOrder... but it will always result in the same error: "code": InvalidInput".

We are using the "eu" region.
Calls to the catalogAPI are working fine.

Is there a known issue or any idea whats could be the problem here?
If u need futher informations let me know.

Thank you very much.

Feel free to open up a PR!

As the development of the Sellingpartner API is largely in progress by Amazon, there are quite a lot of changes and updates coming. We try to keep up with all new features/changes coming from Amazon, but if you find some things not working as expected or you have an idea of a feature that would be helpful and a good addition to the client you are very much welcome to open up a PR. We will try to review and include the PR inside the module as soon as possible, usually in a couple of days.

Some possible features for a PR could be i.e.:

  • Full/better typesript support (see Issue #25)
  • Re-Request security_token and/or access_token when throwing an invalid/malformed/revoked error (see Issue #57)
  • "All in one" request and download report wrapper (createReport, getReport, getReportDocument, download all wrapped up in a convenient single call)
  • Implement a "smart queue" on the basis of ratelimit and burst when requesting the same endpoint excessively (see Issue #46)
  • More tests

Stream mode in reports download

Hello,

There are some sellers that in their reports (for example, the merchant listings report), have more than 1500000 products, which implies that they exceed the node memory.

In the previous library we used with MWS there was an option to download the reports in "stream" mode, to go through the content and incorporate it progressively. Is there any way to do it with this package?

Thank you very much!

Upload does not work for string feed.content (TypeError [ERR_INVALID_ARG_TYPE]: The "list" argument must be an instance of Array. Received type string ('<?xml version="1.0" enco...))

Following the instruction https://www.npmjs.com/package/amazon-sp-api#encrypt-and-upload-feeds
There is an option to upload feed data as a string.
For example:

let feed = {
  content:`<?xml version="1.0" encoding="utf-8"?>
    <AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
      <Header>
        <DocumentVersion>1.02</DocumentVersion>
        <MerchantIdentifier>YOUR_MERCHANT_IDENTIFIER</MerchantIdentifier>
      </Header>
      <MessageType>Inventory</MessageType>
      <Message>
        <MessageID>1</MessageID>
        <Inventory>
          <SKU>YOUR_SKU</SKU>
          <Quantity>10</Quantity>
        </Inventory>
      </Message>
    </AmazonEnvelope>`,
  contentType:'text/xml; charset=utf-8'
}
const feedUploadDetails = {
      feedDocumentId: '3d4e42b5-1d6e-44e8-a89c-2abfca0625bb',
      url: 'https://d34o8swod1owfl.cloudfront.net/Feed_101__POST_PRODUCT_DATA_.xml'
}
let res = await sellingPartner.upload(feed_upload_details, feed);

The error is thrown in the case

TypeError [ERR_INVALID_ARG_TYPE]: The "list" argument must be an instance of Array. Received type string ('<?xml version="1.0" enco...)

Looks like on the line (https://github.com/amz-tools/amazon-sp-api/blob/main/lib/SellingPartner.js#L690) we need to have
something like:
content_buffer = Buffer.concat([Buffer.from(feed_content)]);
instead of
content_buffer = Buffer.concat(feed_content);

Invalid security_token in role credentials

Hello, I'm getting The security token included in the request is invalid error and when I log the securit token I get this : security_token: 15. What's the problem?
?

Example for POST_ORDER_FULFILLMENT_DATA

Someone successful using the POST_ORDER_FULFILLMENT_DATA feed to update the Order Status to shipped?

Can please someone provide an example of the Feed XML?
Also can I update more than one Order with this Feed?
Because there is also the POST_FLAT_FILE_FULFILLMENT_DATA Feed ...

Currently I'm testing with this Feed XML

<?xml version="1.0" encoding="utf-8"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
    <Header>
        <DocumentVersion>1.02</DocumentVersion>
        <MerchantIdentifier>XXX</MerchantIdentifier>
    </Header>
    <MessageType>OrderFulfillment</MessageType>
    <Message>
        <MessageID>1</MessageID>
        <OrderFulfillment>
            <AmazonOrderID>XXX-XXXXXX-XXXXXX</AmazonOrderID>
            <FulfillmentDate>2021-02-28T12:34:56</FulfillmentDate>
        </OrderFulfillment>
    </Message>
</AmazonEnvelope>

but I'm not sure if it's correct like that ... I used the Schema and tried to reproduce the given example in the Docs.


Also, can I see any details of a Feed Report?
I'm getting:

{
  processingEndTime: '2021-02-28T12:14:49+00:00',
  processingStatus: 'DONE',
  marketplaceIds: [ 'A1PA6795UKMFR9' ],
  feedId: 'XXXXXXXX',
  feedType: 'POST_ORDER_FULFILLMENT_DATA',
  createdTime: '2021-02-28T12:14:25+00:00',
  processingStartTime: '2021-02-28T12:14:31+00:00',
  resultFeedDocumentId: 'amzn1.tortuga.3.9690c3e4-802b-4baa-8b62-XXX...'
}

but when I use the resultFeedDocumentId for the getFeedDocument call - I get the same response as for createFeedDocument

Update Order-API

Hello,

first off all, big thanks to this well made script. We every much appreciate it!

Just a short question:
Must the script be updated due the current change of the Order API section? According to Amazon, you can now get BuyerInfo and Address via the "GetOrder(s)" call, if you make the call with a RDT token.

Thank you very much and kind regards

How to call grantless operation?

I keep getting Access to requested resource is denied when call getDestinations operation.

I'm sure i have access because orderMatrix and getMarketplaceParticipations works as expected.

(async () => {
  const sp = new SellingPartnerAPI({
    region: 'na',
    refresh_token: 'token',
  });

  await sp.refreshAccessToken();
  await sp.refreshRoleCredentials();

  const res = await sp.callAPI({ operation: 'getDestinations' });

  console.log(JSON.stringify(res));
})();


// Error: Access to requested resource is denied.

I can't get CatalogItems from listCatalogItems

let catalogItem = await sellingPartner.callAPI({
operation:'listCatalogItems',
endpoint:'catalogItems',
query:{
MarketplaceId:'ATVPDKIKX0DER'
},
options:{
version:'2020-12-01'
}
});

My response:
CustomError: Required parameter IdType not found.

What is IdType? Please help me.

Thank you in advance for your help.

CustomError: Access to requested resource is denied.

I get the following error when calling the getOrders operation:

2020-12-26T17:03:52.835Z 5531d3c3-8473-4da8-a4b2-034f137044c5 INFO CustomError: Access to requested resource is denied.
at SellingPartner.callAPI (/var/task/node_modules/amazon-sp-api/lib/SellingPartner.js:229:13)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async Runtime.exports.handler (/var/task/index.js:22:15) {
code: 'Unauthorized',
details: '',
type: 'error'
}

When running the same code for my own store: I get null object back for getOrders - meaning its all working end to end.

When I try to get the getOrder for a clients store, where we got the spapi_auth correctly, and generated the refresh_token successfully, we hit the error. Unfortunately I only have one clients store to try it out.

BTW, what is also interesting is that, I did get the result early in the morning with my clients store. I did not change anything, and hence I am a little lost as to what could be throwing this error.

Amazon listing date parsing

The question is not related to library, I need a help so thought to ask it here.
it's regarding parsing date of listing publication date, so the date is in format "23/09/2021 10:34:38 MEST" i want to convert it to UTC since different marketplace can have different timezone it's hard to parse it in JS with even libraries without having proper timezone name. Thanks for your comment in advance.

Tests

Are there any plans to add tests to the package?

My team is a big proponent of automated testing and noticed this package does not yet have any. We're interesting in using the package going forward and think it would be beneficial to have tests here to verify the functionality as new features are added and changed. If there are not plans for this, would you be open to us making a PR down the line to add tests?

URL is not a constructor

Hiya!

(Vue/NuxtJS)
I'm able to get an output by console logging the response, but it comes with this error:
image

I'm currently using the amazon-sp-api through a js file that's imported to the Vue instance through Nuxt plugins.
I'm not sure if it's because of that way im using it, and maybe Vue is doing something to it, or if i've made a silly mistake in where i put it (but i've already had some issues like with the env vars not being available before the plugin is run).

Can only call some endpoints

I've set up a client:

const sellingPartner = new SellingPartnerAPI({
      region: 'eu',
      refresh_token:
        '<Censored>',
      credentials: {
        SELLING_PARTNER_APP_CLIENT_ID: '<censored>',
        SELLING_PARTNER_APP_CLIENT_SECRET: '<censored>',
        AWS_ACCESS_KEY_ID: '<censored>',
        AWS_SECRET_ACCESS_KEY: '<censored>',
        AWS_SELLING_PARTNER_ROLE: '<censored>',
      },
    });

And, this works well for getMarketplaceParticipation:

const res = await sellingPartner.callAPI({
      operation: 'getMarketplaceParticipations',
      endpoint: 'sellers',
    });
    console.log(res);

Gives nice output:

{
marketplace: {
id: 'AZMDEXL2RVFNN',
countryCode: 'GB',
name: 'SI UK Prod Marketplace',
defaultCurrencyCode: 'GBP',
defaultLanguageCode: 'en_GB',
domainName: 'siprodukmarketplace.stores.amazon.co.uk'
},
participation: { isParticipating: true, hasSuspendedListings: false }
}

But, if I try to call getOrderMetrics:

const resSales = await sellingPartner.callAPI({
      operation: 'getOrderMetrics',
      endpoint: 'sales',
      query: {
        marketplaceIds: ['A38D8NSA03LJTC'],
        interval: '2020-10-01T00:00:00-07:00--2020-10-01T20:00:00-07:00',
        granularity: 'Hour',
      },
    });
    console.log(resSales);

I get the equivalent of "computer says no":

CustomError: Access to requested resource is denied.
at SellingPartner.callAPI (/node_modules/amazon-sp-api/lib/SellingPartner.js:592:13)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async main () {
code: 'Unauthorized',
details: '',
type: 'error'
}

Clearly my role, etc., must be setup right, or the first call would not work, I would assume? Any idea why this second call to getOrderMetrics fails?

CustomError: Client authentication failed - on every operation

CustomError: Client authentication failed at SellingPartner.refreshAccessToken (E:\Web Development Repos\sp-api\node_modules\amazon-sp-api\lib\SellingPartner.js:378:13) at processTicksAndRejections (internal/process/task_queues.js:93:5) at async SellingPartner._validateAccessTokenAndRoleCredentials (E:\Web Development Repos\sp-api\node_modules\amazon-sp-api\lib\SellingPartner.js:242:9) at async SellingPartner.callAPI (E:\Web Development Repos\sp-api\node_modules\amazon-sp-api\lib\SellingPartner.js:453:5) at async E:\Web Development Repos\sp-api\index.js:12:17 { code: 'invalid_client', type: 'error' }

We're receiving this regardless of operation called. I'm guessing this means that there's an issue with one of our environmental variables, but I've double checked everything.

Just to clarify:
SELLING_PARTNER_APP_CLIENT_ID= this is the LWA client id?
SELLING_PARTNER_APP_CLIENT_SECRET= this is the LWA client secret?
AWS_ACCESS_KEY_ID= The access key ID from the IAM user?
AWS_SECRET_ACCESS_KEY= the secret access key from the IAM user?
AWS_SELLING_PARTNER_ROLE= This is the full ARN for the IAM role?

Custom Error: Access to requested resource is denied.

I am passing all the credentials as below and calling the SP-API for getinventory summary API.SELLING_PARTNER_APP_CLIENT_ID=<YOUR_APP_CLIENT_ID>
SELLING_PARTNER_APP_CLIENT_SECRET=<YOUR_APP_CLIENT_SECRET>
AWS_ACCESS_KEY_ID=<YOUR_AWS_USER_ID>
AWS_SECRET_ACCESS_KEY=<YOUR_AWS_USER_SECRET>
AWS_SELLING_PARTNER_ROLE=<YOUR_AWS_SELLING_PARTNER_API_ROLE>

But I am getting the below error.
Custom Error: Access to requested resource is denied.

Should I use the access_key and secret that is tied to my IAM user or should I get the keys from assumeRole command (in CLI) and use that in the nodejs ?

(I do not see any issue with the client_id or refresh_token credentiaks since I am able to get the access_token when trying the API (/auth/o2/token?grant_type=refresh_token).

I am kind of stuck here. Any help please.

FBM

Hallo...
I sell my product by email. so how can I inform amazon(FBM) by API ? my product is delivered.

CustomError: Access to requested resource is denied.

I'm trying to migrate our application from MWS to SP-API hybrid.
We are using "fe" region and Japan marketplace id "A1VC38T7YXB528"
I saw issue #34 and I check the setting on seller central, I changed existing application to a hybrid type and assign IAM to get LWA client ID and Secret.

I use this endpoint

let res = await sellingPartner.callAPI({ operation:'getMarketplaceParticipations', endpoint:'sellers' }); console.log(res);

This is what I get from response.

CustomError: Access to requested resource is denied.
at SellingPartner.callAPI (C:\Users\James Lin\Workspace\amz-sp-api-demo\node_modules\amazon-sp-api\lib\SellingPartner.js:572:13)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at async C:\Users\James Lin\Workspace\amz-sp-api-demo\index.js:19:19 {
code: 'Unauthorized',
details: '',
type: 'error'
}

I check my Access Key on AWS, it shows Last Usage is "2021-06-11 10:30 PDT with sts in us-east-1", but base on the document region fareast "fe" host region should be us-west-2.
Is this the reason causing this issue? Where should I change? My understanding is that IAM doesn't have the region.

Thanks for your help.

Any way to view all (or at least more) offers by ASIN?

When I use the Item Offers API (operation getItemOffers), it will give a handful of LowestPrices and BuyboxPrices, but only show maybe 5 total offers. In the NumberOfOffers array however, it says there should be 50+ offers.

Is there a different API to view more of the offers? Or any query parameters to utilize?

Not getting data from listFinancialEvents prior to 2019-04-01

My teams has been experiencing issues with retrieving any data from the listFinancialEvents operation prior to 2019-04-01. We're just getting arrays. Our account has financial data all the way to 2016.

The 2019-04-01 is about 2 years from today. Does the listFinancialEvents have a new limit now of 2 years? or is this just a coincidence?

We also tried utilized listFinancialEventsByOrderId with an orderId that dated back to 2016 and it also returned a response full of empty arrays.

Anyone else having this issue?

Screenshot from 2021-04-13 15-50-22

Screenshot from 2021-04-13 15-50-45

Screenshot from 2021-04-13 16-44-29

Operation 'getMyFeesEstimateForASIN' has wrong URI

Hi,

thanks for your great work. It helped a lot.

I think, for operation 'getMyFeesEstimateForASIN' there is a wrong URI.
In lib/resources/productFees.js, you wrote

api_path:'/products/fees/v0/listings/' + req_params.path.Asin + '/feesEstimate',

But according to documentation, api_path should be:

api_path: '/products/fees/v0/items/' + req_params.path.Asin + '/feesEstimate'

Would be great to fix that, thanks.

CustomError: Access to requested resource is denied.

Hi,

Any idea with this error:

CustomError: Access to requested resource is denied.
    at SellingPartner.callAPI (/Users/k/node_modules/amazon-sp-api/lib/SellingPartner.js:503:13)
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
    at async /Users/k/Y/Lister/amz-sp-api-node.js:17:15 {
  code: 'Unauthorized',
  details: '',
  type: 'error'
}

Here are the codes we use:

const SellingPartnerAPI = require("amazon-sp-api"); 
  
(async () => {
  try {
    console.log(process.env);
    let sellingPartner = new SellingPartnerAPI({
      region: "na",
      refresh_token: process.env.AMZ_SP_API_REFRESH_TOKEN,
      credentials: {
        SELLING_PARTNER_APP_CLIENT_ID: process.env.SELLING_PARTNER_APP_CLIENT_ID,
        SELLING_PARTNER_APP_CLIENT_SECRET: process.env.SELLING_PARTNER_APP_CLIENT_SECRET,
        AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID,
        AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY,
        AWS_SELLING_PARTNER_ROLE: process.env.AWS_SELLING_PARTNER_ROLE
      },
    });
    let res = await sellingPartner.callAPI({
      operation:'getMarketplaceParticipations'
    });
    console.log(res);
  } catch (e) {
    console.log(e);
  }
})();

We tried other operations too, but all of them return the same error. We can access the MWS API just fine. But, we don't have active Amazon Seller Account (is this an issue?)

'The request signature we calculated does not match the signature you provided'. eu-west-1

Hi! I'm trying to make a createFeedDocument operation but the signature doesn't match.
I have been looking at some closed issues (from this library and also from the SP-API), and the error is similar from This closed issue, nevertheless, both content types of my request are the same.
code

let feed = {
      content:"<?xml version="1.0" encoding="utf-8"?>"
      contentType:"text/xml; charset=utf-8"
    };

    let feed_upload_details = await sellingPartner.callAPI({
      operation:"createFeedDocument",
      body:{
        contentType:feed.contentType
        //I have tried typing directly "text/xml; charset=utf-8"
      }
    });
    console.log(feed_upload_details);  
    let report = await sellingPartner.download(feed_upload_details);

log of feed_upload_details
{ encryptionDetails:
{ standard: 'AES',
initializationVector: 'rXLA88xa2w08qyciDOsAkw==',
key: 'BJchi...' },
feedDocumentId:
'amzn1.tortuga.3.2565a8da-1d07-49ad-80cf-da834d5d3ed2.T1Y139K3PX9PFI',
url:
'https://tortuga-prod-eu.s3-eu-west-1.amazonaws.com/%2FNinetyDays/amzn1.tortuga.3.2565a8da...' }
error of report(download operation)
{ Error: The request signature we calculated does not match the signature you provided. Check your key and signing method.
at SellingPartner._validateUpOrDownloadSuccess (/)
at SellingPartner.download (/)
at process._tickCallback (internal/process/next_tick.js:68:7)
code: 'SignatureDoesNotMatch',
message:
'The request signature we calculated does not match the signature you provided. Check your key and signing method.',
type: 'error' }

The URL goes to a most extensive error report (SignatureDoesNotMatch), where the most useful information is that the string to sign has this format:
AWS4-HMAC-SHA256 20210422T061142Z 20210422/eu-west-1/s3/aws4_request cd3fcaa53c9938740839d92bbdaa12275e2c4a5e481d744ff9aa74129f098291

And the Signature provided:
af97666f7c47a9198e02ebff79c042758d4d854667f8dc91c5d5123a45a00736

Another useful information from the URL:

<Canonical Request>
GET //NinetyDays/amzn1.tortuga...
...
content-type: host:tortuga-prod-eu.s3-eu-west-1.amazonaws.com content-type;host UNSIGNED-PAYLOAD
</Canonical Request>

Thank you very much!

"CustomError: Access to requested resource is forbidden" after a certain number of calls

We're building an app that loops a bunch of different ASINS and makes different API calls on each one. Everything works fine if it's just running up to 300 ASINS. However, if we try to run 800+ it starts giving this error:

CustomError: Access to requested resource is forbidden

Do I need to be doing rate limiting of some sort? Or is there another possible issue here?

Error uploading feed with document: SignatureDoesNotMatch

Hi!

When i try to use the upload method after the use of the "createFeedDocument" i have a problem signing the request, i',m using the information recovered from the previous call, and this for the feed:

let feed = {    
    content:"<?xml version=\"1.0\" ?></xml>",
    contentType:'text/xml; charset=utf-8'
}

This throws the following error:

CustomError: The request signature we calculated does not match the signature you provided. Check your key and signing method.

Somebody can help me with this? i don't know why doesn't work,

Below i paste the code used for testing the functionality:

(async() => {
        try {   
        let sellingPartner = await new SellingPartnerAPI({        
            region:'eu', // The region of the selling partner API endpoint ("eu", "na" or "fe")        
            refresh_token:process.env.REFRESH_TOKEN // The refresh token of your app user      
        });  
        console.log(sellingPartner._credentials)      
        let feed_upload_details = await sellingPartner.callAPI({    
            operation:'createFeedDocument',    
            body:{      
                contentType:'text/xml; charset=UTF-8'    
            }  
        });

        console.log(feed_upload_details);
        let res = await sellingPartner.upload(feed_upload_details, feed);

        console.log(feed_upload_details);  
        console.log(feed_creation_infos); 
         
    } catch(e){      
        console.log(e);    
    }  

Update Inventory Price

Hi @amz-tools,
Thanks for this library, it's really useful and good job!

I want to update the inventory price. I tried 4 different ways but neither worked.
Am I missing something?

I'm working in the European zone.

Option 1

listingsItems.patchListingsItem
request

 .callAPI({
      operation: 'listingsItems.patchListingsItem',
      path: { sku:[sku], sellerId:[sellerId] },
      query: { marketplaceIds: [marketPlaceId], issueLocale: 'en_US' },
      body: { productType: 'PRODUCT', patches: [{ op: 'replace', path: '/attributes/item-price', value: 19.99 }] },
    })

response

code:'InternalFailure'
details:''
message:'We encountered an internal error. Please try again.'
type:'error'

My opinion: I think this endpoint has not been implemented yet for Europe.

Option 2

JSON_LISTINGS_FEED

  const feedType = 'JSON_LISTINGS_FEED';
  const content = {
    header: {
      sellerId: aspConfig.sellerId,
      version: '2.0',
      issueLocale: 'en_US',
    },
    messages: [
      {
        messageId: 1,
        sku: sku,
        operationType: 'PATCH',
        productType: 'PRODUCT',
        patches: [{ op: 'replace', path: '/attributes/listing-price', value: [{ value: price }] }],
      },
    ],
  };

  const contentType = 'application/json; charset=UTF-8';
  const feedUploadDetails = await spService.callAPI({ operation: 'feeds.createFeedDocument', body: { contentType } });

  await spService
    .upload(feedUploadDetails, JSON.stringify(content), contentType)
    .then(res => console.log(res))
    .catch(err => console.log(err));

  const inputFeedDocumentId = feedUploadDetails.feedDocumentId;

  return spService
    .callAPI({
      operation: 'feeds.createFeed',
      body: { feedType, marketplaceIds: [marketPlace.id], inputFeedDocumentId },
    })
    .then(res => console.log(res))
    .catch(err => console.log(err));

The feed document was uploaded successfully and also the feed was created successfully, but the status of the feed is IN_PROGRESS for 12 hours.

createdTime:'2021-07-16T07:42:27+00:00'
feedId:'138122018824'
feedType:'JSON_LISTINGS_FEED'
marketplaceIds:(1) ['A1PA6795UKMFR9']
processingStartTime:'2021-07-16T07:42:35+00:00'
processingStatus:'IN_PROGRESS'

My opinion: I think this feed is related to listingsItems.patchListingsItem at the backend so may has the same problem.

Option 3 & Option 4

feeds: POST_FLAT_FILE_INVLOADER_DATA & POST_FLAT_FILE_PRICEANDQUANTITYONLY_UPDATE_DATA

  const feedType = 'POST_FLAT_FILE_INVLOADER_DATA'; // or 'POST_FLAT_FILE_PRICEANDQUANTITYONLY_UPDATE_DATA'
  const content = `sku price\n${sku} ${price}`;

  const contentType = 'text/tab-separated-values; charset=UTF-8';

  const feedUploadDetails = await spService.callAPI({ operation: 'feeds.createFeedDocument', body: { contentType } });

  await spService
    .upload(feedUploadDetails, content, contentType)
    .then(res => console.log(res))
    .catch(err => console.log(err));

  const inputFeedDocumentId = feedUploadDetails.feedDocumentId;

  await spService
    .callAPI({
      operation: 'feeds.createFeed',
      body: { feedType, marketplaceIds: [marketPlace.id], inputFeedDocumentId },
    })
    .then(res => console.log(res))
    .catch(err => console.log(err));

feeds status:

{  createdTime:'2021-07-17T19:12:48+00:00'
   feedId:'139649018825'
   feedType:'POST_FLAT_FILE_INVLOADER_DATA' 
   marketplaceIds:(1) ['A1PA6795UKMFR9']
   processingStatus:'IN_QUEUE'
}
{
   createdTime:'2021-07-17T16:52:53+00:00'
   feedId:'139397018825'
   feedType:'POST_FLAT_FILE_PRICEANDQUANTITYONLY_UPDATE_DATA'  
   marketplaceIds:(1) ['A1PA6795UKMFR9']
   processingStatus:'IN_QUEUE'
}

I think I'm going to lose the remaining half of my hair because of seller-partner-api and it's documentation.

Thanks for your help

Getting attributes from getCatalogItem

Thanks for creating amazon-sp-api. I'm just getting started trying to use the sp-api and it has been super helpful.

I'm running into some issues getting product attributes from the catalogItem endpoint and was wondering if anyone could help point me in the right direction. Right now my API call looks like this:

await sellingPartner.callAPI({
        operation: "getCatalogItem",
        endpoint: "catalogItems",
        query: {
          marketplaceIds: ["ATVPDKIKX0DER"],
          includedData: ["attributes"],
        },
        path: {
          asin:  <my_asin>,
        },
        options: {
          version: "2020-12-01",
        },
      });

If I make the request on asins of certain brands we sell I get this error:

CustomError: FORBIDDEN
 ... 
 ... 
 ...
 ...
  details: 'The includedData requested requires Brand Registry affiliation with the requested item. Remove the requested includedData item or register the brand of the item in Brand Registry with the seller.',
  type: 'error'
}

Is there a way to set the sellerId? I think the issue is because we are identified as the owner of multiple brands, and it's not assuming the correct sellerId.

Sandbox

Hello! Is there a way to add sandbox mode?, I've been working on this library for an while but I can't make it work.

I was adding a boolean sandbox variable in SellingPartner.js, which is passed to Signer.js (only for signing requests not request of credentials) and finally to the request.js , all it does is add "sandbox." string at the begining of the URL, asi in the documentation.

But I'm getting

CustomError: We encountered an internal error. Please try again.
    at SellingPartner.callAPI (/var/www/nodes/oadmin/node_modules/amazon-sp-api/lib/SellingPartner.js:234:13)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async Object.exports.getOrdersAmazon (/var/www/nodes/oadmin/dist/router-mongo/amazon/amazon.helper.js:152:15)
    at async /var/www/nodes/oadmin/dist/router-mongo/amazon/amazon.helper.js:284:28 {
  code: 'InternalFailure',
  type: 'error'
}

Any hints? I was planning to finish this feature and make a PR, seams like a very simple feature but so helpful.

How to use it with typescript?

I saw it has type declaration files in lib/typings, but I'm still getting Cannot find module 'amazon-sp-api' or its corresponding type declarations.ts(2307).

    "amazon-sp-api": "^0.3.5",

How to get the request IDs?

Hello there!
We've been using the library for a few months and it has worked nicely for us. Right now we're facing some issues with Amazon's API that we can't find a solution for and we'd like to ask them what's going on. However, in order to do this, we need to send them the request IDs of the specific requests that we see go wrong, but we don't see them anywhere when making the requests through this library. Is there a way we can get the request IDs for our calls?

Thanks in advance.

download report returns empty array when json: true with some reports.

I am attempting to download a "GET_MERCHANT_LISTINGS_DATA_LITE" report, using SellingPartner.download(). The download succeeds and returns a tab delimited filed when passing no options object, or when {json: false}. When passing {json: true}, the function returns only '[]'. This does not happen for all reports, for example "GET_FLAT_FILE_OPEN_LISTINGS_DATA" reports download perfectly.

TypeScript Types

Is there any plan to add TypeScript types across the package?

My team uses TypeScript and are very interested in using this package going forward. We would love to see types here to make the package easier to work with. If there are not plans to add types, would you be open to us making a PR to add some in the future?

Keep getting Unauthorized using sample requests

Keep getting Unauthorized error using sample requests in docs. Should these examples work?

I'm trying to work out if I'm not authenticating properly or whether the API endpoint is giving the error as I'm trying to request data that I don't have access to (as it's your data)

Using a brand new marketplace seller account / no products / data.

CustomError: Access to requested resource is denied.
    at SellingPartner.callAPI (/Users/steven/Documents/boilerplate/versiontwo/node_modules/amazon-sp-api/lib/SellingPartner.js:203:13)
    at processTicksAndRejections (node:internal/process/task_queues:93:5)
    at /Users/steven/Documents/boilerplate/versiontwo/packages/amazon/lib/SP-api.ts:19:19 {
  code: 'Unauthorized',
  details: '',
  type: 'error'
}
require("dotenv").config();
require("source-map-support").install();

import SellingPartnerAPI from "amazon-sp-api";

(async () => {
  try {
    const sellingPartner = new SellingPartnerAPI({
      region: "eu",
      refresh_token:
        "XXX",
      options: {
        auto_request_tokens: true,
        auto_request_throttled: true,
      },
    });

    let res = await sellingPartner.callAPI({
      operation: "createReport",
      body: {
        reportType: "GET_FLAT_FILE_OPEN_LISTINGS_DATA",
        marketplaceIds: ["A1PA6795UKMFR9"],
      },
    });

    console.log(res);
  } catch (e) {
    console.log(e);
  }
})();

JSON_PARSE_ERROR from listFinancialEvents

Hey @amz-tools, we've been experiencing one of the known issues that is mentioned on your repo/library.

We've utilized the raw response option but we're pretty lost on how to actually handle the parsing properly.

Any idea what the best way to handle these type of errors?

productFees.getMyFeesEstimateForASIN InvalidParameterValue

Hi @amz-tools,

I'm trying to get product fees.
I haven't any problem with other countries (FR, IT, ES, DE) but GB does not work, I'm getting this response:

{
  "FeesEstimateResult": {
    "Status": "ClientError",
    "FeesEstimateIdentifier": {
      "MarketplaceId": "A1F83G8C2ARO7P",
      "IdType": "ASIN",
      "SellerId": "XXXXX",
      "SellerInputIdentifier": "56f1174c-b87b-4247-8db5-3ca3798faa1d",
      "IsAmazonFulfilled": true,
      "IdValue": "B00SLIMMHW",
      "PriceToEstimateFees": {
        "ListingPrice": {
          "CurrencyCode": "EUR",
          "Amount": 20
        },
        "Shipping": {
          "CurrencyCode": "EUR",
          "Amount": 0
        }
      }
    },
    "Error": {
      "Type": "Sender",
      "Code": "InvalidParameterValue",
      "Message": "There is an client-side error. Please verify your inputs.",
      "Detail": []
    }
  }
}

The error message is not clear. All parameters (except MarketplaceId) are the same with other countries but do not work.
Do you have any idea?

Thanks !!

No upload() function declared in types?

Hi, I have seen that in the documentation there are several references to the upload() function for uploading feeds, but it is not declared in the typescript, is this correct?

I can't get CustomerInfo from API Order, please help me.

const getOrderItemBuyer = async (orderId) => {
(async () => {
try {
let res = await sellingPartner.callAPI({
api_path: /orders/v0/orders/${orderId}/orderItems/buyerInfo,
method: "GET",
query: {
MarketplaceId: "ATVPDKIKX0DER",
},
restricted_data_token:"my token from create RDT"
});
console.log(JSON.stringify(res));
} catch (e) {
console.log(e);
}
})();
};

My response:
CustomError: Access to requested resource is denied.

If Remove params restricted_data_token, API working, why ?
Please help me

Error: Invalid Input - for parameter values with spaces.

Can be fixed by calling the encodeURIComponent method for parameter values. (In that case for SKUs)

API Endpoint productPricing
Operation getPricing
Query

{ query: { Skus: [<Some SKU With slash/44>], ItemType: 'Sku', MarketplaceId: <Some Marketplace Id> }

version: 'v0'

Error:
Error: Invalid Input
at SellingPartner.callAPI (/Users/Documents/projects/pricing-platform/amazon-integration-plugin/node_modules/amazon-sp-api/lib/SellingPartner.js:574:13)

Problems with getOrderMetrics passing an array to marketplaceIds

Hello,
I'm trying to testing get ordermetrics, everything's gone well till i use an array of strings for marketplaceIds parametrer.

This is the req_params:
{ operation: 'getOrderMetrics', query: { granularity: 'Total', interval: '2021-03-31T00:00:00-07:00--2021-03-31T23:59:59-07:00', marketplaceIds: [ 'A13V1IB3VIYZZH', 'A1F83G8C2ARO7P', 'A1PA6795UKMFR9', 'A1RKKUPIHCS9HS', 'APJ6JRA9NG5V4' ] }, method: 'GET', api_path: '/sales/v1/orderMetrics', restore_rate: 2 }

and this is the error:
CustomError: Invalid Input at SellingPartner.callAPI (/var/www/djs-app/node_modules/amazon-sp-api/lib/SellingPartner.js:368:13) at processTicksAndRejections (internal/process/task_queues.js:93:5) { code: 'InvalidInput', details: '', type: 'error' }
I don't understand why it works with marketplaceIds: ['APJ6JRA9NG5V4'] and not with marketplaceIds: ['A13V1IB3VIYZZH','A1F83G8C2ARO7P','A1PA6795UKMFR9','A1RKKUPIHCS9HS','APJ6JRA9NG5V4']

Any ideas?
thank you so much

Daniele

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.