Skip to content

Repository files navigation

Apify API client for Python

The official Python client for the Apify REST API.

PyPI versionPyPI downloadsPython versionsBuild statusCoverageLicenseChat on Discord

apify-client lets you talk to the Apify platform from Python — run Actors, manage storages (datasets, key-value stores, request queues), schedule tasks, configure webhooks, and use everything else exposed by the Apify API. It ships both synchronous and asynchronous clients, fully typed responses, automatic retries with exponential backoff, tiered timeouts, pagination helpers, streaming, and a pluggable HTTP layer.

If you want to build Apify Actors in Python rather than consume the API, use the Apify SDK for Python instead — it bundles this client and adds Actor-side primitives.

Table of contents

Installation

apify-client requires Python 3.11 or higher and is published on PyPI and conda-forge.

  • From PyPI, it can be installed for example with pip:

    pip install apify-client

    or with uv:

    uv add apify-client

    or any other Python package manager that consumes PyPI.

    The client compresses request bodies with gzip by default (no extra dependencies required). To opt in to brotli (better compression ratio), install the optional extra and pass compression='brotli':

    pip install "apify-client[brotli]"# or
    uv add "apify-client[brotli]"
  • From conda-forge, it can be installed with conda:

    conda install conda-forge::apify-client

Quick start

You'll need an Apify API token — find yours in the Integrations section of Apify Console. Pass it to the client and you're ready to go.

Synchronous client

fromapify_clientimportApifyClientclient=ApifyClient('MY-APIFY-TOKEN')
# Start an Actor and wait for it to finish.run=client.actor('apify/hello-world').call(
run_input={'message': 'Hello, Apify!'},
)
ifrunisNone:
raiseRuntimeError('Actor run was not found.')
# Iterate items from the run's default dataset.foriteminclient.dataset(run.default_dataset_id).iterate_items():
print(item)

Asynchronous client

importasynciofromapify_clientimportApifyClientAsyncasyncdefmain() ->None:
client=ApifyClientAsync('MY-APIFY-TOKEN')
run=awaitclient.actor('apify/hello-world').call(
run_input={'message': 'Hello, Apify!'},
)
ifrunisNone:
raiseRuntimeError('Actor run was not found.')
# Iterate items from the run's default dataset.asyncforiteminclient.dataset(run.default_dataset_id).iterate_items():
print(item)
asyncio.run(main())

Keep your token secret. It authorizes requests on your behalf and can incur usage costs. Never commit it to source control or expose it to client-side code.

For a guided walkthrough — authenticating, running an Actor, and reading its results — see the Quick start guide.

Features

  • Synchronous and asynchronous clients — pick ApifyClient or ApifyClientAsync to match your codebase; both expose the same API (Asyncio support).
  • Fully typed responses — every method returns a Pydantic model generated from the Apify OpenAPI spec, with IDE autocomplete and runtime validation (Typed models).
  • Automatic retries — exponential backoff for network errors, HTTP 429, and 5xx responses, configurable per client (Retries).
  • Tiered timeouts — short / medium / long tiers picked per endpoint, overridable per call (Timeouts).
  • Pagination and streaming — iterate datasets, key-value store keys, or live logs without manual paging or buffering (Pagination, Streaming).
  • Convenience methodscall(), wait_for_finish(), nested resource access, and other shortcuts that hide platform quirks (Convenience methods).
  • Pluggable HTTP layer — swap the default Impit-based HTTP client for httpx, requests, aiohttp, or any custom implementation (Custom HTTP clients).
  • Structured errors — every API error surfaces as an ApifyApiError with HTTP-specific subclasses for precise handling (Error handling).
  • Debug logging — opt-in structured logging on the apify_client logger captures request URLs, status codes, retry attempts, and more (Logging).

Usage examples

The client mirrors the platform's resource model. Each entry point returns either a single-resource client for an individual item or a collection client for listing and creating items (Single and collection clients).

List Actors and create one

actors=client.actors()
print(actors.list(limit=10).items)
new_actor=actors.create(name='my-actor')

Stream live logs while a run is in progress

run=client.actor('apify/web-scraper').start(run_input={...})
withclient.run(run.id).log().stream() aslog_stream:
forchunkinlog_stream.iter_bytes():
print(chunk.decode(), end='')

Read and write key-value store records

store=client.key_value_store('STORE-ID')
store.set_record('greeting', {'message': 'Hello!'})
record=store.get_record('greeting')

Iterate dataset items with automatic pagination

foriteminclient.dataset('DATASET-ID').iterate_items(fields=['title', 'url']):
process(item)

Tune retries and timeouts

fromdatetimeimporttimedeltafromapify_clientimportApifyClientclient=ApifyClient(
token='MY-APIFY-TOKEN',
max_retries=8,
min_delay_between_retries=timedelta(milliseconds=500),
timeout_long=timedelta(minutes=10),
)

For end-to-end recipes — passing input, managing tasks for reusable input, retrieving and merging Actor data, integrating with Pandas, plugging in a custom HTTP client — see the Guides.

Documentation

The full documentation lives at docs.apify.com/api/client/python.

SectionWhat you'll find
IntroductionOverview, prerequisites, and a tour of the client.
Quick startAuthenticate, run an Actor, and fetch its results step by step.
ConceptsAsyncio, single vs. collection clients, nested clients, error handling, retries, logging, convenience methods, pagination, streaming, custom HTTP clients, timeouts.
GuidesPass input to an Actor, manage tasks for reusable input, retrieve Actor data, integrate with data libraries (e.g. Pandas), use HTTPX as the HTTP client.
UpgradingMigrating between major versions.
API referenceGenerated reference for every class, method, and model.
ChangelogRelease history and breaking changes.

Related projects

Support and community

Contributing

Bug reports, fixes, and improvements are welcome! See CONTRIBUTING.md for the development setup, coding standards, testing, and the release process. The repo uses uv for project management and Poe the Poet as a task runner; the typical loop is:

uv run poe install-dev # install dev deps and git hooks
uv run poe check-code # lint, type-check, unit tests, docstring check

License

Released under the Apache License 2.0.

About

Apify API client for Python—Programmatically run Actors, manage and stream data from storages (datasets, key-value stores, request queues), schedule and monitor runs, and access the full Apify platform API. Sync and async interfaces with automatic retries and pagination.

Topics

Resources

Contributing

Stars

97 stars

Watchers

8 watching

Forks

Releases

Packages

Used by

Contributors

Languages