Changelog¶
Unreleased¶
Version 0.10.1, 2026-06-28¶
- Fix: Populate the high-level children cache when constructing
TabsorColumnsdirectly, so an offline-built block exposes its tabs/columns (.tabs/.columns,has_children) and uploads its children instead of an empty container when pushed to Notion. Previously only the low-levelobj_refwas filled, contradicting the documented offline build-then-push workflow, issue #424.
Version 0.10, 2026-06-27¶
- New: Support tab blocks via the new
Tabsblock, which groups content into labeled tabs. Each tab is aParagraphwhose text is the tab label and whose children hold the tab content. Create tabs up front withTabs([...labels])or add them later withTabs.add_tab(), issue #188. - New: Support icons on tab labels (and paragraphs): read or write a paragraph's icon via the new
Paragraph.iconproperty (mirroringPage.icon), pass an optionalicontoTabs.add_tab(), and render it inTabs.to_markdown(), issue #421. - New: Support the
Heading4block introduced by the Notion API (March 30, 2026 changelog), mirroringHeading1/Heading2/Heading3and rendering as a level-5 markdown heading, issue #405. - New: Lock or unlock pages, data sources, and databases for editing via the writable
Page.is_locked,DataSource.is_locked, andDatabase.is_lockedproperties, and move a data source to a different parent database withDataSource.move(). Enabled by the Notion API version 2025-09-03, issue #402. - New: Better logging of model validation errors, issue #152.
-
Breaking: Adopt the Notion API version 2025-09-03, which splits the former "database" into two concepts: a data source (holds the schema and pages) and a database (a container of one or more data sources), issue #118. This requires
notion-client~=2.7.0and renames much of the high-level API. To migrate:- The former
Databaseclass (schema + pages) is nowDataSource. The nameDatabasenow refers to the new container; access its data sources viaDatabase.data_sources. - Rename these calls:
Session.search_db()→search_ds(),Session.create_db()→create_ds(),Session.get_or_create_db()→get_or_create_ds(),Schema.bind_db()→bind_ds(), andPage.parent_db→Page.parent_ds. Session.get_db()still exists but now returns the newDatabasecontainer; useSession.get_ds()to get whatget_db()returned before (a single data source).- The
db_title=anddb_id=arguments onSchemasubclasses are unchanged.
- The former
-
Fix: Capture the read-only
block_typefield Notion sends on unsupported blocks (e.g. button or AI blocks), which previously raised a pydanticValidationErroron dev/CI installs (extra='forbid') and made the whole children list — including sibling blocks after the unsupported one — inaccessible, issue #356.
Version 0.9.11, 2026-06-24¶
- New: Export the user-facing icon subtypes
BuiltInIconandCustomEmojifrom the top-level package, alongside the already-exportedEmoji, so icons returned byPage.icon/DataSource.icon/Database.iconcan be narrowed withisinstancewithout reaching intoultimate_notion.emoji, issue #353. - Fix: Skip the two-way relation backward rename in
Relation._update_bwd_relwhen no backward name is defined, instead of attemptingRenameProp(name=None)and raising a pydanticValidationError, issue #325. - Fix: Raise a clear
UnsetErrorfromBot.workspace_infowhen the workspace name or id is unavailable (i.e. for any bot other than the integration's own), instead of an opaque pydanticValidationError, issue #326. - Chg: Replace
hasattr-based checks inobj_api.corewith type-safe alternatives (a structural pattern match onUniqueObjectinObjectRef.build, a typedClassVarsentinel for theUnsetTypesingleton, and aNone-defaultedClassVarsentinel for theTypedObject._typemapregistry). - Chg: Replace the
hasattr-basedProperty._is_initcheck with aNone-defaulted sentinel forWrapper._obj_ref, so initialization is an explicitis not Nonecheck that the type checker understands. - Chg: Make
_Nodegeneric in its wrapped type and pinchildrentolist[_Node[Block]], encoding the invariant that only a root node wraps aPagewhile every child wraps aBlock, so building child obj_refs no longer needs to launder the element type, issue #339.
Version 0.9.10, 2026-06-24¶
- Fix: Split deeply-nested block trees reconstructed via
Block.wrap_obj_ref()from serialized JSON into Notion-compliant requests onappend(). Children carried inobj_ref.value.children(wherehas_childrenisFalse) were previously left untouched by the chunker and sent in a single over-nested request, which Notion rejected with a 400, issue #305.
Version 0.9.9, 2026-06-23¶
- Fix: Accept Notion's built-in (icon gallery) icons, which use the
iconsub-type with anameandcolorand previously broke loading any page/database (and cascaded intosearch/list endpoints) that used one, issue #295. - Fix: Omit the read-only
is_archivedfield from nested block children when appending a block hierarchy, which previously leaked into the children and was rejected by the Notion API, issue #291. - Chg: Validate polymorphic
TypedObjectsub-types and user references on construction, and wrap any resulting PydanticValidationErrorwith contextual information about the failing type, issue #152. - Fix: Accept the undocumented
in_trashfield the Notion API sends onfile_uploadobjects, which previously broke every file upload in development mode, issue #299.
Version 0.9.8, 2026-06-22¶
- Fix: Tolerate page/database objects that omit
properties, which thesearchendpoint returns for stripped-down records (e.g. trashed or limited-access pages) and which previously brokesearch_page()/search_db(), issue #273.
Version 0.9.7, 2026-06-22¶
- Fix: Add support for
pydantic2.13, which previously broke parsing of Notion user objects (e.g. people properties), issue #189. - Fix: Accept the new
is_archivedfield the Notion API sends on pages and databases, which previously brokesearch_page()/search_db()in development mode, issue #202. - Fix: Accept the nullable
iconfield returned for paragraph blocks and omit read-only archive fields when creating blocks.
Version 0.9.6, 2025-11-23¶
- New: Add the new
Placedatabase/source property. - Fix: Allow to bind a schema with a two-way target property to an existing database, issue #134.
- Fix:
session.get_page(PAGE)no longer fails if parent ofPageis not accessible by the integration, issue #135. - Fix: Added
BGColortype annotation for color parameter intext()andText, issue #140. - Chg: Add
coveranditemparameters toPagesEndpoint.create()andSession.create_page(), issue #144. - New: Add method
Page.update_props()to allow updating multiple properties of a page at once from the high level API. - Chg: Alter
PagesEndpoint.update()method signature to includecover,itemandin_trashparameters, issue #144. - Fix: Have a nicer CLI output in case of an exception.
- Fix: Determing the correct mime type of a file, which is now done using
mimetypesinstead offiletypes, issue #141. - New: Add the new
workspace_idfield to theBot. - Fix: Unify texts locally the same way as remote, which is necessary for comparison, issue #136 & #160.
- Fix: Resolution of polymorphic
TypedObject, which led to wrong schema inference, issue #134. - Fix: Resolution of user reference in mention object, issue #166.
- Chg: Removed the low level
UnknownUserobject as it is just aUserRef, issue #166. - Fix: Uploading a file via an import URL was cast to a
Noneinstead ofFileImportSuccess. - Chg: Return
FileUploadStatusinUploadedFile.file_import_resultfor easier usage. - Fix: All objects are no longer
hashable as they are mutable and thus the former behaviour was semantically incorrect. - Fix: Comparison of off-/online
MentionObjects works, also whenUserRefor anObjectRefto a page is used, issue #170. - Fix: An
Unsetannotations(e.g. a mention built withstyle=None) now compares equal to the defaultAnnotationsreturned by the Notion API, issue #174.
Version 0.9.5, 2025-10-24¶
- Fix: Pin
notion-sdk-pyto version 2.5 as version 2.6 has breaking changes, issue #153.
Version 0.9.4, 2025-10-01¶
- Chg: Allow the creation of a unique ID property, which is now supported by the Notion API.
- New: Allow changing the prefix of a unique ID property.
- Chg: The
reload()method of a database has arebind_schemaproperty, which is activated by default. - Doc: Updated the Getting started docs to the current version of Notion.
- Doc: Updated the Configuration docs.
Version 0.9.3, 2025-09-26¶
- Fix: Map file type
audio/x-wavtoaudio/wavand add amime_typeparameter toupload, issue #127.
Version 0.9.2, 2025-09-25¶
- New: Add new
is_lockedproperty to show if a page is locked or not. - Fix: Pagination when appending block children no longer leads to repeated appendings.
- Fix: Assembling a hierarchy of blocks offline and appending it will result in automatic batching adhering to the Notion API limits, issue #119, #120.
- Fix: Appended blocks are now added to session cache.
- New: Added support for the Notion audio block, issue #123.
- New: Allow comparing offline blocks to the ones synchronized to Notion, issue #124.
Version 0.9.1, 2025-09-03¶
- Fix: Add missing link mention object, which led to an exception.
- Fix: Linked databases are handled as
ChildDatabaseobjects and no longer resolved, issue #110. - Chg: Have a
Userhierarchy withBot,Person, etc. to reflect the actual Notion API. - Doc: Completed missing parts in the documentation and example for file uploads.
- New: Allow uploading and appending a file as block to a page via the CLI.
- Fix: Fix user mention problem, which was caused by a Notion API change.
Version 0.9, 2025-09-01¶
First Beta release:
- New: Allow updating if a database is inline or not, issue #80.
- Chg:
create_dbhas atitleparameter to set a title if no schema is used or needs to be overwritten. - Chg: Removed
from_dictclass method ofSchemasince this can now be more easily done manually. - Chg: Unify
PropertyandPropertyTypeto simplify declarative approach to schemas, issue #81. - Fix: Possible collision of attribute names in
PageandSchema, issue #86. - Fix: Wrong equality check between properties as well as property values.
- New: Bind a schema automatically with
bind_schema()ifdb_idordb_titleis set in theSchema. - Chg: Consistently return
Nonefor title, description, caption if these are not set instead of an empty string. - Fix: More strict typing and checks which led to many small bug fixes in edge cases, e.g. issue #96.
- Fix: Too strict dependencies that too often lead to conflicts with other packages, e.g. issue #90.
- New:
unocommand line interface to show the current resolved config and integration info. - New: Allow offline assembly of blocks to create a page with content in one call, issue #94.
- Fix: Different blocks now have a different hash, equality works as expected, issue #100.
- Fix: Retrieve a page object even without access access to the parent database, issue #103.
- Chg: Renamed
FileInfotoAnyFileand have several subtypes likeUploadedFile, etc. - New: Added
file_upload,import_urlandlist_uploadsto support the file upload endpoints, issue #71.
Version 0.8, 2025-06-23¶
- New: Added support for creating inline databases by Tzumx
- Chg: Have a proper hierarchy of Ultimate Notion exception classes.
- New: The schema of a database provides a
to_pydantic_modelclass for evaluating input. - New: More schema validations like checking for a title property and distinct property names.
- Fix: Fix error when setting a (multi-)select option with no color specified.
- New: Added a button property value.
- New: Added support for Polars, i.e.
to_polarsmethod of database views, issue #55. - New: Add support for custom emoji icons, issue #70.
- Chg: Return
Noneinstead of an empty string""when a text property or block is unset, issue #59. - New: Setting the width ratios of page columns is supported, issue #74.
- Fix: Adding a column with
add_column(index)at a given index is no longer off by 1. - Add: Updating a database schema, i.e. adding/removing properties or changing their types, issue #76.
- Add: Changing database properties, e.g. name, formula of formula property, options, etc, issue #77.
- Add: Added the
display_namefield of comments
Version 0.7.1, 2025-01-05¶
- Fix: Added missing tomli dependency, issue #62.
- Fix: Support button property of databases to fix error when retrieving a page or database, issue #63.
Version 0.7, 2024-12-10¶
- New: Reading and inserting comments is implemented.
- Chg:
SListis part of the public API now, i.e. is in theultimate_notionnamespace. - Fix: Added missing
link_to_pagesubtypecomment_id. - Chg: Remove
Textas direct import, usetextinstead. - Chg:
.propsnamespace of a page now behaves like a mapping, i.e. read-only dictionary. - Fix: Added missing
.valuefunction of severalPropertyValues. - Add: Page method
get_propertyto allow fetching a single property without reloading the whole page. - Fix: Resolving page properties correctly if they contain more than 25 references.
- Fix:
PropertiesEndpoint.retrievenow actually works and either returns a single property item or a list. - Chg: Renamed
db.fetch_all()todb.get_all_pages(). - New: Query databases with a PySpark/Polars inspired DSL, e.g.
uno.prop('Name') == 'Linus Torvalds', implemented. - Fix: Database pages created with
db.create_pageare now added to the session cache. - New: Easily activate a debug mode within the config file.
- Fix: Rollup property defined on a self-referencing relation works now.
- Doc: Added a page about querying a database.
- Chg: Renamed property types
PeopletoPersonandPhoneNumbertoPhone.
Version 0.6, 2024-09-28¶
- New: Also use the session cache for blocks.
- New: Properties of blocks can be updated.
- Fix:
has_childrendoesn't return a wrong value anymore for pages and databases. - Fix: Several issues with blocks and duplicated but ID-equivalent objects.
- Chg: Simplified dealing with rich texts by introducing
text,mentionandmath. - Chg: Children of pages are proper pages/databases instead of
ChildPage/ChildDatabase. - Chg: Renamed
PageSchematoSchema. - Chg: Accessing the properties of a page directly returns the primitive data types.
- Chg: Completely reworked the functionality of the
Tableblock for more consistency and easier usage.
Version 0.5.1, 2024-08-09¶
- Fix: Added type
unknownin user data to generateUnknownUser, issue #39.
Version 0.5, 2024-08-07¶
- New: Method
page.appendto append content to a page. Creation of blocks is supported! - New: Documentation on how to create the content of a page.
- New: More robustness with respect to Notion API changes.
- New: High-level method
session.get_blockto retrieve a single block. - Chg: Internally,
archivedproperty was renamed toin_trash. - Chg: Renamed
.contentto.childrenof a page for more consitency. - Chg: Use
Propertyagain to consistently refer to the columns of a database. - Chg: Make use of pendulum to represent
DateRangevalues. - Chg: Renamed
page.databasetopage.parent_dbandpage.in_dbadded as methods. - Chg: Large restructering of the code base.
- Chg: Return
Nonefor various string attributes/properties if no string is set for consistency.
Version 0.4, 2024-02-14¶
- New: Introduced a configuration file under
~/.ultimate-notion/config.toml. - New: Added a simple Google Tasks client.
- New: Added a general sychronization task for Notion to other services.
- New: Added a specific Google Tasks synchronization task.
- Fix: A page property can be deleted by setting it to
None. - Chg: Reworked the testing setup to use VCR.py more efficiently and be more robust.
- Fix: Tons of fixes within blocks and general page content.
- Chg:
to_markdown()now uses an internal implementation instead ofnotion2md.
Version 0.3, 2023-12-26¶
- Chg:
RichTextis now a subtype ofstrfor a more convenient & consistent usage. - Doc: Added more documentation about using databases.
- Chg:
iconattribute of database now returnsEmojiinstead ofstr. - New: Allow setting the
iconandcoverattribute of a page. - New: Allow setting the
titleof a non-database page. - Fix:
created_byandlast_edited_byreturn properUserobject.
Version 0.2, 2023-12-19¶
- Fix: Notion API's undocumented
descriptionofSelectOptionadded. - New: Navigate pages using
parentandchildren. - Chg: Rename
parentstoancestors. - Fix: Wrong return value of PropertyType
Status.value. - Chg: Make
showconsistent for Page, View, PageSchema. - Ref: Refactor
valueinPropertyValue. - Ref: Reduce unnecessary funtionality of
Number, usevalueinstead.
Version 0.1, 2023-12-16¶
- First official alpha release.