Open
Description
Describe the bug
I created an account-scoped API token and used it to call the /accounts endpoint, expecting to retrieve a single account (as expected for an account-scoped token).
Here is the code I am using:
cloudflare_client = Cloudflare(api_token=cloudflare_integration_config.api_token)
for cloudflare_client_result in cloudflare_client.accounts.list():
...
However the loop keeps returning the same single account result repeatedly.
After debugging, I found that has_next_page() always returns True, even though there’s only one result. This causes the pagination loop to continue indefinitely.
ipdb> cloudflare_client_result
SyncV4PagePaginationArray[Account](result=[Account(id='ACCOUNT_ID', name="ACCOUNT_NAME", created_on=datetime.datetime(2023, 2, 8, 7, 11, 56, 234700, tzinfo=TzInfo(UTC)), settings=Settings(abuse_contact_email=None, default_nameservers='cloudflare.standard', enforce_twofactor=False, use_account_custom_ns_by_default=False, api_access_enabled=None, access_approval_expiry=None), type='standard', legacy_flags={'enterprise_zone_quota': {'maximum': 0, 'current': 0, 'available': 0}})], result_info=V4PagePaginationArrayResultInfo(page=1, per_page=20, total_pages=1, count=1, total_count=1), success=True, errors=[], messages=[])
ipdb> cloudflare_client_result.has_next_page()
True
UPDATE:
➜ curl -X GET "https://api.cloudflare.com/client/v4/accounts?per_page=50&page=1" \
-H "Authorization: Bearer MY_API_KEY" \
-H "Content-Type:application/json"
{"result":[{"id":"ACCOUNT_ID_1","name":"ACCOUNT_NAME_1","type":"standard","settings":{"enforce_twofactor":false,"api_access_enabled":null,"access_approval_expiry":null,"use_account_custom_ns_by_default":false,"default_nameservers":"cloudflare.standard","abuse_contact_email":null},"legacy_flags":{"enterprise_zone_quota":{"maximum":0,"current":0,"available":0}},"created_on":"2023-02-08T07:11:56.234700Z"}],"result_info":{"page":1,"per_page":50,"total_pages":1,"count":1,"total_count":1},"success":true,"errors":[],"messages":[]}%
➜ curl -X GET "https://api.cloudflare.com/client/v4/accounts?per_page=50&page=2" \
-H "Authorization: Bearer MY_API_KEY" \
-H "Content-Type:application/json"
{"result":[{"id":"ACCOUNT_ID_1","name":"ACCOUNT_NAME_1","type":"standard","settings":{"enforce_twofactor":false,"api_access_enabled":null,"access_approval_expiry":null,"use_account_custom_ns_by_default":false,"default_nameservers":"cloudflare.standard","abuse_contact_email":null},"legacy_flags":{"enterprise_zone_quota":{"maximum":0,"current":0,"available":0}},"created_on":"2023-02-08T07:11:56.234700Z"}],"result_info":{"page":2,"per_page":50,"total_pages":1,"count":1,"total_count":1},"success":true,"errors":[],"messages":[]}%
➜ curl -X GET "https://api.cloudflare.com/client/v4/accounts?per_page=50&page=3" \
-H "Authorization: Bearer MY_API_KEY" \
-H "Content-Type:application/json"
{"result":[{"id":"ACCOUNT_ID_1","name":"ACCOUNT_NAME_1","type":"standard","settings":{"enforce_twofactor":false,"api_access_enabled":null,"access_approval_expiry":null,"use_account_custom_ns_by_default":false,"default_nameservers":"cloudflare.standard","abuse_contact_email":null},"legacy_flags":{"enterprise_zone_quota":{"maximum":0,"current":0,"available":0}},"created_on":"2023-02-08T07:11:56.234700Z"}],"result_info":{"page":3,"per_page":50,"total_pages":1,"count":1,"total_count":1},"success":true,"errors":[],"messages":[]}%
It appears that the page query parameter is not functioning as described in the API documentation.
To Reproduce
- Issue an account-scoped API token from Cloudflare.
- Use the token to call the /accounts endpoint using the API client.
- Attempt to fetch all accounts and append results to a list.
- On the first (and should be the only but it's not) page of results, check has_next_page().
- Observe that has_next_page() returns True, even though there are no additional pages.
Code snippets
results = []
cloudflare_client = Cloudflare(api_token=cloudflare_integration_config.api_token)
for cloudflare_client_result in cloudflare_client.accounts.list().iter_pages():
breakpoint()
results.append(cloudflare_client_result)
pprint(results)
results = []
cloudflare_client = Cloudflare(api_token=cloudflare_integration_config.api_token)
for cloudflare_client_result in cloudflare_client.accounts.list():
pprint(cloudflare_client_result)
results.append(cloudflare_client_result)
OS
macOS 15.3.2 (24D81)
Python version
3.12.9
Library version
4.1.0
Metadata
Metadata
Assignees
Labels
No labels