Skip to main content
Version: Next

Error handling

When you use the Apify client, it automatically extracts all relevant data from the endpoint and returns it in the expected format. Date strings, for instance, are seamlessly converted to Python datetime.datetime objects. If an error occurs, the client raises an ApifyApiError. This exception wraps the raw JSON errors returned by the API and provides additional context, making it easier to debug any issues that arise.

Error subclasses

The Apify client provides dedicated error subclasses based on the HTTP status code of the failed response, so you can branch on error kind without inspecting status_code or type:

StatusSubclass
400InvalidRequestError
401UnauthorizedError
403ForbiddenError
404NotFoundError
409ConflictError
429RateLimitError
5xxServerError

All subclasses inherit from ApifyApiError, so an existing except ApifyApiError handler still catches every API error. Catch a specific subclass when you want to react differently to, for example, a missing resource or a rate-limit:

import asyncio

from apify_client import ApifyClientAsync
from apify_client.errors import ApifyApiError, NotFoundError

TOKEN = 'MY-APIFY-TOKEN'


async def main() -> None:
apify_client = ApifyClientAsync(TOKEN)

try:
# Try to list items from a non-existing dataset.
dataset_client = apify_client.dataset('non-existing-dataset-id')
dataset_items = (await dataset_client.list_items()).items
except NotFoundError:
# 404 — branch on a specific subclass when you want to react to it.
dataset_items = []
except ApifyApiError as err:
# Catch-all for every other API error.
print(f'API error: {err}')
dataset_items = []

print(f'Fetched {len(dataset_items)} items.')


if __name__ == '__main__':
asyncio.run(main())

For a complete list of error classes, see the ApifyApiError reference.