using CsvHelper.Configuration;
using System.Globalization;
using System.Collections.Generic;
public static async void Main()
HttpClient _client = new HttpClient();
string jsonString = JsonSerializer.Serialize(new { reportType = "SOME_REPORT_TYPE", dataStartTime = "", dataEndTime = "", marketplaceIds = new [] { "SOMEID" }});
var message = MakeRequestMessage(HttpMethod.Post, "http://", "TokenHERE");
message.Content = new StringContent(jsonString);
var createReportResponse = await _client.SendAsync(message);
string createReportResponseString = await createReportResponse.Content.ReadAsStringAsync();
CreateReportResponse createReportResponseObj = JsonSerializer.Deserialize<CreateReportResponse>(createReportResponseString);
var reportResponse = await _client.SendAsync(MakeRequestMessage(HttpMethod.Get, $"https://[putfirstpartofurlhere]/reports/2021-06-30/reports/{createReportResponseObj.reportId}", "TOKEN HERE"));
string reportResponseString = await reportResponse.Content.ReadAsStringAsync();
GetReportResponse reportResponseObj = JsonSerializer.Deserialize<GetReportResponse>(reportResponseString);
var documentResponse = await _client.SendAsync(MakeRequestMessage(HttpMethod.Get, $"[putfirstpartofurlhere]/reports/2021-06-30/documents/{reportResponseObj.reportDocumentId}", "TOKEN HERE"));
string documentResponseString = await documentResponse.Content.ReadAsStringAsync();
ReportDocumentResponse documentResponseObj = JsonSerializer.Deserialize<ReportDocumentResponse>(documentResponseString);
var actualDocResponse = await _client.GetAsync(documentResponseObj.url);
string actualDocResponseContent = await actualDocResponse.Content.ReadAsStringAsync();
List<ReportRow> reportRows = new List<ReportRow>();
CsvConfiguration config = new(CultureInfo.InvariantCulture);
using (var reader = new StringReader(actualDocResponseContent))
using (var csv = new CsvReader(reader, config))
csv.Context.RegisterClassMap<ReportRowMap>();
reportRows = csv.GetRecords<ReportRow>().ToList();
public static HttpRequestMessage MakeRequestMessage(HttpMethod httpMethod, string url, string accessToken)
var message = new HttpRequestMessage(httpMethod, url);
message.Headers.Add("x-amz-access-token", accessToken);
message.Headers.Add("x-amz-date", DateTime.Now.ToUniversalTime().ToString("o"));
internal record CreateReportResponse(string reportId);
internal record GetReportResponse(
string processingStartTime,
string processingEndTime,
string reportDocumentId);
internal record ReportDocumentResponse(
string compressionAlgorithm);
public string Date { get; set; }
public string FnSku { get; set; }
public string Asin { get; set; }
public string MSku { get; set; }
public string Title { get; set; }
public string EventType { get; set; }
public string RefernceId { get; set; }
public string Quantity { get; set; }
public string FulfillmentCenter { get; set; }
public string Disposition { get; set; }
public string Reason { get; set; }
public string Country { get; set; }
public string ReconciledQuantity { get; set; }
public string UnreconciledQuantity { get; set; }
public string DateAndTime { get; set; }
public sealed class ReportRowMap : ClassMap<ReportRow>
Map(m => m.Date).Name("Date");
Map(m => m.FnSku).Name("FNSKU");
Map(m => m.Asin).Name("ASIN");
Map(m => m.MSku).Name("MSKU");
Map(m => m.Title).Name("Title");
Map(m => m.EventType).Name("Event Type");
Map(m => m.RefernceId).Name("Reference ID");
Map(m => m.Quantity).Name("Quantity");
Map(m => m.FulfillmentCenter).Name("Fulfillment Center");
Map(m => m.Disposition).Name("Disposition");
Map(m => m.Reason).Name("Reason");
Map(m => m.Country).Name("Country");
Map(m => m.ReconciledQuantity).Name("Reconciled Quantity");
Map(m => m.UnreconciledQuantity).Name("Unreconciled Quantity");
Map(m => m.DateAndTime).Name("Date And Time");