Access the OneNote API via Microsoft Graph with managed OAuth authentication. Create and manage notebooks, sections, section groups, and pages for note-taking and organization.
# List notebooks
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/one-note/v1.0/me/onenote/{resource}
Maton proxies requests to Microsoft Graph (graph.microsoft.com) and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your OneNote OAuth connections at https://api.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=one-note&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'one-note'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2026-03-12T10:24:32.321168Z",
"last_updated_time": "2026-03-12T10:24:49.890969Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "one-note",
"metadata": {},
"method": "OAUTH2"
}
}
Open the returned url in a browser to complete OAuth authorization with Microsoft.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple OneNote connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
Manage OneNote notebooks.
GET /one-note/v1.0/me/onenote/notebooks
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"value": [
{
"id": "1-30487038-8c2e-440a-860d-e82c6dc74f10",
"displayName": "My Notebook",
"createdDateTime": "2026-03-12T10:25:00Z",
"lastModifiedDateTime": "2026-03-12T10:30:00Z",
"isDefault": true,
"isShared": false,
"sectionsUrl": "https://graph.microsoft.com/v1.0/me/onenote/notebooks/.../sections",
"sectionGroupsUrl": "https://graph.microsoft.com/v1.0/me/onenote/notebooks/.../sectionGroups"
}
]
}
Use $expand to include sections and section groups:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks?$expand=sections,sectionGroups')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
GET /one-note/v1.0/me/onenote/notebooks/{notebook_id}
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks/{notebook_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
POST /one-note/v1.0/me/onenote/notebooks
Content-Type: application/json
{
"displayName": "New Notebook"
}
Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'displayName': 'My New Notebook'}).encode()
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
POST /one-note/v1.0/me/onenote/notebooks/{notebook_id}/copyNotebook
Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'renameAs': 'Copied Notebook'}).encode()
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks/{notebook_id}/copyNotebook', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
> Note: Copy operations are asynchronous. The response includes a status URL to check progress.
GET /one-note/v1.0/me/onenote/notebooks/getRecentNotebooks(includePersonalNotebooks=true)
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks/getRecentNotebooks(includePersonalNotebooks=true)')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Manage sections within notebooks.
GET /one-note/v1.0/me/onenote/sections
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/sections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"value": [
{
"id": "1-c9d63289-4f64-4579-9043-155543978c78",
"displayName": "My Section",
"createdDateTime": "2026-03-12T10:26:00Z",
"lastModifiedDateTime": "2026-03-12T10:28:00Z",
"isDefault": false,
"pagesUrl": "https://graph.microsoft.com/v1.0/me/onenote/sections/.../pages"
}
]
}
GET /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sections
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks/{notebook_id}/sections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
GET /one-note/v1.0/me/onenote/sections/{section_id}
POST /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sections
Content-Type: application/json
{
"displayName": "New Section"
}
Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'displayName': 'Meeting Notes'}).encode()
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks/{notebook_id}/sections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Organize sections into groups.
GET /one-note/v1.0/me/onenote/sectionGroups
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/sectionGroups')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
GET /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sectionGroups
GET /one-note/v1.0/me/onenote/sectionGroups/{section_group_id}
POST /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sectionGroups
Content-Type: application/json
{
"displayName": "New Section Group"
}
Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'displayName': 'Project Notes'}).encode()
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks/{notebook_id}/sectionGroups', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Create and manage pages with rich content.
GET /one-note/v1.0/me/onenote/pages
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/pages')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"value": [
{
"id": "1-42a904024c734393b561d0a85428965d!251-c9d63289-4f64-4579-9043-155543978c78",
"title": "My Page",
"createdDateTime": "2026-03-12T10:29:42Z",
"lastModifiedDateTime": "2026-03-12T10:30:00Z",
"contentUrl": "https://graph.microsoft.com/v1.0/me/onenote/pages/.../content"
}
]
}
GET /one-note/v1.0/me/onenote/sections/{section_id}/pages
GET /one-note/v1.0/me/onenote/pages/{page_id}
Returns the HTML content of a page:
GET /one-note/v1.0/me/onenote/pages/{page_id}/content
Example:
python <<'EOF'
import urllib.request, os
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/pages/{page_id}/content')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
resp = urllib.request.urlopen(req)
print(resp.read().decode())
EOF
Pages are created with HTML content:
POST /one-note/v1.0/me/onenote/sections/{section_id}/pages
Content-Type: text/html
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<p>Page content here</p>
</body>
</html>
Example:
python <<'EOF'
import urllib.request, os, json
html = """<!DOCTYPE html>
<html>
<head>
<title>Meeting Notes - March 12</title>
</head>
<body>
<h1>Meeting Notes</h1>
<p>Attendees: Alice, Bob, Charlie</p>
<ul>
<li>Discussed Q1 goals</li>
<li>Reviewed project timeline</li>
</ul>
</body>
</html>""".encode()
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/sections/{section_id}/pages', data=html, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'text/html')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Use PATCH to append, insert, or replace content:
PATCH /one-note/v1.0/me/onenote/pages/{page_id}/content
Content-Type: application/json
[
{
"target": "body",
"action": "append",
"content": "<p>New paragraph added!</p>"
}
]
Actions:
append - Add content at the end of targetprepend - Add content at the beginning of targetreplace - Replace target contentinsert - Insert after targetExample:
python <<'EOF'
import urllib.request, os, json
data = json.dumps([
{
"target": "body",
"action": "append",
"content": "<p>Updated at 2026-03-12</p>"
}
]).encode()
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/pages/{page_id}/content', data=data, method='PATCH')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
resp = urllib.request.urlopen(req)
print(f"Updated: {resp.status}")
EOF
The OneNote API supports OData query parameters:
| Parameter | Description | Example |
|---|---|---|
| ----------- | ------------- | --------- |
$select | Select specific properties | $select=id,displayName |
$expand | Include related resources | $expand=sections,sectionGroups |
$filter | Filter results | $filter=isDefault eq true |
$orderby | Sort results | $orderby=displayName |
$top | Limit results | $top=10 |
$skip | Skip results | $skip=20 |
Example with $select:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/one-note/v1.0/me/onenote/notebooks?$select=id,displayName')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
OneNote pages use a specific HTML format:
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
<meta name="created" content="2026-03-12T10:00:00Z" />
</head>
<body>
<p>Content here</p>
</body>
</html>
through
,
, , , - Images:

- Links:
- Formatting:
, , , Adding Images
<img src="https://example.com/image.jpg" alt="Description" />
Or embed base64 images:
<img src="data:image/png;base64,..." alt="Embedded image" />
Code Examples
JavaScript
const response = await fetch(
'https://api.maton.ai/one-note/v1.0/me/onenote/notebooks',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
console.log(data.value);
Python
import os
import requests
response = requests.get(
'https://api.maton.ai/one-note/v1.0/me/onenote/notebooks',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
notebooks = response.json()
print(notebooks['value'])
Create Page with Python
import os
import requests
html_content = """<!DOCTYPE html>
<html>
<head><title>New Page</title></head>
<body><p>Hello from Python!</p></body>
</html>"""
response = requests.post(
f'https://api.maton.ai/one-note/v1.0/me/onenote/sections/{section_id}/pages',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'text/html'
},
data=html_content
)
page = response.json()
print(f"Created page: {page['title']}")
Notes
- OneNote uses Microsoft Graph API v1.0
- Pages are created with HTML content (Content-Type: text/html)
- Page updates use PATCH with JSON array of operations
- Copy operations are asynchronous - check the returned status URL
- Use
$expand=sections,sectionGroups to get notebook contents in one call - Notebook and section names must be unique within their container
- IMPORTANT: When piping curl output to
jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments
Error Handling
Status Meaning -------- --------- 400 Bad request or missing OneNote connection 401 Invalid or missing Maton API key 403 Forbidden - insufficient permissions 404 Resource not found 409 Conflict - duplicate name 429 Rate limited 4xx/5xx Passthrough error from Microsoft Graph
Troubleshooting: API Key Issues
- Check that the
MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
- Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Troubleshooting: Invalid App Name
- Ensure your URL path starts with
one-note. For example:
- Correct:
https://api.maton.ai/one-note/v1.0/me/onenote/notebooks - Incorrect:
https://api.maton.ai/v1.0/me/onenote/notebooks
Resources
- OneNote API Overview
- OneNote REST API Reference
- Page HTML Reference
- Microsoft Graph Explorer
- Maton Community
- Maton Support
版本历史
共 2 个版本
-
v1.0.1
当前
2026-05-03 03:55 安全 安全
-
v1.0.0
2026-03-29 21:50 安全 安全
🔗 相关推荐
developer-tools
API Gateway
byungkyu 通过 Maton 管理的 API 路由连接外部服务;仅在用户指定目标应用、账户和任务后使用;以读取/列...
★ 392
📥 103,022
productivity
Word / DOCX
ivangdavila 创建、检查和编辑 Microsoft Word 文档及 DOCX 文件,支持样式、编号、修订记录、表格、分节符及兼容性检查等功能。
★ 437
📥 147,155