# pagination-counts pydantic_v2.BaseModel
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?offset=2&limit=2
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?offset=4&limit=2
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  literal offsets ['1', '2', '3']
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  missing has_more [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='missing') [operation_id='listUsers', location=BodySelector(pointer='/has_more')] missing
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  literal offsets past the page limit ['1', '2'] ! SessionLimitError: SessionLimitError(reason='pages', limit=1) [limit=1] pages
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?offset=2&limit=2
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  literal offset pages ['[1]', '[2]']
  literal offset progress {'pages': 2, 'items': 2}
  > POST https://api.example.com/searches
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json, content-type: application/json, content-length: 13] b'{"query":"a"}'
  > POST https://api.example.com/searches
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json, content-type: application/json, content-length: 35] b'{"query":"a","window":{"start":10}}'
  body offsets ['1', '2']
  > GET https://api.example.com/users?offset=40
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?offset=42&limit=2
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  query start ['1', '2', '3']
  > GET https://api.example.com/users?offset=40
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  query start near the total ['1', '2']
  > GET https://api.example.com/users?offset=40
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  query start page = [1] continuation=42 status=200 attempts=1
  > GET https://api.example.com/users?offset=42&limit=2
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  query start next page = [2] continuation=None status=200 attempts=1
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json, x-page: 5] b''
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json, x-page: 6] b''
  header start ['1', '2']
  > POST https://api.example.com/searches
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json, content-type: application/json, content-length: 35] b'{"query":"a","window":{"start":30}}'
  > POST https://api.example.com/searches
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json, content-type: application/json, content-length: 35] b'{"query":"a","window":{"start":40}}'
  body start ['1', '2']
  > GET https://api.example.com/finds?term=a&start=10
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/finds?term=a&start=15
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  querystring start ['1', '2']
  > GET https://api.example.com/finds?term=a
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/finds?term=a&start=5
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  querystring without a start ['1', '2']
  > GET https://api.example.com/finds
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/finds?start=5
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  no querystring ['1', '2']
  text start [] ! UserWarning: Pydantic serializer warnings:
  PydanticSerializationUnexpectedValue(Expected `int` - serialized value may not be as expected [input_value='forty', input_type=str]) []
  > GET https://api.example.com/users?position=40.0
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?position=41
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  integral number start ['1', '2']
  fractional number start [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='type') [operation_id='listUsers', location=ParameterTarget(location='query', name='position')] type
  > GET https://api.example.com/users?page=3
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?page=4
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  page number start ended by an empty page ['1', '2']
  text body start [] ! UserWarning: Pydantic serializer warnings:
  PydanticSerializationUnexpectedValue(Expected `int` - serialized value may not be as expected [field_name='start', input_value='x', input_type=str]) []
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?offset=3
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  counted offsets ['1', '2', '3', '4', '5']
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  zero total []
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?offset=3
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  offsets past the total ['1', '2', '3', '4', '5', '6']
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?offset=1
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  empty page before the total ['1'] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='inconsistent') [operation_id='listUsers', location=BodySelector(pointer='/data')] inconsistent
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  negative total [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='value') [operation_id='listUsers', location=BodySelector(pointer='/total')] value
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  missing total [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='missing') [operation_id='listUsers', location=BodySelector(pointer='/total')] missing
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?offset=11
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?offset=13
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  offsets from the first position ['1', '2', '3']
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  string has_more [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='type') [operation_id='listUsers', location=BodySelector(pointer='/more')] type
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  null has_more [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='null') [operation_id='listUsers', location=BodySelector(pointer='/more')] null
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  missing untyped has_more [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='missing') [operation_id='listUsers', location=BodySelector(pointer='/more')] missing
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json, x-page: 1] b''
  header page numbers ['1', '2']
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  capitalized has_more header [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='type') [operation_id='listUsers', location=HeaderSelector(name='X-Has-More', occurrence='single')] type
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  missing has_more header [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='missing') [operation_id='listUsers', location=HeaderSelector(name='X-Has-More', occurrence='single')] missing
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?page=2
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  page numbers ['1', '2', '3']
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  signed total header [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='value') [operation_id='listUsers', location=HeaderSelector(name='x-total-count', occurrence='single')] value
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  spelled total header [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='type') [operation_id='listUsers', location=HeaderSelector(name='x-total-count', occurrence='single')] type
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  huge total header [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='value') [operation_id='listUsers', location=HeaderSelector(name='x-total-count', occurrence='single')] value
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  missing total header [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='missing') [operation_id='listUsers', location=HeaderSelector(name='x-total-count', occurrence='single')] missing
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?page=3
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  page numbers ended by an empty page ['1']
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  fractional total [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='type') [operation_id='listUsers', location=BodySelector(pointer='/count')] type
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  boolean total [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='type') [operation_id='listUsers', location=BodySelector(pointer='/count')] type
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  null total [] ! ProtocolDataError: ProtocolDataError(operation_id='listUsers', reason='null') [operation_id='listUsers', location=BodySelector(pointer='/count')] null
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  first counted page = [1,2] continuation=2 status=200 attempts=1
  > GET https://api.example.com/users?offset=2
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  next counted page = [3] continuation=None status=200 attempts=1
  > GET https://api.example.com/users?offset=2
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  next counted page again = [3] continuation=None status=200 attempts=1
  after the last counted page = None
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  > GET https://api.example.com/users?offset=2&limit=2
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  async literal offsets ['1', '2', '3']
  > GET https://api.example.com/users
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  async first page number = [1] continuation=2 status=200 attempts=1
  > GET https://api.example.com/users?page=2
    [host: api.example.com, accept-encoding: gzip, deflate, accept: application/json] b''
  async next page number = [2] continuation=None status=200 attempts=1
  async after the last page number = None
