let
// Function to get data from a specific page
GetPage = (PageNumber as number) =>
let
url = "https://api.usaspending.gov/api/v2/search/spending_by_award/",
body = "{
""filters"": {
""time_period"": [
{""start_date"": ""2023-10-01"", ""end_date"": ""2024-09-30"", ""date_type"": ""new_awards_only""},
{""start_date"": ""2022-10-01"", ""end_date"": ""2023-09-30"", ""date_type"": ""new_awards_only""},
{""start_date"": ""2021-10-01"", ""end_date"": ""2022-09-30"", ""date_type"": ""new_awards_only""},
{""start_date"": ""2020-10-01"", ""end_date"": ""2021-09-30"", ""date_type"": ""new_awards_only""},
{""start_date"": ""2019-10-01"", ""end_date"": ""2020-09-30"", ""date_type"": ""new_awards_only""},
{""start_date"": ""2018-10-01"", ""end_date"": ""2019-09-30"", ""date_type"": ""new_awards_only""},
{""start_date"": ""2017-10-01"", ""end_date"": ""2018-09-30"", ""date_type"": ""new_awards_only""},
{""start_date"": ""2016-10-01"", ""end_date"": ""2017-09-30"", ""date_type"": ""new_awards_only""},
{""start_date"": ""2015-10-01"", ""end_date"": ""2016-09-30"", ""date_type"": ""new_awards_only""},
{""start_date"": ""2014-10-01"", ""end_date"": ""2015-09-30"", ""date_type"": ""new_awards_only""}
],
""award_type_codes"": [""A"", ""B"", ""C"", ""D""],
""agencies"": [
{""type"": ""awarding"", ""tier"": ""toptier"", ""name"": ""Agency for International Development""}
]
},
""fields"": [
""Award ID"", ""generated_internal_id"",
""Awarding Agency"", ""Awarding Agency Code"", ""Awarding Sub Agency"",""Awarding Sub Agency Code"",
""Funding Agency"", ""Funding Agency Code"", ""Funding Sub Agency"", ""Funding Sub Agency Code"",
""Recipient Name"", ""recipient_id"", ""Prime Award Recipient ID"", ""Recipient DUNS Number"",
""Description"",""Place of Performance Country Code"",
""Start Date"", ""End Date"", ""Award Amount"", ""Total Outlays"",""Contract Award Type"", ""Base Obligation Date""
],
""page"": " & Number.ToText(PageNumber) & ",
""limit"": 100,
""sort"": ""Award Amount"",
""order"": ""desc"",
""subawards"": false
}",
response = Json.Document(Web.Contents(url, [Content=Text.ToBinary(body), Headers=[#"Content-Type"="application/json"]])),
awards = response[results],
hasNext = response[page_metadata][hasNext]
in
[Data = awards, HasNext = hasNext],
// Loop to fetch all pages manually
GetAllPages = () =>
let
// Initialize the first page and accumulated data
InitialResult = GetPage(1),
InitialData = InitialResult[Data],
HasNext = InitialResult[HasNext],
// Define a recursive function to fetch subsequent pages
FetchData = (PageNumber, AccumulatedData) =>
let
Result = GetPage(PageNumber),
NewData = List.Combine({AccumulatedData, Result[Data]}),
NewHasNext = Result[HasNext]
in
if NewHasNext then @FetchData(PageNumber + 1, NewData) else NewData,
// Start fetching data from the first page
AllData = FetchData(2, InitialData)
in
AllData,
// Fetch all data
CombinedData = GetAllPages(),
TableData = Table.FromList(CombinedData, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
// Expand the records into columns
#"Expanded Column1" = Table.ExpandRecordColumn(TableData, "Column1",
{"Award ID", "generated_internal_id", "Awarding Agency", "Awarding Agency Code", "Awarding Sub Agency",
"Awarding Sub Agency Code", "Funding Agency", "Funding Agency Code", "Funding Sub Agency",
"Funding Sub Agency Code", "Recipient Name", "recipient_id", "Prime Award Recipient ID",
"Recipient DUNS Number", "Description", "Place of Performance Country Code", "Start Date",
"End Date", "Award Amount", "Total Outlays", "Contract Award Type", "Base Obligation Date"},
{"Award ID", "generated_internal_id", "Awarding Agency", "Awarding Agency Code", "Awarding Sub Agency",
"Awarding Sub Agency Code", "Funding Agency", "Funding Agency Code", "Funding Sub Agency",
"Funding Sub Agency Code", "Recipient Name", "recipient_id", "Prime Award Recipient ID",
"Recipient DUNS Number", "Description", "Place of Performance Country Code", "Start Date",
"End Date", "Award Amount", "Total Outlays", "Contract Award Type", "Base Obligation Date"}),
// Change column types
#"Changed Type" = Table.TransformColumnTypes(#"Expanded Column1",{
{"Start Date", type date},
{"End Date", type date},
{"Award Amount", type number},
{"Total Outlays", type number},
{"Base Obligation Date", type date}})
in
#"Changed Type"