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
- AWSSDK.SecurityToken
- AWSSDK.SQS
- Microsoft.CSharp
- Newtonsoft.Json
- RestSharp
- System.ComponentModel.Annotations
- System.Reflection
Install-Package CSharpAmazonSpAPI- OrdersV0
- Reports
- FinancesV0
- FeedsUse Case GuidefeedType
- ListingsItemsUse Case Guide
- RestrictionsUse Case Guide
- ProductTypesUse Case Guide
- UploadsUse Case Guide
- shipmentInvoicingV0
- Shippings
- CatalogItemsV0
- CatalogItemsV20220401
- FBAInventory
- FBASmallAndLight
- FBAInboundEligibility
- FulFillmentInbound
- FulFillmentOutbound
- MerchantFulFillment
- Messaging
- NotificationsUse Case Guide
- ProductFeesV0
- ProductPricingV0
- Sales
- Sellers
- Services
- Solicitations
- TokenUse Case Guide
- Authorization
- Easy Ship
- A+ Content
- Replenishment
- VendorDirectFulfillmentInventoryV1
- VendorDirectFulfillmentOrdersV1
- VendorDirectFulfillmentPaymentsV1
- VendorDirectFulfillmentShippingV1
- VendorDirectFulfillmentTransactionsV1
- VendorOrders
- vendorInvoices
- VendorShipments
- VendorTransactionStatus
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
| Name | Description |
|---|---|
| Marketplace | Marketplace region List of Marketplaces |
| ClientId | Your amazon app id |
| ClientSecret | Your amazon app secret |
| RefreshToken | Check 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.
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"});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);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);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);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);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);//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);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_DATAvarparameters=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 reportvardata=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}});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"}});vardata=amazonConnection.ProductPricing.GetCompetitivePricing(newParameter.ProductPricing.ParameterGetCompetitivePricing(){MarketplaceId=MarketPlace.UnitedArabEmirates.ID,Asins=newstring[]{"B00CZC5F0G"},});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"});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}}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);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);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);}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);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);}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});You can also enable log for all http request and response you can set IsDebugMode=true in AmazonCredential
varamazonConnection=newAmazonConnection(newAmazonCredential(){..IsDebugMode=true});varresult=amazonConnection.Restrictions.GetListingsRestrictions(newParameter.Restrictions.ParameterGetListingsRestrictions{asin="AAAAAAAAAA",sellerId="AXXXXXXXXXXXX"});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);varlist=amazonConnection.ProductType.SearchDefinitionsProductTypes(newParameter.ProductTypes.SearchDefinitionsProductTypesParameter(){keywords=newList<string>{String.Empty},});vardef=amazonConnection.ProductType.GetDefinitionsProductType(newParameter.ProductTypes.GetDefinitionsProductTypeParameter(){productType="PRODUCT",requirements=RequirementsEnum.LISTING,locale=AmazonSpApiSDK.Models.ProductTypes.LocaleEnum.en_US});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);If you have questions, please ask in GitHub discussions
- Improve documentation
- Fork it (https://github.com/abuzuhri/Amazon-SP-API-CSharp/fork)
- Clone it (
git clone https://github.com/{YOUR_USERNAME}/Amazon-SP-API-CSharp) - Create your feature branch (
git checkout -b your_branch_name) - Commit your changes (
git commit -m 'Description of a commit') - Push to the branch (
git push origin your_branch_name) - Create a new Pull Request
If you are looking for a complete Feedback solution, you might want to consider giving Soon.se a shot.
We offer consultation on everything SP-API related. Book your meeting here:
Thanks go out to everybody who worked on this package.