USAspending spending_by_award: hasNext goes false at 10,000 while the data keeps going

Checked 2026-09-08 · Rate limits, pagination walls and retries

Offset paging on spending_by_award stops telling you the truth long before the data runs out. The filter used here matches 5,782,899 awards, yet page_metadata.hasNext is already false at page 101 while pages 101, 150 and 500 each still return a full 100 new records — so a client that stops when hasNext goes false stops at record 10,000, with no error and nothing in the payload to say so. limit is capped at 100 a page, so you cannot page wider either. Further on there is a second, harder ceiling where the endpoint refuses with HTTP 422. The request that walks past both walls, and the check that it returns exactly the records offset paging returns, are in the method.

What we saw

The filter used matches 5,782,899 awards, so hasNext=false at record 10,000 is not the end of the data. Source (results, 2026-09-08).

{"results":{"contracts":5782899,"direct_payments":0,"grants":0,"idvs":0,"loans":0,"other":0},"spending_level":"awards"}

Pages 101 through 500 still return 100 results each, all with hasNext false. Source (results length, page_metadata, 2026-09-08).

page=101  http=200  -> {'n': 100, 'hasNext': False}
page=150  http=200  -> {'n': 100, 'hasNext': False}
page=500  http=200  -> {'n': 100, 'hasNext': False}

limit above 100 is rejected outright. Source (HTTP 422 body, 2026-09-08).

{"detail":"Field 'limit' value '500' is above max '100'"}

Limits

Open question

Why hasNext and the two pagination fields beside it are nulled at exactly record 10,000 when the endpoint keeps serving to 50,000. It looks like two different limits set in two different places, but that is a guess.

Plain text