Skip to main content

Notion SDK

Beta Release 🎉
Desenvolvido por Eduardo Riguetto

🎯 Visão Geral

SDK Python moderno e type-safe para a API Notion, com foco em Developer Experience (DX) e autocomplete perfeito.


✨ Principais Features

🔐 Autenticação Simplificada

  • Configuração centralizada via Notion() com suporte a múltiplas versões da API
  • Suporte para versões legacy (2022-06-28), data_sources (2025-09-03), ou personalizada
  • Headers gerenciados automaticamente via singleton pattern

🗄️ ORM Declarativo

  • Sistema de Mapeamento Declarativo: Defina schemas uma única vez com NotionDatabase
  • Type Hints Perfeitos: Autocomplete completo em IDEs (VSCode, PyCharm)
  • Transformers Customizáveis: Processe propriedades do Notion conforme necessário
  • Validators Integrados: Validação automática com Pydantic
  • Computed Fields: Campos calculados automaticamente a partir de outros campos
  • Registry Global: Acesso centralizado a todas as databases via DatabaseRegistry
  • Container Pattern: Organize suas databases com DatabasesContainer

📦 Repositories

Pages:

  • CreatePage - Criação de páginas com fluent interface
  • GetPage - Busca de páginas com mapeamento automático de schemas
  • GetPageProperty - Acesso direto a propriedades específicas

Databases:

  • CreateDatabasePage - Criação de páginas em databases com type safety
  • SearchPage - Queries avançadas com filtros e ordenação
  • SearchPageProperty - Busca de propriedades específicas em databases

🎨 Fluent Interface

await notion.orm.repo.pages.CreatePage()\
    .set_parent("database_id", "db_id")\
    .set_title("Name", "My Page")\
    .set_property.start_date("Date", datetime.now())\
    .set_property.number("Count", 42)\
    .call()

🔧 Features Avançadas

  • Generic Types: Tipagem forte com Generic/TypeVars para autocomplete perfeito
  • Property System: Sistema completo de setters para todos os tipos de propriedades
  • Query Builders: Construtores fluentes para filtros (QueryFilter) e ordenação (QuerySort)
  • Property Extractors: Extração automática de propriedades da API Notion
  • Property Parsers: Parse inteligente de respostas com suporte a tipos complexos
  • Property Accessors: Acesso tipado a propriedades de páginas
  • Configuração Global: Timezone e outras configs definidas via ORMConfig
  • Singleton Pattern: Client configurado globalmente, sem duplicação

🚀 Quick Start

from notion import Notion
from my_databases import MyContainer

# Configuração
notion: Notion[MyContainer] = Notion(
    api_token="secret_...",
    api_version="data_sources",
    orm_container=MyContainer,
    timezone="America/Sao_Paulo"
)

# Uso com autocomplete perfeito
con = notion.orm.repo.databases.container.tasks.SearchPage
result = await con\
    .set_filter(
        con.filter.checkbox("Done", "equals", False)
    )\
    .call()

# Acesso type-safe
for page in result.results:
    print(page.properties.myproperty)  # ← Autocomplete funciona!

📦 Configurando seu ORM

1. Defina seus Schemas

Crie schemas para suas databases do Notion usando NotionDatabase:

# my_databases/tasks.py

from notion.types.orm.databases import NotionDatabase
from pydantic import ConfigDict
from typing import Optional, List
from datetime import date, datetime
from decimal import Decimal

