Tutorial: Automate your SP-API Calls Using a C# SDK
Automate your SP-API calls with Login with Amazon (LWA) token exchange and authentication.
This tutorial provides you with all the required information to generate a C# SDK with Login with Amazon (LWA) token exchange and an authentication to build your application.
You can use this SDK to integrate Amazon marketplace features into your applications, including accessing product information, managing orders, handling shipments, and more.
Prerequisites
To complete this tutorial, you need the following prerequisites:
- A hybrid or SP-API app in draft or published state
- Integrated development environment (IDE) software (this walkthrough uses Visual Studio IDE on Windows OS)
Before your application can connect to the Selling Partner API, you must register it, and it must be authorized by a selling partner. If you do not have a hybrid or SP-API app, follow the steps to register as a developer, register your application, and Authorizing Selling Partner API applications. Then, return to this tutorial.
Next, set up your workspace for the tutorial.
Step 1. Set up your workspace
-
On your local drive, create a directory for this project and name it
SwaggerToCL. -
Download the following tools.
- IDE software (this walkthrough uses Visual Studio IDE on Windows OS)
- GNU Wget
- Java 8 or newer
-
Run the following command to download the Swagger Code Generator:
wget https://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.4.13/swagger-codegen-cli-2.4.13.jar -O swagger-codegen-cli.jar -
Copy
swagger-codegen-cli.jarinto your local directoryC:\\SwaggerToCL. -
In GitHub, go to
https://github.com/amzn/selling-partner-api-models/tree/main/modelsand use the following command to clone theselling-partner-api-modelsrepository to your local directoryC:\\SwaggerToCL.git clone https://github.com/amzn/selling-partner-api-models -
Navigate to the
selling-partner-api-models\\modelsfolder in your local copy of the repository and copy a JSON file from the models subfolders intoC:\\SwaggerToCL. This tutorial uses theSellers.jsonfile. -
In GitHub, go to
https://github.com/amzn/selling-partner-api-models/tree/main/clients/sellingpartner-api-aa-csharpand download thesellingpartner-api-aa-csharpfolder to your local computer.
This folder provides helper classes to generate an access token for Amazon Selling Partner APIs. It is intended for use with the Selling Partner API Client Libraries generated by Swagger Codegen using the RestSharp library. It can also be integrated into custom projects.
Now that you have completed the required setup, the next step is to generate the C# SDK with the authentication and authorization classes provided in the sellingpartner-api-aa-csharp folder.
Step 2. Generate a C# SDK with LWA token exchange and authentication
-
Open Visual Studio.
-
In the
sellingpartner-api-aa-csharpfolder, select theSellingPartnerAPIAuthAndAuthCSharp.slnfile and build it using the build option in Visual Studio. This generates theAmazon.SellingPartnerAPIAA.dllassembly in the foldersellingpartner-api-aa-csharp\\src\\Amazon.SellingPartnerAPIAA\\bin\\Debug\\netstandard2.0. -
Open a terminal and run the following commands to generate the C# client library. The default package name for the generated client library is
Swagger.IO. These commands generate the client libraries with their respective API names as the package name instead ofSwagger.IO.- In
C:\\SwaggerToCL, create a JSON file namedcsharpConfig.json, open an editor and add the following code. ForpackageName, use the same name of the API you want to generate the client library for:
{"packageName":"SellingPartnerAPI.SellerAPI","targetFramework":"v4.7.2"}Run this command to generate C# code with a customized package name:
java -jar C:\SwaggerToCL\swagger-codegen-cli.jar generate -i C:\SwaggerToCL\[name of model].json -l csharp -t [path to selling-partner-api-models\clients\sellingpartner-api-aa-csharp folder]\src\Amazon.SellingPartnerAPIAA\resources\swagger-codegen\templates\ -o C:\SwaggerToCL\[name of client library] -c C:\SwaggerToCL\csharpConfig.jsonThis command uses
Sellers.jsonto generate C# code:java -jar C:\SwaggerToCL\swagger-codegen-cli.jar generate -i C:\SwaggerToCL\Sellers.json -l csharp -t C:\SwaggerToCL\sellingpartner-api-aa-csharp\src\Amazon.SellingPartnerAPIAA\resources\swagger-codegen\templates\ -o C:\SwaggerToCL\Sellers_CsharpCL -c C:\SwaggerToCL\csharpConfig.jsonThe SDK is created in
C:\\SwaggerToCL\\Sellers_CsharpCL. The next step is to write the actual application and connect to the SP-API using the generated C# SDK. - In
Step 3. Connect to the Selling Partner API using the generated C# SDK
-
In Visual Studio IDE, navigate to your generated library Sellers_CsharpCL folder and open the
.slnfile. The.slnpackage file will have the name as provided in Step 2. Generate a C# SDK with LWA token exchange and authentication. In this example, the package file name isSellingPartnerAPI.SellerAPI.sln. -
Right-click the
SellingPartnerAPI.SellerAPIfile and select Add > References. -
In the References window, choose Browse, navigate to
sellingpartner-api-aa csharp/src/Amazon.SellingPartnerAPIAA/bin/Debug/netstandard2.0and chooseAmazon.SellingPartnerAPIAA.dll. -
Repeat steps 1-3 for the
SellingPartnerAPI.SellerAPI.Testfile. -
Navigate to your generated library
Sellers_CsharpCLfolder, right-click theSellingPartnerAPI.SellerAPIfile, choose Options > General, and change the target framework to .net Framework v4.7 and newer. -
Repeat step 5 for the
SellingPartnerAPI.SellerAPI.Testfile. -
Right-click the
SellingPartnerAPI.SellerAPIfile and choose Manage NuGet Packages. Make sure you have the following package versions (If not, install the respective NuGet packages):JsonSubTypes 1.2.0or newerNewtonsoft.json 12.0.3or newerRestSharp 106.12.0RateLimiter 2.2.0or newer (this will also installComposableAsync.Core)
-
Right-click the
SellingPartnerAPI.SellerAPI.Testfile and choose Manage NuGet Packages. Install the Nunit 2.6.4 package.Manual installation of NuGet packages
In some scenarios (for example, using IOS), the required versions in the NuGet packages appear, but you can encounter an error. In this scenario, you must manually add the packages from the package folder in the file system:
- In Visual Studio IDE, navigate to your generated library
Sellers_CsharpCLfolder and open the.slnfile. - Right-click the
SellingPartnerAPI.SellerAPIfile and select Add > References. - In the References window, choose Browse, navigate to
sellingpartner-api-aa csharp/src/Amazon.SellingPartnerAPIAA/bin/Debug/netstandard2.0, choose the generated client library folder (for example,Sellers_CsharpCL), then choose packages and add the package for which you are facing the error.
- In Visual Studio IDE, navigate to your generated library
-
In the
SellingPartnerAPI.SellerAPI.Test > Apifolder, open the[Modelname]Tests.csfile and add the following code:using System; using System.IO; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reflection; using RestSharp; using SellingPartnerAPI.SellerAPI.Client; using SellingPartnerAPI.SellerAPI.Api; using SellingPartnerAPI.SellerAPI.Model; using Amazon.SellingPartnerAPIAA; namespace SellingPartnerAPI.SellerAPI.Test { class SellersApiTests { public static void Main(string[] args) { try { LWAAuthorizationCredentials lwaAuthorizationCredentials = new LWAAuthorizationCredentials { ClientId = "amzn1.application-oa2-client.******************", ClientSecret = "***********************************", RefreshToken = "Atzr|***********************************", Endpoint = new Uri("https://api.amazon.com/auth/o2/token") }; SellersApi sellersApi = new SellersApi.Builder() .SetLWAAuthorizationCredentials(lwaAuthorizationCredentials) .Build(); GetMarketplaceParticipationsResponse result = sellersApi.GetMarketplaceParticipations(); Console.WriteLine(result.ToJson()); } catch (LWAException e) { Console.WriteLine("LWA Exception when calling SellersApi#getMarketplaceParticipations"); Console.WriteLine(e.getErrorCode()); Console.WriteLine(e.getErrorMessage()); Console.WriteLine(e.Message); } catch (ApiException e) { Console.WriteLine("Exception when calling SellersApi#getMarketplaceParticipations"); Console.WriteLine(e.Message); } } } }LWAAuthorizationCredentialsinstance parameters:
| Name | Description | Required |
|---|---|---|
ClientId | Your LWA client identifier. For more information, refer to Viewing your application information and credentials. | Yes |
ClientSecret | Your LWA client secret. For more information, refer to Viewing your application information and credentials | Yes |
RefreshToken | The LWA refresh token. Get this value when the selling partner authorizes your application. For more information, refer to Authorizing Selling Partner API Applications. | No. Include RefreshToken if the operation that you call in the following step requires selling partner authorization. All operations that are not grantless operations require selling partner authorization. If you include RefreshToken, do not include Scopes. |
Scopes | The scope of the LWA authorization grant. You can specify one or more Scopes values:- ScopeNotificationsAPI. For the Notifications API.- ScopeMigrationAPI. | No. Include Scopes if the operation that you call in the following step is a grantless operation. If you include Scopes, do not include the RefreshToken. |
Endpoint | The LWA authentication server URI. | Yes |
Example of an operation call that requires selling partner authorization:
```csharp
using Amazon.SellingPartnerAPIAA;
LWAAuthorizationCredentials lwaAuthorizationCredentials = new LWAAuthorizationCredentials
{
ClientId = "myClientId",
ClientSecret = "myClientSecret",
RefreshToken = "Aztr|...",
Endpoint = new Uri(""https://api.amazon.com/auth/o2/token"")
};
```
Example of a grantless operation call:
```csharp
using Amazon.SellingPartnerAPIAA;
LWAAuthorizationCredentials lwaAuthorizationCredentials = new LWAAuthorizationCredentials
{
ClientId = "myClientId",
ClientSecret = "myClientSecret",
Scopes = new List<string>() { ScopeConstants.ScopeNotificationsAPI, ScopeConstants.ScopeMigrationAPI }
Endpoint = new Uri(""https://api.amazon.com/auth/o2/token"")
};
```
-
To view the output of the code, you need to convert it to a console application. To do so, right-click the
SellingPartnerAPI.SellerAPI.Testfile and choose Options. -
On the Project Options window, in the left navigation pane, expand Build, then choose General. In the Code Generation section, choose Compile Target and select Executable with GUI. Choose OK.
-
Build and run the project.
Troubleshoot a C# SDK
Restsharp errors: “IRestRequest is defined in an assembly that is not referenced. You must add a reference to assembly RestSharp Version=105.0.0.0. Culture=neutral. PublicKevToken=598062e77f915f75”
IRestRequest is defined in an assembly that is not referenced. You must add a reference to assembly RestSharp Version=105.0.0.0. Culture=neutral. PublicKevToken=598062e77f915f75”Select to expand the answer.
Update the Restsharp package to version 106.12.0.0. Check the reference to make sure that version 106.12 updated successfully. If it continues to show 105.0.0.0, remove the old version from the reference and add the 106.12.0.0 package manually from the packages folder with the generated client library."The type or namespace name 'Newtonsoft' could not be found (are you missing a using directive or an assembly reference?)"
Select to expand the answer.
In some scenarios, even though you have the required version in the NuGet packages for Newtonsoft, you need to manually add the package from the package folder in the file system. To resolve this, use the following steps:
-
In Visual Studio, right-click your generated SDK package and choose
Add, thenReferences. -
On the references window in the .Net Assembly, choose
browse**. -
Navigate to the generated client library folder in local → packages and add the specific package for Newtonsoft.
“Message : Could not load type of field SellingPartnerAPI.servicesApi.Client.ApiClient:rateLimiter (3) due to : Could not load file or assembly ComposableAsync.Core, Version=1.1.1.0, Culture=neutral, PublicKeyToken=null or one of its dependencies."
SellingPartnerAPI.servicesApi.Client.ApiClient:rateLimiter (3) due to : Could not load file or assembly ComposableAsync.Core, Version=1.1.1.0, Culture=neutral, PublicKeyToken=null or one of its dependencies."Select to expand the answer.
If you receive this error after you build and run your code, then the ComposableAsync.Core dependency package was downloaded but not included as a reference. Make sure to add the dll as a reference manually.
Mapping issues with models
Select to expand the answer.
The ItemAsin model was generated with the JsonObject type, but the required string ItemAttributes requires the JsonObjectAttribute. You can use this command, which uses the Catalog Items API, to import the required mapping for the models :
`java -jar swagger-codegen-cli.jar generate -i catalogItems_2022-04-01.json -l csharp -t sellingpartner-api-aa-csharp\src\Amazon.SellingPartnerAPIAA\resources\swagger-codegen\templates —import-mappings ItemAttributes=Newtonsoft.Json.JsonObjectAttribute —import-mappings ItemAsin=System.string -o catalogItems2022-04-01_import`
"HttpRequestHeaders.ToJson(): no suitable method found to override."
HttpRequestHeaders.ToJson(): no suitable method found to override."Select to expand the answer.
Modify the override keyword with virtual. Declare methods as virtual so that they can be overridden.
public virtual string ToJson()
{
return JsonConvert.SerializeObject(this, Formatting.Indented);
}
“The name BaseValidate does not exist in the current context”
BaseValidate does not exist in the current context”Select to expand the answer.
Uncomment the mentioned methods in the class:
// IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
// {
// foreach (var x in BaseValidate(validationContext))
// yield return x;
// yield break;
// }
Updated 6 months ago
