notion-client: Type-safe Haskell client for the Notion API

[ library, mit, program, web ] [ Propose Tags ] [ Report a vulnerability ]

This package provides comprehensive and type-safe bindings to the Notion API, providing both a Servant interface and non-Servant interface for convenience. . Read the README below for a fully worked usage example. . Otherwise, browse the Notion.V1 module, which is the intended package entrypoint.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1.0.0
Change log CHANGELOG.md
Dependencies aeson (>=2.2 && <2.3), base (>=4.15.0.0 && <5), base16-bytestring (>=1.0 && <1.1), bytestring (>=0.11 && <0.13), containers (>=0.6 && <0.8), cryptohash-sha256 (>=0.11 && <0.12), filepath (>=1.4 && <1.6), http-api-data (>=0.6 && <0.7), http-client-tls (>=0.3 && <0.4), notion-client, servant (>=0.20 && <0.21), servant-client (>=0.20 && <0.21), servant-multipart-api (>=0.12 && <0.13), servant-multipart-client (>=0.12 && <0.13), text (>=2.0 && <2.2), time (>=1.11 && <1.15), time-compat (>=1.9 && <1.10), unordered-containers (>=0.2 && <0.3), vector (>=0.13 && <0.14) [details]
Tested with ghc ==9.12.2
License MIT
Author Nadeem Bitar
Maintainer nadeem@gmail.com
Uploaded by shinzui at 2026-02-28T23:43:11Z
Category Web
Home page https://github.com/shinzui/notion-client
Bug tracker https://github.com/shinzui/notion-client/issues
Source repo head: git clone https://github.com/shinzui/notion-client.git
Distributions
Executables notion-client-example
Downloads 1 total (1 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for notion-client-0.1.0.0

[back to package description]

Notion API Client for Haskell

A type-safe Haskell client for the Notion API (version 2025-09-03).

Features

  • Type-safe API bindings using Servant
  • Comprehensive coverage of Notion API endpoints
  • Support for all Notion object types: Pages, Databases, Data Sources, Blocks, Users, etc.
  • Simple client interface with sensible defaults

Installation

Add to your package.yaml or .cabal file:

dependencies:
  - notion-client

Usage

Here's a simple example of retrieving a Notion page:

module Main where

import Notion.V1
import Notion.V1.Pages
import Data.Text qualified as Text
import System.Environment qualified as Environment

main :: IO ()
main = do
    token <- Environment.getEnv "NOTION_TOKEN"

    clientEnv <- getClientEnv "https://api.notion.com/v1"

    let Methods{ retrievePage } = makeMethods clientEnv (Text.pack token)

    page <- retrievePage "page-id-here"

    print page

Creating a page

import Notion.V1
import Notion.V1.Common (Parent(..))
import Notion.V1.Pages
import Data.Map qualified as Map
import Data.Aeson (toJSON)

createNewPage :: Methods -> IO PageObject
createNewPage Methods{createPage} = do
    let pageProperties = Map.fromList
            [ ("title", PropertyValue
                { type_ = Title
                , value = Just $ toJSON [-- rich text objects --]
                })
            ]

        newPage = mkCreatePage
            (DataSourceParent { dataSourceId = "data-source-id-here" })
            pageProperties

    createPage newPage

API Coverage

  • Databases: Create, retrieve, and update databases
  • Data Sources: Create, retrieve, update, and query data sources
  • Pages: Create, retrieve, and update pages
  • Blocks: Retrieve, update, append children, and delete blocks
  • Users: List, retrieve users and bot users
  • Search: Search for pages and data sources
  • Comments: Create and list comments
  • Webhooks: Event types and signature verification

Running the Example

The repository includes a comprehensive example in the notion-client-example directory that demonstrates how to use most API endpoints.

To run the example:

# Set required environment variables
export NOTION_TOKEN="your-integration-token"

# Optional: Set these if you want to test specific database/page endpoints
export NOTION_TEST_DATABASE_ID="your-database-id"
export NOTION_TEST_PAGE_ID="your-page-id"

# Run the example
cabal run notion-client-example

Obtaining API Credentials

  1. Create a Notion integration at https://www.notion.so/my-integrations
  2. Get your integration token from the integration settings
  3. Share any Notion pages or databases you want to access with your integration
    • Open the page/database in Notion
    • Click "Share" in the top right
    • Enter your integration name and click "Invite"
  4. Get the page/database IDs from their URLs:
    • Page URL: https://www.notion.so/Your-Page-Title-83715d7c1111424aaa11d7fc1111bd2a
    • Page ID: 83715d7c1111424aaa11d7fc1111bd2a (the last part of the URL)

License

BSD-3-Clause