class TasksDb(NotionDatabase):
    
    model_config = ConfigDict(title="Notion_Databases_TasksDb")
    
    # Defina os campos do schema
    title: Optional[str]
    status: Optional[str]
    priority: Optional[str]
    tags: Optional[List[str]]
    due_date: Optional[date]
    assignee: Optional[str]
    completed: bool = False
    progress: Optional[int]
    estimated_hours: Optional[Decimal]
    actual_hours: Optional[Decimal]
    
    # Campos computed (não vêm do Notion, são calculados)
    is_overdue: Optional[bool] = None
    total_cost: Optional[Decimal] = None
    
    class NotionConfig:
        # ID da sua database no Notion
        database_id = "abc123def456"
        
        # Mapeie campos Python → Campos Notion
        mappings = {
            "title": "Title",
            "status": "Status",
            "priority": "Priority",
            "tags": "Tags",
            "due_date": "Due Date",
            "assignee": "Assignee",
            "completed": "Completed",
            "progress": "Progress",
            "estimated_hours": "Estimated Hours",
            "actual_hours": "Actual Hours"
        }
        
        # Transformers para processar valores
        transformers = {
            "status": lambda x: x["name"] if x else None,
            "priority": lambda x: x["name"] if x else None,
            "tags": lambda x: [t["name"] for t in x] if x else [],
            "assignee": lambda x: x[0] if x else None,
            "due_date": lambda x: x["start"] if x else None,
            "estimated_hours": lambda x: Decimal(str(x)) if x else None,
            "actual_hours": lambda x: Decimal(str(x)) if x else None
        }
        
        # Validators para garantir integridade dos dados
        validators = {
            "progress": lambda v: max(0, min(100, v)) if v else 0,  # Entre 0-100
            "estimated_hours": lambda v: v if v and v >= 0 else Decimal(0)  # Não negativo
        }
        
        # Computed fields calculados automaticamente
        computed = {
            "is_overdue": lambda obj: (
                obj.due_date < date.today() and not obj.completed
                if obj.due_date else False
            ),
            "total_cost": lambda obj: (
                obj.actual_hours * Decimal("50.00")  # $50/hora
                if obj.actual_hours else None
            )
        }

2. Crie seu Container

Organize todas as suas databases em um container:

# my_databases/__init__.py

from notion.types.orm.databases import Container, Registry, Client
from .tasks import TasksDb
from .projects import ProjectsDb  # Outras databases...

class MyDatabasesContainer(Container):
    """Container customizado com suas databases"""
    
    def __init__(self):
        # Registre todas as databases
        Registry.register(TasksDb)
        Registry.register(ProjectsDb)
        
        # Configure acesso tipado
        self.tasks: Client[TasksDb] = Client(TasksDb.id())
        self.projects: Client[ProjectsDb] = Client(ProjectsDb.id())

# Singleton para uso direto
databases = MyDatabasesContainer()

__all__ = ["MyDatabasesContainer", "databases"]

3. Configure a Integração

No seu main.py ou arquivo de inicialização:

from notion import Notion
from my_databases import MyDatabasesContainer

# Configure com seu container
notion = Notion(
    api_token="secret_...",
    api_version="data_sources",
    orm_container=MyDatabasesContainer,
    timezone="America/Sao_Paulo"
)

# Agora você tem autocomplete perfeito!
con = notion.orm.repo.databases.container.tasks.SearchPage
tasks = await con\
    .set_filter(
        con.checkbox("Completed", "equals", False)
    )\
    .call()

# Acesso type-safe aos dados
for task in tasks.results:
    print(f"📋 {task.properties.title}")
    print(f"Status: {task.properties.status}")
    print(f"Due: {task.properties.due_date}")

📚 Client API

Pages

  • get(page_id) - Buscar página por ID
  • get_property(page_id, property_id) - Buscar propriedade específica
  • update_properties(page_id, properties) - Atualizar propriedades de uma página
  • create(parent, properties) - Criar nova página

Databases

  • get(database_id) - Buscar informações de uma database
  • query(database_id, filter, sorts) - Query com filtros e ordenação
  • query_property(database_id, property_id) - Query propriedade específica
  • update(database_id, properties) - Atualizar schema de database

Blocks

  • get_children(block_id) - Buscar blocos filhos de um bloco/página

📖 Schemas Disponíveis

Responses:

  • pages.Page, pages.Parent - Estruturas de páginas
  • databases.Query - Resultados de queries
  • users.User, users.Person, users.Bot - Informações de usuários
  • errors.Error - Erros da API
  • pages.properties.RichText - Propriedade rich text

