Skip to main content

A Python client for Notion API

Project description

notion-py

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

PyPI version 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 import NotionAsyncClient

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

    # 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.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.filters import TextPropertyFilter, CompoundFilter

# Type-safe query filters
filter = CompoundFilter.and_(
    TextPropertyFilter(property="Name", rich_text={"contains": "urgent"}),
    TextPropertyFilter(property="Status", rich_text={"equals": "In Progress"})
)

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

Domain Mapping

from notion_py.helper import NotionMapper, Field
from notion_py.requests.property_requests import (
    TitlePropertyRequest,
    StatusPropertyRequest,
)
from pydantic import BaseModel

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

class TaskMapper(NotionMapper[Task]):
    # Define field descriptors
    name_field = Field(
        notion_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 = Field(
        notion_name="ステータス",
        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."""
        return Task(
            id=notion_page.id,
            name=self.name_field.parse(notion_page.properties["タスク名"]),
            status=self.status_field.parse(notion_page.properties["ステータス"]),
        )

# Use the mapper
mapper = TaskMapper()
task = mapper.to_domain(notion_page)

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.6.tar.gz (75.3 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.6-py3-none-any.whl (95.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: notion_py_client-0.1.6.tar.gz
  • Upload date:
  • Size: 75.3 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.6.tar.gz
Algorithm Hash digest
SHA256 20735df0aced3355ad6b1d0cb7b553067a958346c61fab642c83279a1a526b02
MD5 74ee33f96006e1a0694d764eb3bf9cad
BLAKE2b-256 ae8e08ec83d3654a1193269be5fe037c16fa75e5cc2023a4477e60a07cfb850e

See more details on using hashes here.

Provenance

The following attestation bundles were made for notion_py_client-0.1.6.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.6-py3-none-any.whl.

File metadata

File hashes

Hashes for notion_py_client-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 a02462ec81811012fe3c6cc25d2a12fddab332cf2867e985382d0afe4b1c629e
MD5 2dcf20285b8e0d195041b77e79e0a7a2
BLAKE2b-256 51acd245a72f4c76bd6e9db8163d26fbbef461039a36b88bf13232f168bd283c

See more details on using hashes here.

Provenance

The following attestation bundles were made for notion_py_client-0.1.6-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