Skip to main content

A Python client for Notion API

Project description

notion-py-client

A type-safe Python client library for the Notion API, built with Pydantic v2.

PyPI version Downloads Monthly Downloads Python Version License: MIT

Features

  • Type-Safe: Complete type definitions using Pydantic v2
  • Async-First: Built on httpx for async/await support
  • API 2025-09-03: Latest Notion API with DataSources support
  • Comprehensive: All blocks, properties, filters, and request types
  • Domain Mapping: Built-in mapper for converting to domain models

Installation

pip install notion-py-client

Quick Start

import asyncio
from notion_py_client import NotionAsyncClient

async def main():
    client = NotionAsyncClient(auth="your_NOTION_API_TOKEN")

    # Query a database (API 2025-09-03)
    response = await client.dataSources.query(
        data_source_id="your_database_id"
    )

    for page in response.results:
        print(page.id, page.properties)

asyncio.run(main())

Notion API 2025-09-03

This library supports the latest Notion API version 2025-09-03, which introduces:

  • DataSources: New paradigm replacing the legacy databases endpoint
  • Backward Compatibility: Legacy databases endpoint still supported
  • Migration Path: Seamless transition from databases to dataSources

DataSources vs Databases

# New DataSources API (recommended)
await client.dataSources.query(data_source_id="...")

# Legacy Databases API (still supported)
await client.databases.query(database_id="...")

Both endpoints work identically, but dataSources is the future-proof choice.

Documentation

Full documentation is available at: https://higashi-masafumi.github.io/notion-py/

Core Capabilities

Pages

# Create a page
from notion_py_client.requests import CreatePageParameters, TitlePropertyRequest

await client.pages.create(
    parameters=CreatePageParameters(
        parent={"database_id": "your_database_id"},
        properties={
            "Name": TitlePropertyRequest(
                title=[{"type": "text", "text": {"content": "New Page"}}]
            )
        }
    )
)

Filters

from notion_py_client import NotionAsyncClient
from notion_py_client.filters import create_and_filter, create_or_filter

client = NotionAsyncClient(auth="your_NOTION_API_TOKEN")

# Simple filter (直接辞書 - IDE補完が効く)
response = await client.dataSources.query(
    data_source_id="your_database_id",
    filter={"property": "Status", "status": {"equals": "Active"}}
)

# AND filter with helper function (型安全 - IDE補完が効く)
filter = create_and_filter(
    {"property": "Name", "rich_text": {"contains": "urgent"}},
    {"property": "Status", "status": {"equals": "In Progress"}}
)

# OR filter with helper function
filter = create_or_filter(
    {"property": "Priority", "select": {"equals": "High"}},
    {"property": "Priority", "select": {"equals": "Medium"}}
)

# Nested filters (AND + OR)
filter = create_and_filter(
    {"property": "Team", "select": {"equals": "Engineering"}},
    create_or_filter(
        {"property": "Status", "status": {"equals": "Active"}},
        {"property": "Status", "status": {"equals": "Pending"}}
    )
)

await client.dataSources.query(
    data_source_id="your_database_id",
    filter=filter
)

Key Benefits:

  • IDE Completion: Type hints work correctly with dictionary literals
  • Type Safety: TypedDict definitions match official TypeScript SDK
  • No .model_dump(): Use filters directly without conversion
  • Public API Compatible: Follows official Notion API specification

Domain Mapping

from notion_py_client.helper import NotionMapper, NotionPropertyDescriptor, Field
from notion_py_client.requests.property_requests import (
    TitlePropertyRequest,
    StatusPropertyRequest,
)
from notion_py_client.responses.property_types import TitleProperty, StatusProperty
from pydantic import BaseModel

class Task(BaseModel):
    id: str
    name: str
    status: str

class TaskMapper(NotionMapper[Task]):
    # Define field descriptors with type annotations
    name_field: NotionPropertyDescriptor[TitleProperty, TitlePropertyRequest, str] = Field(
        notion_name="Name",
        parser=lambda p: p.title[0].plain_text if p.title else "",
        request_builder=lambda v: TitlePropertyRequest(
            title=[{"type": "text", "text": {"content": v}}]
        )
    )

    status_field: NotionPropertyDescriptor[StatusProperty, StatusPropertyRequest, str] = Field(
        notion_name="Status",
        parser=lambda p: p.status.name if p.status else "",
        request_builder=lambda v: StatusPropertyRequest(
            status={"name": v}
        )
    )

    def to_domain(self, notion_page):
        """Convert Notion page to domain model."""
        props = notion_page.properties
        return Task(
            id=notion_page.id,
            name=self.name_field.parse(props["Name"]),
            status=self.status_field.parse(props["Status"]),
        )

# Use the mapper
mapper = TaskMapper()
tasks = [mapper.to_domain(page) for page in response.results]

Requirements

  • Python >= 3.10
  • Pydantic >= 2.11.10

License

MIT License - see LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

notion_py_client-0.1.18.tar.gz (159.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

notion_py_client-0.1.18-py3-none-any.whl (109.7 kB view details)

Uploaded Python 3

File details

Details for the file notion_py_client-0.1.18.tar.gz.

File metadata

  • Download URL: notion_py_client-0.1.18.tar.gz
  • Upload date:
  • Size: 159.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for notion_py_client-0.1.18.tar.gz
Algorithm Hash digest
SHA256 5409ab22fb386625b33614685b20c43a749aec8f33f7d3613f40def80771c726
MD5 b5568c6043beba97076fc3c9586799f1
BLAKE2b-256 e23c5e7d958e392df8ae493b07a4d1bdb54f9b75b959295e6405746a403da91a

See more details on using hashes here.

Provenance

The following attestation bundles were made for notion_py_client-0.1.18.tar.gz:

Publisher: publish-to-pypi.yml on Higashi-Masafumi/notion-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file notion_py_client-0.1.18-py3-none-any.whl.

File metadata

File hashes

Hashes for notion_py_client-0.1.18-py3-none-any.whl
Algorithm Hash digest
SHA256 f47d1f7a1a4abf83eb4411c8e2948390efc34a4d6e21f3504e2ef97acd40d9f9
MD5 ddd70e6b37e1186e233229c231091131
BLAKE2b-256 9cd2056545d13130fcf7f388cdd32f24e861ab36e00c6374c56f1e2682a86c60

See more details on using hashes here.

Provenance

The following attestation bundles were made for notion_py_client-0.1.18-py3-none-any.whl:

Publisher: publish-to-pypi.yml on Higashi-Masafumi/notion-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page