ORM:

  • NotionDatabase - Classe base para schemas customizados
  • DatabasesContainer - Container para organização de databases
  • SearchPageProperty - Schema para propriedades de busca
  • properties.RichText - Rich text para ORM

DTO:

  • Data Transfer Objects para comunicação interna

🏗️ Arquitetura

notion/
├── auth/               # Sistema de autenticação
├── client/             # HTTP clients por endpoint
│   ├── blocks.py       # Blocks API
│   ├── databases.py    # Databases API
│   └── pages.py        # Pages API
├── orm/
│   ├── accessors/      # Acesso tipado a propriedades
│   ├── common/         # QueryFilter, QuerySort, SetProperty
│   ├── config/         # Configurações globais do ORM
│   ├── extractors/     # Extração de propriedades da API
│   ├── mapping/        # Sistema declarativo (NotionDatabase)
│   ├── parsers/        # Parse de respostas da API
│   └── repositories/   # Camada de repositórios
│       ├── databases/  # Repositórios de databases
│       └── pages/      # Repositórios de pages
├── schemas/
│   ├── orm/            # Schemas do ORM
│   │   ├── database/   # DatabasesContainer, SearchPageProperty
│   │   └── properties/ # RichText e outros
│   └── responses/      # Schemas de respostas da API
│       ├── databases/  # Query
│       ├── errors/     # Error
│       ├── pages/      # Page, Parent, properties
│       └── users/      # User, Person, Bot
└── types/              # Type definitions e exports
    ├── orm/            # Types do ORM
    └── responses/      # Types de responses

📋 Dependências

  • Python >= 3.9
  • httpx - Requests HTTP assíncronos
  • pydantic >= 2.5 - Validação e serialização

🐛 Known Issues

  • Suporte parcial a tipos de propriedades (em desenvolvimento contínuo)
  • Documentação completa em progresso
  • Alguns endpoints da API Notion ainda não implementados

🔮 Roadmap

  • Support completo para Blocks API (criação e atualização)
  • Suporte completo a todos os tipos de propriedades Notion
  • Documentação completa com exemplos práticos
  • Testes unitários e de integração
  • Support para Comments API
  • Cache system para reduzir chamadas à API
  • Retry logic e rate limiting inteligente
  • CLI para geração automática de schemas a partir de databases

📄 Licença

MIT License - Veja LICENSE para detalhes


🙏 Agradecimentos

Desenvolvido com ❤️ por Eduardo Riguetto

Contribuições são bem-vindas! Sinta-se livre para:

  • 🐛 Reportar bugs via Issues
  • 💡 Sugerir features
  • 🔧 Abrir Pull Requests
  • 📖 Melhorar a documentação

Metadata

Release files for sdk-notion 0.1.0

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

Source distribution (sdist)

Source distribution for sdk-notion 0.1.0
File Size Uploaded Provenance Actions
sdk_notion-0.1.0.tar.gz 28.2 kB Without provenance Details for sdk_notion-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for sdk-notion 0.1.0
File Interpreter ABI Platform Actions
sdk_notion-0.1.0-py3-none-any.whl Python 3 none any Details for sdk_notion-0.1.0-py3-none-any.whl

Total release size: 69.1 kB

Release files / sdk_notion-0.1.0.tar.gz

Download URL sdk_notion-0.1.0.tar.gz
Size 28.2 kB
Tags Source
SHA-256 checksum
How to use checksums
b4ecc3ecf62442c1da5715039e5173160688f8c23b057c79406b414dd1b3b7f0
BLAKE2b-256 checksum
How to use checksums
0ae37f0bb2ee762e50f712a581a8b653e5aa2b817a58f51f5a781f474d7a03ce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / sdk_notion-0.1.0-py3-none-any.whl

Download URL sdk_notion-0.1.0-py3-none-any.whl
Size 40.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
feaa15b8f4b34b54f8520d2e0318d68187f42beaecd71e5123c1cf83ca15ab3b
BLAKE2b-256 checksum
How to use checksums
9f1236690e07180c6c2d6d2ec21e1a0a8232c2084bd921a15479db68308c8446
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Security for sdk-notion 0.1.0

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

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