Skip to content

Repository files navigation

☕Amazon Selling Partner API C# 🚀 .NETNuGetGitter Chat

This is an API Binding in .Net C# for the new Amazon Selling Partner API.

This library is based on the output of swagger-codegen with the OpenAPI files provided by Amazon (Models) and has been modified by the contributors.

The purpose of this package is to have an easy way of getting started with the Amazon Selling Partner API using C#, you can watch this 📷 Youtube 📣 video for easy start your project


Requirements


Installation NuGet

Install-Package CSharpAmazonSpAPI

Tasks

Seller

Vendor


Keys

To get all keys needed you need to follow this step Creating and configuring IAM policies and entities and then you need to Registering your Application then Authorizing Selling Partner API applications

NameDescription
MarketplaceMarketplace region List of Marketplaces
ClientIdYour amazon app id
ClientSecretYour amazon app secret
RefreshTokenCheck how to get RefreshToken

For more information about keys please check New Amazon doc for create keys Developer , If you are not registered as developer please Register to be able to create application.


Usage

Please be aware there has been a change to the Orders.GetOrderAddress() method please reference the new sample code for more details.

Configuration

You can configure a connection like so please see Here for the relevant code file.

AmazonConnectionamazonConnection=newAmazonConnection(newAmazonCredential(){ClientId="amzn1.application-XXX-client.XXXXXXXXXXXXXXXXXXXXXXXXXXXX",ClientSecret="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",RefreshToken="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",MarketPlace=MarketPlace.UnitedArabEmirates,//MarketPlace.GetMarketPlaceByID("A2VIGQ35RCS4UG") });orAmazonConnection amazonConnection =newAmazonConnection(newAmazonCredential(){ClientId="amzn1.application-XXX-client.XXXXXXXXXXXXXXXXXXXXXXXXXXXX",ClientSecret="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",RefreshToken="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",MarketPlaceID="A2VIGQ35RCS4UG"});

Configuration using a proxy

Please see here for the relevant code file.

AmazonConnectionamazonConnection=newAmazonConnection(newAmazonCredential(){ClientId="amzn1.application-XXX-client.XXXXXXXXXXXXXXXXXXXXXXXXXXXX",ClientSecret="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",RefreshToken="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",MarketPlaceID="A2VIGQ35RCS4UG",ProxyAddress="http(s)://xxx.xxx.xxx.xxx:xxxx",});
  • Assign your proxy address to the ProxyAddress Property and you'll be able to use a proxy account.

This is not required and will operate normally without the ProxyAddress being set.

Order List, For more orders sample please check Here.

ParameterOrderListserachOrderList=newParameterOrderList();serachOrderList.CreatedAfter=DateTime.UtcNow.AddMinutes(-600000);serachOrderList.OrderStatuses=newList<OrderStatuses>();serachOrderList.OrderStatuses.Add(OrderStatuses.Canceled);varorders=amazonConnection.Orders.GetOrders(serachOrderList);

Order List with parameter

ParameterOrderListserachOrderList=newParameterOrderList();serachOrderList.CreatedAfter=DateTime.UtcNow.AddHours(-24);serachOrderList.OrderStatuses=newList<OrderStatuses>();serachOrderList.OrderStatuses.Add(OrderStatuses.Unshipped);serachOrderList.MarketplaceIds=newList<string>{MarketPlace.UnitedArabEmirates.ID};varorders=amazonConnection.Orders.GetOrders(serachOrderList);

Order List with parameter including PII data Simple

varparameterOrderList=newParameterOrderList{CreatedAfter=DateTime.UtcNow.AddHours(-24),OrderStatuses=newList<OrderStatuses>{OrderStatuses.Unshipped},MarketplaceIds=newList<string>{MarketPlace.UnitedArabEmirates.ID},IsNeedRestrictedDataToken=true};varorders=_amazonConnection.Orders.GetOrders(parameterOrderList);

Order List with parameter including PII data Advance (if you want to get specific data Elements object only)

varparameterOrderList=newParameterOrderList{CreatedAfter=DateTime.UtcNow.AddHours(-24),OrderStatuses=newList<OrderStatuses>{OrderStatuses.Unshipped},MarketplaceIds=newList<string>{MarketPlace.UnitedArabEmirates.ID},IsNeedRestrictedDataToken=true,RestrictedDataTokenRequest=newCreateRestrictedDataTokenRequest{restrictedResources=newList<RestrictedResource>{newRestrictedResource{method=Method.GET.ToString(),path=ApiUrls.OrdersApiUrls.Orders,dataElements=newList<string>{"buyerInfo","shippingAddress"}}}}};varorders=_amazonConnection.Orders.GetOrders(parameterOrderList);

Order List data from Sandbox

AmazonConnectionamazonConnection=newAmazonConnection(newAmazonCredential(){ClientId="amzn1.application-XXX-client.XXXXXXXXXXXXXXXXXXXXXXXXXXXX",ClientSecret="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",RefreshToken="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",Environment=Environments.Sandbox});varorders=amazonConnection.Orders.GetOrders(newFikaAmazonAPI.Parameter.Order.ParameterOrderList{TestCase=Constants.TestCase200});

Report List, For more report sample please check Here.

varparameters=newParameterReportList();parameters.pageSize=100;parameters.reportTypes=newList<ReportTypes>();parameters.reportTypes.Add(ReportTypes.GET_AFN_INVENTORY_DATA);parameters.marketplaceIds=newList<string>();parameters.marketplaceIds.Add(MarketPlace.UnitedArabEmirates.ID);varreports=amazonConnection.Reports.GetReports(parameters);

Custom Report

varparameters=newParameterCreateReportSpecification();parameters.reportType=ReportTypes.GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL;parameters.dataStartTime=DateTime.UtcNow.AddDays(-30);parameters.dataEndTime=DateTime.UtcNow.AddDays(-10);parameters.marketplaceIds=newMarketplaceIds();parameters.marketplaceIds.Add(MarketPlace.UnitedArabEmirates.ID);parameters.reportOptions=newAmazonSpApiSDK.Models.Reports.ReportOptions();varreport=amazonConnection.Reports.CreateReport(parameters);

Get Report with PII

//use this method automatically know if the report are RDT or notvardata2=amazonConnection.Reports.CreateReportAndDownloadFile(ReportTypes.GET_EASYSHIP_DOCUMENTS,startDate,null,null);// OR USE this method to get the document and pass parameter isRestrictedReport = true in case the report will return PII datavardata=amazonConnection.Reports.GetReportDocument("50039018869997",true);

Report Manager 🚀🧑‍🚀✨

Easy way to get the report you need and convert the file return from amazon to class or list, this feature only ready for some reports as its will take much times to finish for All report type ....

ReportManagerreportManager=newReportManager(amazonConnection);varproducts=reportManager.GetProducts();//GET_MERCHANT_LISTINGS_ALL_DATAvarinventoryAging=reportManager.GetInventoryAging();//GET_FBA_INVENTORY_AGED_DATAvarordersByDate=reportManager.GetOrdersByOrderDate(90);//GET_FLAT_FILE_ALL_ORDERS_DATA_BY_ORDER_DATE_GENERALvarordersByLastUpdate=reportManager.GetOrdersByLastUpdate(90);//GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERALvarsettlementOrder=reportManager.GetSettlementOrder(90);//GET_V2_SETTLEMENT_REPORT_DATA_FLAT_FILE_V2varreturnMFNOrder=reportManager.GetReturnMFNOrder(90);//GET_FLAT_FILE_RETURNS_DATA_BY_RETURN_DATEvarreturnFBAOrder=reportManager.GetReturnFBAOrder(90);//GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATAvarreimbursementsOrder=reportManager.GetReimbursementsOrder(180);//GET_FBA_REIMBURSEMENTS_DATAvarfeedbacks=reportManager.GetFeedbackFromDays(180);//GET_SELLER_FEEDBACK_DATAvarLedgerDetails=reportManager.GetLedgerDetailAsync(10);//GET_LEDGER_DETAIL_VIEW_DATAvarUnsuppressedInventory=reportManager.GetUnsuppressedInventoryDataAsync().ConfigureAwait(false).GetAwaiter().GetResult();//GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA

Report GET_MERCHANT_LISTINGS_ALL_DATA sample

varparameters=newParameterCreateReportSpecification();parameters.reportType=ReportTypes.GET_MERCHANT_LISTINGS_ALL_DATA;parameters.marketplaceIds=newMarketplaceIds();parameters.marketplaceIds.Add(MarketPlace.UnitedArabEmirates.ID);parameters.reportOptions=newFikaAmazonAPI.AmazonSpApiSDK.Models.Reports.ReportOptions();varreportId=amazonConnection.Reports.CreateReport(parameters);varfilePath=string.Empty;stringReportDocumentId=string.Empty;while(string.IsNullOrEmpty(ReportDocumentId)){Thread.Sleep(1000*60);varreportData=amazonConnection.Reports.GetReport(reportId);if(!string.IsNullOrEmpty(reportData.ReportDocumentId)){filePath=amazonConnection.Reports.GetReportFile(reportData.ReportDocumentId);break;}}//filePath for report

Product GetCatalogItem Version 2022-04-01

vardata=awaitamazonConnection.CatalogItem.GetCatalogItem202204Async(newParameter.CatalogItems.ParameterGetCatalogItem{ASIN="B00JK2YANC",includedData=new[]{IncludedData.attributes,IncludedData.salesRanks,IncludedData.summaries,IncludedData.productTypes,IncludedData.relationships,IncludedData.dimensions,IncludedData.identifiers,IncludedData.images}});

Product SearchCatalogItems Version 2022-04-01

vardata=awaitamazonConnection.CatalogItem.SearchCatalogItems202204Async(newParameter.CatalogItems.ParameterSearchCatalogItems202204{keywords=new[]{"vitamin c"},includedData=new[]{IncludedData.attributes,IncludedData.salesRanks,IncludedData.summaries,IncludedData.productTypes,IncludedData.relationships,IncludedData.dimensions,IncludedData.identifiers,IncludedData.images}});

Product Pricing, For more Pricing sample please check Here.

vardata=amazonConnection.ProductPricing.GetPricing(newParameter.ProductPricing.ParameterGetPricing(){MarketplaceId=MarketPlace.UnitedArabEmirates.ID,Asins=newstring[]{"B00CZC5F0G"}});

Product Competitive Price

vardata=amazonConnection.ProductPricing.GetCompetitivePricing(newParameter.ProductPricing.ParameterGetCompetitivePricing(){MarketplaceId=MarketPlace.UnitedArabEmirates.ID,Asins=newstring[]{"B00CZC5F0G"},});

GetFeaturedOfferExpectedPriceBatch

varpriceDemo=newProductPricingSample(amazonConnection);awaitpriceDemo.GetFeaturedOfferExpectedPriceBatch();

Notifications Create Destination, For more Notifications sample please check Here.

//EventBridgevardata=amazonConnection.Notification.CreateDestination(newNotifications.CreateDestinationRequest(){Name="CompanyName",ResourceSpecification=newNotifications.DestinationResourceSpecification(){EventBridge=newNotifications.EventBridgeResourceSpecification("us-east-2","999999999")}});//SQSvardataSqs=amazonConnection.Notification.CreateDestination(newNotifications.CreateDestinationRequest(){Name="CompanyName_AE",ResourceSpecification=newNotifications.DestinationResourceSpecification{Sqs=newNotifications.SqsResource("arn:aws:sqs:us-east-2:9999999999999:NAME")}});

Notifications Create Subscription, For more Notifications sample please check Here.

//SQSvarresult=amazonConnection.Notification.CreateSubscription(newParameterCreateSubscription(){destinationId="xxxxxxxxxxxxxxx",// take this from CreateDestination or GetDestinations response notificationType=NotificationType.ANY_OFFER_CHANGED,// or B2B_ANY_OFFER_CHANGED for B2B pricespayloadVersion="1.0"});

Notifications read messages

varSQS_URL="https://sqs.us-east-2.amazonaws.com/9999999999999/IUSER_SQS";ParameterMessageReceiverparam=newParameterMessageReceiver(Environment.GetEnvironmentVariable("AccessKey"),Environment.GetEnvironmentVariable("SecretKey"),SQS_URL,Amazon.RegionEndpoint.USEast2);CustomMessageReceivermessageReceiver=newCustomMessageReceiver();amazonConnection.Notification.StartReceivingNotificationMessages(param,messageReceiver);publicclassCustomMessageReceiver:IMessageReceiver{publicvoidErrorCatch(Exceptionex){//Your code here}publicvoidNewMessageRevicedTriger(NotificationMessageResponcemessage){//Your Code here}}

Feed Submit

Here full sample for submit feed to change price and generate XML and get final report for result same as in doc. Notes: not all feed type finished as it's big work and effort but all classes are partial for easy change and you can generate XML outside and use our library to get data, now we support only submit existing product, change quantity and change price , I list most of XSD here Source\FikaAmazonAPI\ConstructFeed\xsd its will help you easy generate class and add it in your app to generate final feed xml.

Feed Submit for change price , For more Feed sample please check Here.

ConstructFeedServicecreateDocument=newConstructFeedService("{SellerID}","1.02");varlist=newList<PriceMessage>();list.Add(newPriceMessage(){SKU="8201031206122...",StandardPrice=newStandardPrice(){currency=amazonConnection.GetCurrentMarketplace.CurrencyCode.ToString(),Value=(201.0522M).ToString("0.00")}});createDocument.AddPriceMessage(list);varxml=createDocument.GetXML();varfeedID=amazonConnection.Feed.SubmitFeed(xml,FeedType.POST_PRODUCT_PRICING_DATA);Thread.Sleep(1000*30);varfeedOutput=amazonConnection.Feed.GetFeed(feedID);varoutPut=amazonConnection.Feed.GetFeedDocument(feedOutput.ResultFeedDocumentId);varreportOutpit=outPut.Url;varprocessingReport=amazonConnection.Feed.GetFeedDocumentProcessingReport(outPut.Url);

Feed Submit for change Quantity

ConstructFeedServicecreateDocument=newConstructFeedService("{SellerID}","1.02");varlist=newList<InventoryMessage>();list.Add(newInventoryMessage(){SKU="82010312061.22...",Quantity=2,FulfillmentLatency="11",});createDocument.AddInventoryMessage(list);varxml=createDocument.GetXML();varfeedID=amazonConnection.Feed.SubmitFeed(xml,FeedType.POST_INVENTORY_AVAILABILITY_DATA);Thread.Sleep(1000*30);varfeedOutput=amazonConnection.Feed.GetFeed(feedID);varoutPut=amazonConnection.Feed.GetFeedDocument(feedOutput.ResultFeedDocumentId);varreportOutpit=outPut.Url;varprocessingReport=amazonConnection.Feed.GetFeedDocumentProcessingReport(outPut.Url);

Feed Submit for change ProdcutImage

publicvoidSubmitFeedProductImage(){ConstructFeedServicecreateDocument=newConstructFeedService("A3J37AJU4O9RHK","1.02");varlist=newList<ProductImageMessage>();list.Add(newProductImageMessage(){SKU="8201031206122...",ImageLocation="http://xxxx.com/1.jpeg",ImageType=ImageType.Main});createDocument.AddProductImageMessage(list);varxml=createDocument.GetXML();varfeedID=amazonConnection.Feed.SubmitFeed(xml,FeedType.POST_PRODUCT_IMAGE_DATA);}

Feed Submit for change FULFILLMENT DATA (add tracking number for shipment)

ConstructFeedServicecreateDocument=newConstructFeedService("{sellerId}","1.02");varlist=newList<OrderFulfillmentMessage>();list.Add(newOrderFulfillmentMessage(){AmazonOrderID="{orderId}",FulfillmentDate=DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss.fffK"),FulfillmentData=newFulfillmentData(){CarrierName="Correos Express",ShippingMethod="ePaq",ShipperTrackingNumber="{trackingNumber}"}});createDocument.AddOrderFulfillmentMessage(list);varxml=createDocument.GetXML();varfeedID=amazonConnection.Feed.SubmitFeed(xml,FeedType.POST_ORDER_FULFILLMENT_DATA);

Feed Submit for change Order Adjustments

publicvoidSubmitFeedOrderAdjustment(){ConstructFeedServicecreateDocument=newConstructFeedService("A3J37AJU4O9RHK","1.02");varlist=newList<OrderAdjustmentMessage>();list.Add(newOrderAdjustmentMessage(){AmazonOrderID="AMZ1234567890123",ActionType=AdjustmentActionType.Refund,AdjustedItem=newList<AdjustedItem>(){newAdjustedItem(){AmazonOrderItemCode="52986411826454",AdjustmentReason=AdjustmentReason.CustomerCancel,DirectPaymentAdjustments=newList<DirectPaymentAdjustments>(){newDirectPaymentAdjustments(){Component=newList<DirectPaymentAdjustmentsComponent>(){newDirectPaymentAdjustmentsComponent(){DirectPaymentType="Credit Card Refund",Amount=newCurrencyAmount(){Value=10.50M,currency=amazonConnection.GetCurrentMarketplace.CurrencyCode}}}}}}}});createDocument.AddOrderAdjustmentMessage(list);varxml=createDocument.GetXML();varfeedID=amazonConnection.Feed.SubmitFeed(xml,FeedType.POST_PAYMENT_ADJUSTMENT_DATA);}

Usage Plans and Rate Limits in the Selling Partner API

Please read this doc to get all information about this limitation https://github.com/amzn/selling-partner-api-docs/blob/main/guides/en-US/usage-plans-rate-limits/Usage-Plans-and-Rate-Limits.md

we calc waiting time by read x-amzn-RateLimit-Limit header

int sleepTime = (int)((1 / header["x-amzn-RateLimit-Limit"] ) * 1000);

You can also disable libary from handelling limitaion by set IsActiveLimitRate=false in AmazonCredential

varamazonConnection=newAmazonConnection(newAmazonCredential(){..IsActiveLimitRate=false});

Enable debug mode

You can also enable log for all http request and response you can set IsDebugMode=true in AmazonCredential

varamazonConnection=newAmazonConnection(newAmazonCredential(){..IsDebugMode=true});

Get restrictions before try to add new lists

varresult=amazonConnection.Restrictions.GetListingsRestrictions(newParameter.Restrictions.ParameterGetListingsRestrictions{asin="AAAAAAAAAA",sellerId="AXXXXXXXXXXXX"});

Create shipment operation from MerchantFulfillment

ShipmentRequestDetailsshipmentRequestDetails=newShipmentRequestDetails(){AmazonOrderId="999-9999-999999",ItemList=newItemList(){newFikaAmazonAPI.AmazonSpApiSDK.Models.MerchantFulfillment.Item(){OrderItemId="52986411826454",Quantity=1}},ShipFromAddress=newAddress(){AddressLine1="300 St",City="City",PostalCode="48123",Email="[mail@yahoo.com](mailto:mail@yahoo.com)",Phone="999999999",StateOrProvinceCode="MI",CountryCode="US",Name="FirstName LastName"},PackageDimensions=newPackageDimensions(){Height=10,Width=10,Length=10,Unit=UnitOfLength.Inches},Weight=newWeight(){Value=10,Unit=UnitOfWeight.Oz},ShippingServiceOptions=newShippingServiceOptions(){DeliveryExperience=DeliveryExperienceType.NoTracking,CarrierWillPickUp=false,CarrierWillPickUpOption=CarrierWillPickUpOption.ShipperWillDropOff}};varshipmentRequest=newCreateShipmentRequest(shipmentRequestDetails,shippingServiceId:"UPS_PTP_2ND_DAY_AIR",shippingServiceOfferId:"WHgxtyn6qjGGaC");varshipmentResponse=amazonConnection.MerchantFulfillment.CreateShipment(shipmentRequest);

ProductTypes SearchDefinitions

varlist=amazonConnection.ProductType.SearchDefinitionsProductTypes(newParameter.ProductTypes.SearchDefinitionsProductTypesParameter(){keywords=newList<string>{String.Empty},});

ProductTypes GetDefinitions

vardef=amazonConnection.ProductType.GetDefinitionsProductType(newParameter.ProductTypes.GetDefinitionsProductTypeParameter(){productType="PRODUCT",requirements=RequirementsEnum.LISTING,locale=AmazonSpApiSDK.Models.ProductTypes.LocaleEnum.en_US});

Sales Performance Sample

DateTimequeryStart=DateTime.UtcNow.AddDays(-11).Date;DateTimequeryEnd=DateTime.UtcNow;varparameters=newParameterGetOrderMetrics();parameters.marketplaceIds=newMarketplaceIds();parameters.marketplaceIds.Add(MarketPlace.UnitedArabEmirates.ID);parameters.interval=queryStart.ToString("yyyy-MM-ddTHH:mm:ss",CultureInfo.InvariantCulture)+"Z--"+queryEnd.ToString("yyyy-MM-ddTHH:mm:ss",CultureInfo.InvariantCulture)+"Z";parameters.granularity=Constants.GranularityEnum.Day;parameters.firstDayOfWeek=Constants.FirstDayOfWeek.monday;varsales=amazonConnection.Sales.GetOrderMetrics(parameters);

Q & A

If you have questions, please ask in GitHub discussions

discussions


ToDo

  • Improve documentation

Useful links


Contributing

  1. Fork it (https://github.com/abuzuhri/Amazon-SP-API-CSharp/fork)
  2. Clone it (git clone https://github.com/{YOUR_USERNAME}/Amazon-SP-API-CSharp)
  3. Create your feature branch (git checkout -b your_branch_name)
  4. Commit your changes (git commit -m 'Description of a commit')
  5. Push to the branch (git push origin your_branch_name)
  6. Create a new Pull Request

Notes

If you are looking for a complete Feedback solution, you might want to consider giving Soon.se a shot.


Support & Consultation

We offer consultation on everything SP-API related. Book your meeting here:

Book Meeting


Thanks

Thanks go out to everybody who worked on this package.

About

.Net C# library for the new Amazon Selling Partner API

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages