name: notion-api description: > Cette compétence fournit des instructions complètes pour interagir avec l'API Notion via des appels REST. Cette compétence doit être utilisée chaque fois que l'utilisateur demande d'interagir avec Notion, y compris la lecture, la création, la mise à jour ou la suppression de pages, de bases de données, de blocs, de commentaires ou de tout autre contenu Notion. La compétence couvre l'authentification, tous les endpoints disponibles, la pagination, la gestion des erreurs et les bonnes pratiques.
tags: [productivity, agent-skills, notion-api, api, writing, notion] ---|-------| | Éléments de bloc maximum par payload | 1000 | | Taille maximale du payload | 500 KB | | Contenu texte enrichi | 2000 caractères | | URLs | 2000 caractères | | Équations | 1000 caractères | | Adresses e-mail | 200 caractères | | Numéros de téléphone | 200 caractères | | Options multi-sélection | 100 éléments | | Relations | 100 pages associées | | Mentions de personnes | 100 utilisateurs | | Tableaux de blocs par requête | 100 éléments |
Confirmation pour les opérations destructrices
IMPORTANT : Avant d'exécuter une opération qui modifie ou supprime des données, demandez la confirmation à l'utilisateur. Cela inclut :
- La mise à jour de pages ou de blocs
- La suppression/archivage de pages ou de blocs
- La modification de schémas de base de données
- La création de pages (si plusieurs ou en lot)
- Toute opération en masse
Pour un groupe logique d'opérations connexes, une seule confirmation suffit.
Endpoints API principaux
Recherche
Rechercher dans toutes les pages et bases de données accessibles :
curl -s -X POST "https://api.notion.com/v1/search" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"query": "search term",
"filter": {"property": "object", "value": "page"},
"sort": {"direction": "descending", "timestamp": "last_edited_time"},
"page_size": 100
}' | jq
Valeurs de filtre : "page" ou "data_source" (ou omettre pour les deux)
Pages
Récupérer une page
curl -s "https://api.notion.com/v1/pages/{page_id}" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" | jq
Remarque : Cela retourne les propriétés de la page, pas le contenu. Pour le contenu, utilisez « Récupérer les enfants de bloc » avec l'ID de la page.
Créer une page
curl -s -X POST "https://api.notion.com/v1/pages" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"parent": {"page_id": "parent-page-id"},
"properties": {
"title": {
"title": [{"text": {"content": "Page Title"}}]
}
},
"children": [
{
"object": "block",
"type": "paragraph",
"paragraph": {
"rich_text": [{"type": "text", "text": {"content": "Paragraph content"}}]
}
}
]
}' | jq
Options parent :
{"page_id": "..."}- Créer sous une page{"database_id": "..."}- Créer dans une base de données (hérité){"data_source_id": "..."}- Créer dans une source de données (API v2025-09-03+)
Mettre à jour une page
curl -s -X PATCH "https://api.notion.com/v1/pages/{page_id}" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"properties": {
"title": {"title": [{"text": {"content": "Updated Title"}}]}
},
"icon": {"type": "emoji", "emoji": "📝"},
"archived": false
}' | jq
Options de mise à jour supplémentaires : cover, is_locked, in_trash
Archiver (supprimer) une page
curl -s -X PATCH "https://api.notion.com/v1/pages/{page_id}" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{"archived": true}' | jq
Récupérer un élément de propriété de page
Pour les propriétés avec plus de 25 références :
curl -s "https://api.notion.com/v1/pages/{page_id}/properties/{property_id}" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" | jq
Blocs (contenu de page)
Récupérer les enfants de bloc
curl -s "https://api.notion.com/v1/blocks/{block_id}/children?page_size=100" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" | jq
Utilisez l'ID de la page comme block_id pour obtenir le contenu de la page. Vérifiez has_children sur chaque bloc pour le contenu imbriqué.
Ajouter des enfants de bloc
curl -s -X PATCH "https://api.notion.com/v1/blocks/{block_id}/children" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"children": [
{
"object": "block",
"type": "heading_2",
"heading_2": {
"rich_text": [{"type": "text", "text": {"content": "New Section"}}]
}
},
{
"object": "block",
"type": "paragraph",
"paragraph": {
"rich_text": [{"type": "text", "text": {"content": "Content here"}}]
}
}
]
}' | jq
Maximum 100 blocs par requête, jusqu'à 2 niveaux d'imbrication.
Options de position dans le corps de la requête :
- Défaut : ajoute à la fin
"position": {"type": "start"}- Insérer au début"position": {"type": "after_block", "after_block": {"id": "block-id"}}- Insérer après un bloc spécifique
Récupérer un bloc
curl -s "https://api.notion.com/v1/blocks/{block_id}" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" | jq
Mettre à jour un bloc
curl -s -X PATCH "https://api.notion.com/v1/blocks/{block_id}" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"paragraph": {
"rich_text": [{"type": "text", "text": {"content": "Updated content"}}]
}
}' | jq
La mise à jour remplace la valeur entière du champ spécifié.
Supprimer un bloc
curl -s -X DELETE "https://api.notion.com/v1/blocks/{block_id}" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" | jq
Déplace le bloc à la corbeille (peut être restauré).
Bases de données
Récupérer une base de données
curl -s "https://api.notion.com/v1/databases/{database_id}" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" | jq
Retourne la structure de la base de données y compris les sources de données et les propriétés.
Interroger une base de données
curl -s -X POST "https://api.notion.com/v1/databases/{database_id}/query" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"filter": {
"property": "Status",
"select": {"equals": "Done"}
},
"sorts": [
{"property": "Created", "direction": "descending"}
],
"page_size": 100
}' | jq
Voir references/filters-and-sorts.md pour la documentation complète sur les filtres et les tris.
Créer une base de données
curl -s -X POST "https://api.notion.com/v1/databases" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"parent": {"page_id": "parent-page-id"},
"title": [{"type": "text", "text": {"content": "My Database"}}],
"is_inline": true,
"initial_data_source": {
"properties": {
"Name": {"title": {}},
"Status": {
"select": {
"options": [
{"name": "To Do", "color": "red"},
{"name": "In Progress", "color": "yellow"},
{"name": "Done", "color": "green"}
]
}
},
"Due Date": {"date": {}}
}
}
}' | jq
Mettre à jour une base de données
curl -s -X PATCH "https://api.notion.com/v1/databases/{database_id}" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"title": [{"text": {"content": "Updated Title"}}],
"description": [{"text": {"content": "Database description"}}]
}' | jq
Sources de données (API v2025-09-03+)
Les sources de données sont des tables individuelles dans une base de données. À partir de la version API 2025-09-03, les bases de données peuvent contenir plusieurs sources de données.
Créer une source de données
curl -s -X POST "https://api.notion.com/v1/data_sources" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"parent": {"type": "database_id", "database_id": "database-id"},
"title": [{"type": "text", "text": {"content": "New Data Source"}}],
"properties": {
"Name": {"title": {}},
"Description": {"rich_text": {}}
}
}' | jq
Utilisateurs
Lister tous les utilisateurs
curl -s "https://api.notion.com/v1/users?page_size=100" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" | jq
Récupérer un utilisateur
curl -s "https://api.notion.com/v1/users/{user_id}" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" | jq
Récupérer l'utilisateur bot (moi)
curl -s "https://api.notion.com/v1/users/me" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" | jq
Commentaires
Récupérer les commentaires
curl -s "https://api.notion.com/v1/comments?block_id={block_id}&page_size=100" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" | jq
Utilisez un ID de page comme block_id pour les commentaires au niveau de la page.
Créer un commentaire
Sur une page :
curl -s -X POST "https://api.notion.com/v1/comments" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"parent": {"page_id": "page-id"},
"rich_text": [{"type": "text", "text": {"content": "Comment content"}}]
}' | jq
Répondre à une discussion :
curl -s -X POST "https://api.notion.com/v1/comments" \
-H "Authorization: Bearer $NOTION_API_TOKEN" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"discussion_id": "discussion-id",
"rich_text": [{"type": "text", "text": {"content": "Reply content"}}]
}' | jq
Remarque : L'API ne peut pas démarrer de nouveaux fils de discussion en ligne ou modifier/supprimer les commentaires existants.
Pagination
Les endpoints paginés retournent :
has_more: Booléen indiquant si d'autres résultats existentnext_cursor: Curseur pour la page suivanteresults: Tableau d'éléments
Pour itérer sur tous les résultats :
- Effectuez la requête initiale (omettez
start_cursor) - Vérifiez
has_moredans la réponse - Si
true, extrayeznext_cursoret incluez-le commestart_cursordans la requête suivante - Répétez jusqu'à ce que
has_moresoitfalse
Exemple de requête avec curseur :
{
"page_size": 100,
"start_cursor": "v1%7C..."
}
Gestion des erreurs
| Code HTTP | Code | Description |
|---|---|---|
| 400 | invalid_json |
Le corps de la requête n'est pas du JSON valide |
| 400 | invalid_request_url |
L'URL est malformée |
| 400 | invalid_request |
La requête n'est pas prise en charge |
| 400 | validation_error |
Le corps de la requête ne correspond pas au schéma attendu |
| 400 | missing_version |
En-tête Notion-Version manquant |
| 401 | unauthorized |
Jeton bearer invalide |
| 403 | restricted_resource |
Le jeton n'a pas les permissions nécessaires |
| 404 | object_not_found |
La ressource n'existe pas ou n'est pas partagée avec l'intégration |
| 409 | conflict_error |
Collision de données lors de la transaction |
| 429 | rate_limited |
Limite de débit dépassée (vérifiez l'en-tête Retry-After) |
| 500 | internal_server_error |
Erreur serveur inattendue |
| 503 | service_unavailable |
Notion indisponible ou délai d'attente de 60 s dépassé |
| 503 | database_connection_unavailable |
Base de données non réactive |
| 504 | gateway_timeout |
Délai d'attente de la requête dépassé |
Bonnes pratiques
- Stocker les IDs : Quand vous créez des pages/bases de données, stockez les IDs retournés pour les mises à jour futures
- Utiliser les IDs de propriété : Référencez les propriétés par ID plutôt que par nom pour la stabilité
- Opérations en masse : Agrégez plusieurs petites opérations en moins de requêtes
- Respecter les limites de débit : Implémentez une backoff exponentielle pour les réponses 429
- Vérifier
has_more: Gérez toujours la pagination pour les endpoints de liste - Valider avant les mises à jour : Récupérez l'état actuel avant d'effectuer des mises à jour
- Utiliser des variables d'environnement : Ne codez jamais en dur les clés API
- Gérer les erreurs gracieusement : Vérifiez les codes de statut de réponse et les messages d'erreur
- Taille du schéma : Gardez les schémas de base de données sous 50 KB pour les performances optimales
- Limite des propriétés : Les propriétés avec >25 références de page nécessitent une récupération séparée
Références
Pour la documentation détaillée sur des sujets spécifiques, consultez :
references/block-types.md- Tous les types de blocs pris en charge et leurs structuresreferences/property-types.md- Types de propriétés de base de données et formats de valeurreferences/filters-and-sorts.md- Syntaxe des filtres et tris de requête de base de donnéesreferences/rich-text.md- Structure d'objet de texte enrichi et annotations