Skip to main content

Strapi Client

PyPI Python CI Docs

Interact with Strapi from Python using the REST API

Requirements

  • Python 3.11+
  • A running Strapi instance (public or self-hosted)

Installation

From PyPI:

pip install strapi-client

or

uv add strapi-client

Documentation

Full API Reference

Examples

Quick start (sync version):

from strapi_client import StrapiClient

with StrapiClient(base_url="YOUR_STRAPI_URL", token="YOUR_STRAPI_TOKEN") as client:
    # await strapi.authorize(identifier='user_identifier', password='user_password')  # Optional
    users = client.get_documents("users", filters={"username": {"$eq": "Pavel"}})
    user_id = users.data[0]["documentId"]
    client.update_document("users", user_id, data={"username": "Mark"})

Quick start (async version):

import asyncio
from strapi_client import StrapiClientAsync


async def main():
    async with StrapiClientAsync(base_url="YOUR_STRAPI_URL", token="YOUR_STRAPI_TOKEN") as client:
        # await strapi.authorize(identifier='user_identifier', password='user_password')  # Optional
        users = await client.get_documents("users", filters={"username": {"$eq": "Pavel"}})
        user_id = users.data[0]["documentId"]
        await client.update_document("users", user_id, data={"username": "Mark"})


asyncio.run(main())

Quick start with SmartDocument ORM

import asyncio
from strapi_client import LocalizedSmartDocument, MediaImageDocument, SmartDocument, StrapiClientAsync


class User(SmartDocument):
    __singular_api_id__ = "user"
    username: str
    first_name: str
    photo: MediaImageDocument


class Session(SmartDocument):
    uid: str
    user: User | None


class Article(LocalizedSmartDocument):
    title: str


async def main():
    async with StrapiClientAsync(base_url="YOUR_STRAPI_URL", token="YOUR_STRAPI_TOKEN") as client:
        # Get with relations and media by ID
        user1 = await User.get_document(client, document_id="YOUR_DOCUMENT_ID")
        print(user1.photo)

        # List documents with automatic population
        sessions = await Session.get_documents(client, sort=["created_at"])
        for session in sessions:
            print(session.user.photo if session.user else "No user")

        # Find one document
        user1 = await User.get_first_document(client, filters={"username": "Mark"})
        if user1:
            print(user1)

        # Localized documents keep their locale for refresh, update, and delete operations
        article = await Article.get_document(client, document_id="YOUR_DOCUMENT_ID", locale="fr")
        await article.update_document(client, {"title": "Bonjour"})


asyncio.run(main())

Quick start with ActiveDocument ORM (experimental)

Relations and upserts are supported in experimental mode.

import asyncio
from strapi_client import StrapiClientAsync, ActiveDocument, DocumentField


class User(ActiveDocument):
    username: str = DocumentField(unique=True)
    first_name: str


class Session(ActiveDocument):
    uid: str = DocumentField(unique=True)
    user: User | None = DocumentField(default=None, relation=True)


async def main():
    async with StrapiClientAsync(base_url="YOUR_STRAPI_URL", token="YOUR_STRAPI_TOKEN") as client:
        # Update existing document
        user1 = await User.get_document(client, document_id="YOUR_DOCUMENT_ID")
        user1.first_name = "Mark"
        await user1.update_document(client)

        # Create or update document with relation
        session1 = await Session(uid="123", user=user1).upsert_document(client)
        await session1.refresh(client)  # populate fields from Strapi

        # Create and delete document
        user2 = await User(username="pavel", first_name="Pavel").create_document(client)
        await user2.delete_document(client)


asyncio.run(main())

Development

Create new release

Push changes to 'main' branch following Conventional Commits.

Update documentation

docs folder is being updated automatically by GitHub Actions when source files are changed.

Metadata

Release files for strapi-client 5.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for strapi-client 5.2.1
File Size Uploaded
strapi_client-5.2.1.tar.gz 15.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for strapi-client 5.2.1
File Interpreter ABI Platform
strapi_client-5.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 40.3 kB

Release files / strapi_client-5.2.1.tar.gz

Download URL strapi_client-5.2.1.tar.gz
Size 15.4 kB
Tags Source
SHA-256 checksum
How to use checksums
bfeb4471643495fd3734f7302ad2846c9f3ae65a0dd14b3ec0e0ac248c65ea29
BLAKE2b-256 checksum
How to use checksums
e5339f76791cc91ec8477f45a9038882dd98a36da8e46cc390393e35aa7dc3b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release files / strapi_client-5.2.1-py3-none-any.whl

Download URL strapi_client-5.2.1-py3-none-any.whl
Size 24.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
726babec7107f95ae8d261984d9236856da28ef63a0ceddd01ab8b73719dffde
BLAKE2b-256 checksum
How to use checksums
52d507b24f4e3d364836cb3a084afb45db32834ca9cb37f6799fe09e7718b56a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

5.2.1 This release

2 release files

5.2.0

2 release files

5.1.0

2 release files

5.0.6

2 release files

5.0.5

2 release files

5.0.4

2 release files

5.0.3

2 release files

5.0.2

2 release files

5.0.1

2 release files

5.0.0

2 release files

4.2.1

2 release files

4.2.0

2 release files

4.1.6

2 release files

4.1.5

2 release files

4.1.4

2 release files

4.1.3

2 release files

4.1.2

2 release files

4.1.1

2 release files

4.1.0

2 release files

4.0.0

2 release files

3.10.1

2 release files

3.10.0

2 release files

3.9.0

2 release files

3.8.0

2 release files

3.7.4

2 release files

3.7.3

2 release files

3.7.2

2 release files

3.7.1

2 release files

3.7.0

2 release files

3.6.0

2 release files

3.5.1

2 release files

3.5.0

2 release files

3.4.0

2 release files

3.3.0

2 release files

3.2.1

2 release files

3.2.0

2 release files

3.1.0

2 release files

3.0.3

2 release files

3.0.2

2 release files

2.9.1

2 release files

2.9.0

2 release files

2.8.0

2 release files

2.7.0

2 release files

2.6.1

2 release files

2.6.0

2 release files

2.5.0

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page