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

Uploaded Python 3

File details

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

File metadata

  • Download URL: notion_py_client-0.1.4.tar.gz
  • Upload date:
  • Size: 74.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for notion_py_client-0.1.4.tar.gz
Algorithm Hash digest
SHA256 0916d1ed6eae802a1c10fe8327218c59719e07d3ead0d0a8b3f1c0c54fd8c36b
MD5 ffcc09622892542be165454eba17adfc
BLAKE2b-256 ec93f3b288590617d6c903beb7c4ff8bc16da03c8714da560eb596f03740c052

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for notion_py_client-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 a9a7464a2a3db67b46fae0ef3b4620ba2b410370bf7e968bf0a663edd52d3266
MD5 96be71ceb05caa561e04305e456a14f6
BLAKE2b-256 7ec8848522dee3c4342d9d43dfa0f139f75e009af4cd32d8fd40b32d7fc3d5dc

See more details on using hashes here.

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