looks like the money handling is where it'll bite first. the api result gets normalized, but that value never makes it into save(), which writes straight to a real column. the html path has no currency field, so save() would throw a keyerror on those rows. keeping amount, divisor and currency code as separate columns seems safer than guessing from the symbol
page offsets are needed too or ranks collide between pages. for the retry header, i'd treat retry-after as a minimum wait with capped retries, since a huge value might mean daily quota, tho that's just a guess