OpenAPI 3.1.0
NotiCord API
Stable API for agents and scripts to configure NotiCord after the owner has connected Discord, connected Notion, and created an API key in the app.
Jump to endpoint
Authorization: Bearer ntc_your_key for protected endpoints. An active subscription or trial is required. Bootstrap OAuth connections and create keys from the app.Notion
/notion/workspaces
List connected Notion workspaces
Returns only connections belonging to this key’s subscription. Use id as notionWorkspaceId in directory queries, workflow sources and Notion automation triggers/actions. workspaceId is the provider’s workspace identity and cannot replace the connection id. Names may be null or duplicated. This lists stored connections; directory requests check current Notion access.
Responses
200Connected workspacesView response body
[
{
id*: string(uuid)
workspaceId*: string(uuid)
name*: string | null
(no other fields)
}
]Example
[
{
"id": "22222222-2222-4222-8222-222222222222",
"workspaceId": "33333333-3333-4333-8333-333333333333",
"name": "Team workspace"
}
]401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/notion/databases
List shared Notion databases and data sources
Use this before configuring a database-backed rule, summary, create command, page list, filter, field, modal field, watched property, or quick action. It returns only shared Notion databases and data sources that NotiCord can use as configuration sources.
Parameters
notionWorkspaceIdstring(uuid)refreshbooleanResponses
200Databases available to the Notion connectionView response body
[
{
notionWorkspaceId*: string(uuid) | null
dataSourceId*: string(uuid)
name*: string
(no other fields)
}
]400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/notion/databases/{dataSourceId}
Get one Notion database/data-source with properties
Use this after choosing a Notion dataSourceId to inspect the database properties available to NotiCord configuration for filters, displayed fields, modal fields, watched properties, and database quick actions.
Parameters
dataSourceIdstring(uuid)notionWorkspaceIdstring(uuid)Responses
200Database detailView response body
{
notionWorkspaceId*: string(uuid) | null
dataSourceId*: string(uuid)
name*: string
properties*: [
{
id*: string
name*: string
type*: string
options: string[]
optionChoices: [
{
id*: string
name*: string
color: string
(no other fields)
}
]
(no other fields)
}
]
(no other fields)
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/notion/databases/{dataSourceId}/relation-pages/search
Search pages for a relation property on a Notion database
Use this only while configuring a database relation property value, such as a filter value that must point at a related Notion page. It avoids exposing unrelated Notion search data.
Parameters
dataSourceIdstring(uuid)notionWorkspaceIdstring(uuid)propertyIdstringquerystringResponses
200Matching relation pagesView response body
[
{
notionWorkspaceId*: string(uuid) | null
id*: string(uuid)
title*: string
(no other fields)
}
]400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/notion/pages/search
Search shared Notion pages
Use this when selecting a Notion page as a source for a rule, summary, create command, or page list. It returns shared pages, including database item pages; use database endpoints when the workflow should target the whole database.
Parameters
notionWorkspaceIdstring(uuid)querystringResponses
200Matching pagesView response body
[
{
notionWorkspaceId*: string(uuid) | null
id*: string(uuid)
title*: string
(no other fields)
}
]400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/notion/users
List Notion users for people-field values
Use this when configuration needs a Notion user id for People-property filter values or create-command People modal fields.
Parameters
notionWorkspaceIdstring(uuid)Responses
200Notion usersView response body
[
{
id*: string
name*: string
(no other fields)
}
]400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}Discord
/discord/guild-installations
List connected Discord servers and usable channels
Returns installations owned by this key’s subscription. Use id as discordInstallationId, and choose a channel from that installation. A bot_removed installation has no usable channels. Use purpose=panels for panel text/forum destinations and permission details. Panel destinations resolve the subscription-owned server from the channel when saved. Create-command private threads use a text channel in the invoking server, checked when the command creates its thread.
Parameters
purposeenum("panels")Responses
200Connected servers with channelsView response body
[
{
id*: string(uuid)
guildId*: string - Discord snowflake id.; minimum length 17; maximum length 19
name*: string
notionLinkUnfurlsEnabled*: boolean
status*: enum("active" | "bot_removed")
channels*: [
{
id*: string - Discord snowflake id.; minimum length 17; maximum length 19
name*: string
type*: enum("announcement" | "category" | "forum" | "private_thread" | "public_thread" | "text")
botHasAccess*: boolean
unsupportedReason: string | null
missingPermissions*: string[]
privateThreadBotHasAccess*: boolean
privateThreadMissingPermissions*: string[]
(no other fields)
}
]
(no other fields)
}
]400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/discord/direct-message-recipients
List allowed direct-message workflow recipients
Existing members of this key’s subscription, including its owner. Use accountId with destinationKind=direct_message on notification rules and scheduled summaries. Pending invitations and foreign accounts are excluded. Names may be null or duplicated. Listing a recipient does not guarantee delivery: Discord privacy settings can block DMs. Automation fixed_discord_user targets use Discord mention-target user ids instead.
Responses
200Allowed DM recipientsView response body
[
{
accountId*: string(uuid)
name*: string | null
(no other fields)
}
]Example
[
{
"accountId": "44444444-4444-4444-8444-444444444444",
"name": "teammate"
}
]401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/discord/guild-install
Get a selected Discord server and usable channels
Use this before choosing Discord destinations or thread channels for rules, summaries, create commands, page lists, or panels. Use purpose=panels to list text and forum destinations without fetching active threads. Forums requiring tags return unsupportedReason and cannot be used for panels.
Parameters
discordInstallationIdstring(uuid)purposeenum("panels")Responses
200Connected server with channelsView response body
{
id*: string(uuid)
guildId*: string - Discord snowflake id.; minimum length 17; maximum length 19
name*: string
notionLinkUnfurlsEnabled*: boolean
status*: enum("active" | "bot_removed")
channels*: [
{
id*: string - Discord snowflake id.; minimum length 17; maximum length 19
name*: string
type*: enum("announcement" | "category" | "forum" | "private_thread" | "public_thread" | "text")
botHasAccess*: boolean
unsupportedReason: string | null
missingPermissions*: string[]
privateThreadBotHasAccess*: boolean
privateThreadMissingPermissions*: string[]
(no other fields)
}
]
(no other fields)
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Discord server installationView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "DISCORD_SCOPE_REQUIRED",
"error": "Select discordInstallationId from GET /api/v1/discord/guild-installations."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/discord/guild-install/notion-link-unfurls
Enable or disable Discord replies for pasted Notion links
Use this to configure the connected Discord server setting that controls NotiCord replies for pasted Notion links. It is the API equivalent of that server-level setup toggle.
Parameters
discordInstallationIdstring(uuid)Request body
Required JSON request bodyView schema and example
{
enabled*: boolean
(no other fields)
}Example
{
"enabled": true
}Responses
200Updated settingView response body
{
enabled*: boolean
(no other fields)
}Example
{
"enabled": true
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Discord server installationView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "DISCORD_SCOPE_REQUIRED",
"error": "Select discordInstallationId from GET /api/v1/discord/guild-installations."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/discord/guild-install/{guildInstallId}/notion-link-unfurls
Set pasted Notion link previews for one server
Updates only the subscription-owned installation selected by its id.
Parameters
guildInstallIdstring(uuid)Request body
Required JSON request bodyView schema and example
{
enabled*: boolean
(no other fields)
}Example
{
"enabled": true
}Responses
200Updated settingView response body
{
enabled*: boolean
(no other fields)
}Example
{
"enabled": true
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/discord/guild-install/mention-targets
Search Discord roles and users for mentions and thread members
Use this when configuration needs Discord role or user ids for additional mentions or create-command thread members. It returns only mention targets relevant to NotiCord workflow setup.
Parameters
discordInstallationIdstring(uuid)querystringResponses
200Mention targetsView response body
{
targets*: [
{
id*: string
kind*: enum("role" | "user")
label*: string
(no other fields)
}
]
(no other fields)
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Discord server installationView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "DISCORD_SCOPE_REQUIRED",
"error": "Select discordInstallationId from GET /api/v1/discord/guild-installations."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}Notification rules
/notification-rules
List notification rules
Use this to inventory existing notification rules before creating, replacing, disabling, or deleting NotiCord notification configuration. Channel and direct-message destinations are returned.
Responses
200RulesView response body
[
choose one:
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "channel"
channelId*: string - pattern ^[0-9]{17,19}$
discordInstallationId*: choose one
- string(uuid)
- ""
id*: string(uuid)
name*: string
deliveryMode*: enum("realtime" | "scheduled_change")
enabled*: boolean
delayMinutes*: integer - minimum 0; maximum 60
(no other fields)
}
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "direct_message"
accountId*: string(uuid)
id*: string(uuid)
name*: string
deliveryMode*: enum("realtime" | "scheduled_change")
enabled*: boolean
delayMinutes*: integer - minimum 0; maximum 60
(no other fields)
}
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "linked_thread"
id*: string(uuid)
name*: string
deliveryMode*: enum("realtime" | "scheduled_change")
enabled*: boolean
delayMinutes*: integer - minimum 0; maximum 60
(no other fields)
}
]401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/notification-rules
Create a notification rule
Use this to add a NotiCord notification rule that watches a shared Notion source and sends updates to a Discord channel. For a direct-message destination, select an accountId from GET /discord/direct-message-recipients.
Request body
Required JSON request bodyView schema and example
match one or more:
-
{
match one or more:
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
sourceType*: "all"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
dataSourceId*: string(uuid)
sourceType*: "database"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
pageId*: string(uuid)
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
}
match one or more:
-
match one or more:
- {
channelId*: string - pattern ^\d{17,19}$
discordInstallationId*: string(uuid)
destinationKind*: "channel"
}
- {
accountId*: string(uuid)
destinationKind*: "direct_message"
}
- {
destinationKind*: "linked_thread"
}
actionGroups*: [
match one or more:
- {
actions*: [
match one or more:
- {
kind*: "set_option"
label*: string
optionName*: string
propertyId*: string
propertyType*: enum("status" | "select")
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
] - maximum items 5
presentation*: "buttons"
(no other fields)
}
- {
actions*: [
{
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
(no other fields)
}
] - maximum items 25
label*: string - maximum length 80
presentation*: "dropdown"
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
] - maximum items 5
additionalMentions*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
customEntryLabel*: match one or more
- string - maximum length 40
- null
enabled*: boolean
entryLabelMode*: enum("task" | "ticket" | "item" | "page" | "custom")
filters*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string - pattern ^\d{4}-\d{2}-\d{2}$
kind*: "fixed"
(no other fields)
}
- {
days*: integer - minimum -3650; maximum 3650
kind*: "relative"
(no other fields)
}
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - minimum length 1; maximum length 200
(no other fields)
}
- {
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - minimum length 1; maximum length 200
values*: string[]
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[] - minimum items 1
mentionAssignees: boolean
(no other fields)
}
name*: string - minimum length 1; maximum length 120
watchedProperties*: string[]
deliveryMode*: "realtime"
delayMinutes: integer - Minutes without matching changes before delivery; 0 sends immediately.; minimum 0; maximum 60; default 0
eventTypes*: enum("page_created" | "page_updated" | "page_deleted" | "comment_created")[]
updateTypes*: enum("properties" | "content")[]
}
(no other fields)
-
{
match one or more:
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
sourceType*: "all"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
dataSourceId*: string(uuid)
sourceType*: "database"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
pageId*: string(uuid)
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
}
match one or more:
- {
channelId*: string - pattern ^\d{17,19}$
discordInstallationId*: string(uuid)
destinationKind*: "channel"
}
- {
accountId*: string(uuid)
destinationKind*: "direct_message"
}
actionGroups*: [
match one or more:
- {
actions*: [
match one or more:
- {
kind*: "set_option"
label*: string
optionName*: string
propertyId*: string
propertyType*: enum("status" | "select")
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
] - maximum items 5
presentation*: "buttons"
(no other fields)
}
- {
actions*: [
{
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
(no other fields)
}
] - maximum items 25
label*: string - maximum length 80
presentation*: "dropdown"
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
] - maximum items 5
additionalMentions*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
customEntryLabel*: match one or more
- string - maximum length 40
- null
enabled*: boolean
entryLabelMode*: enum("task" | "ticket" | "item" | "page" | "custom")
filters*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string - pattern ^\d{4}-\d{2}-\d{2}$
kind*: "fixed"
(no other fields)
}
- {
days*: integer - minimum -3650; maximum 3650
kind*: "relative"
(no other fields)
}
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - minimum length 1; maximum length 200
(no other fields)
}
- {
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - minimum length 1; maximum length 200
values*: string[]
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[] - minimum items 1
mentionAssignees: boolean
(no other fields)
}
name*: string - minimum length 1; maximum length 120
watchedProperties*: string[]
deliveryMode*: "scheduled_change"
eventTypes*: enum("page_created" | "page_updated" | "page_deleted")[]
rowFields*: string[] - minimum items 1
schedule* {
frequency*: enum("hourly" | "daily" | "weekly")
runHour*: match one or more
- integer - minimum 0; maximum 23
- null
runWeekday*: match one or more
- enum(1 | 2 | 3 | 4 | 5 | 6 | 7)
- null
timezone*: string - minimum length 1
(no other fields)
}
}
(no other fields)Example
{
"notionWorkspaceId": "22222222-2222-4222-8222-222222222222",
"sourceType": "all",
"name": "All page updates",
"deliveryMode": "realtime",
"enabled": true,
"destinationKind": "channel",
"discordInstallationId": "11111111-1111-4111-8111-111111111111",
"channelId": "123456789012345678",
"entryLabelMode": "page",
"customEntryLabel": null,
"eventTypes": [
"page_created",
"page_updated",
"page_deleted",
"comment_created"
],
"updateTypes": [
"properties",
"content"
],
"additionalMentions": [],
"itemPresentation": {
"cardLocale": "en-US",
"fields": [
"__title__"
],
"mentionAssignees": false,
"displaySettings": {
"includeContentFiles": true,
"showEmptySelectedProperties": true,
"showOnlyChangedOnUpdate": false
}
},
"filters": [],
"watchedProperties": [],
"actionGroups": []
}Responses
201Created rule idView response body
{
id*: string(uuid)
(no other fields)
}Example
{
"id": "00000000-0000-0000-0000-000000000000"
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/notification-rules/{id}
Get a notification rule
Use this to fetch the complete notification rule configuration before editing or cloning it, including channel and direct-message destinations.
Parameters
idstring(uuid)Responses
200RuleView response body
choose one:
-
choose one:
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "channel"
channelId*: string - pattern ^[0-9]{17,19}$
discordInstallationId*: choose one
- string(uuid)
- ""
id*: string(uuid)
name*: string
deliveryMode*: "realtime"
delayMinutes*: integer - minimum 0; maximum 60
enabled*: boolean
entryLabelMode*: enum("task" | "ticket" | "item" | "page" | "custom")
customEntryLabel*: string | null
eventTypes*: enum("page_created" | "page_updated" | "page_deleted" | "comment_created")[]
updateTypes*: enum("properties" | "content")[]
watchedProperties*: string[]
filters*: [
choose one:
- {
propertyId*: string
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
dateValue*: choose one
- {
kind*: "fixed"
date*: string(date)
(no other fields)
}
- {
kind*: "relative"
days*: integer - Relative day offset where 0 is today, 1 is tomorrow, and -1 is yesterday.; minimum -3650; maximum 3650
(no other fields)
}
(no other fields)
}
- {
propertyId*: string
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
values*: string[]
(no other fields)
}
]
additionalMentions*: [
{
kind*: enum("role" | "user")
id*: string
label*: string
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[]
mentionAssignees: boolean
(no other fields)
}
actionGroups*: [
choose one:
- {
presentation*: "buttons"
actions*: [
choose one:
- {
kind*: "set_option"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
optionName*: string
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
]
(no other fields)
}
- {
presentation*: "dropdown"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
actions*: [
{
label*: string
optionName*: string
(no other fields)
}
]
(no other fields)
}
]
(no other fields)
}
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "direct_message"
accountId*: string(uuid)
id*: string(uuid)
name*: string
deliveryMode*: "realtime"
delayMinutes*: integer - minimum 0; maximum 60
enabled*: boolean
entryLabelMode*: enum("task" | "ticket" | "item" | "page" | "custom")
customEntryLabel*: string | null
eventTypes*: enum("page_created" | "page_updated" | "page_deleted" | "comment_created")[]
updateTypes*: enum("properties" | "content")[]
watchedProperties*: string[]
filters*: [
choose one:
- {
propertyId*: string
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
dateValue*: choose one
- {
kind*: "fixed"
date*: string(date)
(no other fields)
}
- {
kind*: "relative"
days*: integer - Relative day offset where 0 is today, 1 is tomorrow, and -1 is yesterday.; minimum -3650; maximum 3650
(no other fields)
}
(no other fields)
}
- {
propertyId*: string
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
values*: string[]
(no other fields)
}
]
additionalMentions*: [
{
kind*: enum("role" | "user")
id*: string
label*: string
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[]
mentionAssignees: boolean
(no other fields)
}
actionGroups*: [
choose one:
- {
presentation*: "buttons"
actions*: [
choose one:
- {
kind*: "set_option"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
optionName*: string
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
]
(no other fields)
}
- {
presentation*: "dropdown"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
actions*: [
{
label*: string
optionName*: string
(no other fields)
}
]
(no other fields)
}
]
(no other fields)
}
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "linked_thread"
id*: string(uuid)
name*: string
deliveryMode*: "realtime"
delayMinutes*: integer - minimum 0; maximum 60
enabled*: boolean
entryLabelMode*: enum("task" | "ticket" | "item" | "page" | "custom")
customEntryLabel*: string | null
eventTypes*: enum("page_created" | "page_updated" | "page_deleted" | "comment_created")[]
updateTypes*: enum("properties" | "content")[]
watchedProperties*: string[]
filters*: [
choose one:
- {
propertyId*: string
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
dateValue*: choose one
- {
kind*: "fixed"
date*: string(date)
(no other fields)
}
- {
kind*: "relative"
days*: integer - Relative day offset where 0 is today, 1 is tomorrow, and -1 is yesterday.; minimum -3650; maximum 3650
(no other fields)
}
(no other fields)
}
- {
propertyId*: string
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
values*: string[]
(no other fields)
}
]
additionalMentions*: [
{
kind*: enum("role" | "user")
id*: string
label*: string
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[]
mentionAssignees: boolean
(no other fields)
}
actionGroups*: [
choose one:
- {
presentation*: "buttons"
actions*: [
choose one:
- {
kind*: "set_option"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
optionName*: string
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
]
(no other fields)
}
- {
presentation*: "dropdown"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
actions*: [
{
label*: string
optionName*: string
(no other fields)
}
]
(no other fields)
}
]
(no other fields)
}
-
choose one:
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "channel"
channelId*: string - pattern ^[0-9]{17,19}$
discordInstallationId*: choose one
- string(uuid)
- ""
id*: string(uuid)
name*: string
deliveryMode*: "scheduled_change"
enabled*: boolean
entryLabelMode*: enum("task" | "ticket" | "item" | "page" | "custom")
customEntryLabel*: string | null
eventTypes*: enum("page_created" | "page_updated" | "page_deleted")[]
watchedProperties*: string[]
filters*: [
choose one:
- {
propertyId*: string
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
dateValue*: choose one
- {
kind*: "fixed"
date*: string(date)
(no other fields)
}
- {
kind*: "relative"
days*: integer - Relative day offset where 0 is today, 1 is tomorrow, and -1 is yesterday.; minimum -3650; maximum 3650
(no other fields)
}
(no other fields)
}
- {
propertyId*: string
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
values*: string[]
(no other fields)
}
]
additionalMentions*: [
{
kind*: enum("role" | "user")
id*: string
label*: string
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[]
mentionAssignees: boolean
(no other fields)
}
rowFields*: string[]
actionGroups*: [
choose one:
- {
presentation*: "buttons"
actions*: [
choose one:
- {
kind*: "set_option"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
optionName*: string
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
]
(no other fields)
}
- {
presentation*: "dropdown"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
actions*: [
{
label*: string
optionName*: string
(no other fields)
}
]
(no other fields)
}
]
schedule* {
frequency*: enum("hourly" | "daily" | "weekly")
timezone*: string
runHour*: integer | null - minimum 0; maximum 23
runWeekday*: integer | null - minimum 1; maximum 7
(no other fields)
}
(no other fields)
}
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "direct_message"
accountId*: string(uuid)
id*: string(uuid)
name*: string
deliveryMode*: "scheduled_change"
enabled*: boolean
entryLabelMode*: enum("task" | "ticket" | "item" | "page" | "custom")
customEntryLabel*: string | null
eventTypes*: enum("page_created" | "page_updated" | "page_deleted")[]
watchedProperties*: string[]
filters*: [
choose one:
- {
propertyId*: string
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
dateValue*: choose one
- {
kind*: "fixed"
date*: string(date)
(no other fields)
}
- {
kind*: "relative"
days*: integer - Relative day offset where 0 is today, 1 is tomorrow, and -1 is yesterday.; minimum -3650; maximum 3650
(no other fields)
}
(no other fields)
}
- {
propertyId*: string
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
values*: string[]
(no other fields)
}
]
additionalMentions*: [
{
kind*: enum("role" | "user")
id*: string
label*: string
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[]
mentionAssignees: boolean
(no other fields)
}
rowFields*: string[]
actionGroups*: [
choose one:
- {
presentation*: "buttons"
actions*: [
choose one:
- {
kind*: "set_option"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
optionName*: string
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
]
(no other fields)
}
- {
presentation*: "dropdown"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
actions*: [
{
label*: string
optionName*: string
(no other fields)
}
]
(no other fields)
}
]
schedule* {
frequency*: enum("hourly" | "daily" | "weekly")
timezone*: string
runHour*: integer | null - minimum 0; maximum 23
runWeekday*: integer | null - minimum 1; maximum 7
(no other fields)
}
(no other fields)
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/notification-rules/{id}
Replace a notification rule configuration
Use this to replace the full notification rule configuration, including enabled state, source, destination, filters, schedule, fields, mentions, and quick actions.
Parameters
idstring(uuid)Request body
Required JSON request bodyView schema and example
match one or more:
-
{
match one or more:
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
sourceType*: "all"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
dataSourceId*: string(uuid)
sourceType*: "database"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
pageId*: string(uuid)
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
}
match one or more:
-
match one or more:
- {
channelId*: string - pattern ^\d{17,19}$
discordInstallationId*: string(uuid)
destinationKind*: "channel"
}
- {
accountId*: string(uuid)
destinationKind*: "direct_message"
}
- {
destinationKind*: "linked_thread"
}
actionGroups*: [
match one or more:
- {
actions*: [
match one or more:
- {
kind*: "set_option"
label*: string
optionName*: string
propertyId*: string
propertyType*: enum("status" | "select")
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
] - maximum items 5
presentation*: "buttons"
(no other fields)
}
- {
actions*: [
{
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
(no other fields)
}
] - maximum items 25
label*: string - maximum length 80
presentation*: "dropdown"
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
] - maximum items 5
additionalMentions*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
customEntryLabel*: match one or more
- string - maximum length 40
- null
enabled*: boolean
entryLabelMode*: enum("task" | "ticket" | "item" | "page" | "custom")
filters*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string - pattern ^\d{4}-\d{2}-\d{2}$
kind*: "fixed"
(no other fields)
}
- {
days*: integer - minimum -3650; maximum 3650
kind*: "relative"
(no other fields)
}
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - minimum length 1; maximum length 200
(no other fields)
}
- {
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - minimum length 1; maximum length 200
values*: string[]
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[] - minimum items 1
mentionAssignees: boolean
(no other fields)
}
name*: string - minimum length 1; maximum length 120
watchedProperties*: string[]
deliveryMode*: "realtime"
delayMinutes: integer - Minutes without matching changes before delivery; 0 sends immediately.; minimum 0; maximum 60; default 0
eventTypes*: enum("page_created" | "page_updated" | "page_deleted" | "comment_created")[]
updateTypes*: enum("properties" | "content")[]
}
(no other fields)
-
{
match one or more:
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
sourceType*: "all"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
dataSourceId*: string(uuid)
sourceType*: "database"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
pageId*: string(uuid)
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
}
match one or more:
- {
channelId*: string - pattern ^\d{17,19}$
discordInstallationId*: string(uuid)
destinationKind*: "channel"
}
- {
accountId*: string(uuid)
destinationKind*: "direct_message"
}
actionGroups*: [
match one or more:
- {
actions*: [
match one or more:
- {
kind*: "set_option"
label*: string
optionName*: string
propertyId*: string
propertyType*: enum("status" | "select")
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
] - maximum items 5
presentation*: "buttons"
(no other fields)
}
- {
actions*: [
{
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
(no other fields)
}
] - maximum items 25
label*: string - maximum length 80
presentation*: "dropdown"
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
] - maximum items 5
additionalMentions*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
customEntryLabel*: match one or more
- string - maximum length 40
- null
enabled*: boolean
entryLabelMode*: enum("task" | "ticket" | "item" | "page" | "custom")
filters*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string - pattern ^\d{4}-\d{2}-\d{2}$
kind*: "fixed"
(no other fields)
}
- {
days*: integer - minimum -3650; maximum 3650
kind*: "relative"
(no other fields)
}
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - minimum length 1; maximum length 200
(no other fields)
}
- {
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - minimum length 1; maximum length 200
values*: string[]
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[] - minimum items 1
mentionAssignees: boolean
(no other fields)
}
name*: string - minimum length 1; maximum length 120
watchedProperties*: string[]
deliveryMode*: "scheduled_change"
eventTypes*: enum("page_created" | "page_updated" | "page_deleted")[]
rowFields*: string[] - minimum items 1
schedule* {
frequency*: enum("hourly" | "daily" | "weekly")
runHour*: match one or more
- integer - minimum 0; maximum 23
- null
runWeekday*: match one or more
- enum(1 | 2 | 3 | 4 | 5 | 6 | 7)
- null
timezone*: string - minimum length 1
(no other fields)
}
}
(no other fields)Example
{
"notionWorkspaceId": "22222222-2222-4222-8222-222222222222",
"sourceType": "all",
"name": "All page updates",
"deliveryMode": "realtime",
"enabled": true,
"destinationKind": "channel",
"discordInstallationId": "11111111-1111-4111-8111-111111111111",
"channelId": "123456789012345678",
"entryLabelMode": "page",
"customEntryLabel": null,
"eventTypes": [
"page_created",
"page_updated",
"page_deleted",
"comment_created"
],
"updateTypes": [
"properties",
"content"
],
"additionalMentions": [],
"itemPresentation": {
"cardLocale": "en-US",
"fields": [
"__title__"
],
"mentionAssignees": false,
"displaySettings": {
"includeContentFiles": true,
"showEmptySelectedProperties": true,
"showOnlyChangedOnUpdate": false
}
},
"filters": [],
"watchedProperties": [],
"actionGroups": []
}Responses
204Updated; no response bodyView response body
400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/notification-rules/{id}
Delete a notification rule
Use this to remove a notification rule that should no longer be part of the NotiCord setup.
Parameters
idstring(uuid)Responses
204Deleted; no response bodyView response body
401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/notification-rules/{id}/health
Read notification delivery health
Read saved enablement and pause state, pending deliveries, latest recorded attempt and last retained successful delivery, plus current capacities. No provider calls or retries. Null results mean no retained evidence, not proof that delivery never occurred. Resource capacity limits creation; notification quota limits sending.
Parameters
idstring(uuid)Responses
200Notification healthView response body
{
id*: string(uuid)
enabled*: boolean
isPaused*: boolean
pausedAt*: string | null
pauseReasonCode*: enum("notion_connection_required" | "notion_token_invalid" | "notion_source_unavailable" | "discord_channel_unavailable" | "discord_missing_access" | "discord_missing_permissions" | "discord_recipient_unavailable" | "discord_direct_message_unavailable" | null)
pauseReasonDetail*: string | null
pauseMessage*: string | null
recoveryAction*: match one or more
- {
actionKind*: enum("app" | "docs")
actionLabel*: string
actionPath*: string
(no other fields)
}
- null
resourceCapacity* {
used*: integer - minimum 0
limit*: integer | null - minimum 0
remaining*: integer | null - minimum 0
exhausted*: boolean
(no other fields)
}
notificationQuota* {
used*: integer - minimum 0
limit*: integer | null - minimum 0
remaining*: integer | null - minimum 0
exhausted*: boolean
periodStart*: string | null
periodEnd*: string | null
(no other fields)
}
lastRunAt*: string | null
latestDelivery*: match one or more
- {
id*: string(uuid)
occurredAt*: string(date-time)
success*: boolean
errorMessage*: string | null
discordMessageId*: string | null
warningMessage*: string | null
(no other fields)
}
- null
lastSuccessfulDelivery*: match one or more
- {
id*: string(uuid)
occurredAt*: string(date-time)
success*: boolean
errorMessage*: string | null
discordMessageId*: string | null
warningMessage*: string | null
(no other fields)
}
- null
pendingCount*: integer - minimum 0
nextSendAt*: string | null
(no other fields)
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}Scheduled summaries
/scheduled-summaries
List scheduled summaries
Use this to inventory existing scheduled summaries before creating, replacing, disabling, or deleting NotiCord summary configuration. Channel and direct-message destinations are returned.
Responses
200SummariesView response body
[
choose one:
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "channel"
channelId*: string - pattern ^[0-9]{17,19}$
discordInstallationId*: choose one
- string(uuid)
- ""
id*: string(uuid)
name*: string
enabled*: boolean
schedule* {
frequency*: enum("hourly" | "daily" | "weekly")
timezone*: string
runHour*: integer | null - minimum 0; maximum 23
runWeekday*: integer | null - minimum 1; maximum 7
(no other fields)
}
(no other fields)
}
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "direct_message"
accountId*: string(uuid)
id*: string(uuid)
name*: string
enabled*: boolean
schedule* {
frequency*: enum("hourly" | "daily" | "weekly")
timezone*: string
runHour*: integer | null - minimum 0; maximum 23
runWeekday*: integer | null - minimum 1; maximum 7
(no other fields)
}
(no other fields)
}
]401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/scheduled-summaries
Create a scheduled summary
Use this to add a scheduled NotiCord summary that periodically sends matching Notion items to a Discord channel. For a direct-message destination, select an accountId from GET /discord/direct-message-recipients.
Request body
Required JSON request bodyView schema and example
{
match one or more:
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
sourceType*: "all"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
dataSourceId*: string(uuid)
sourceType*: "database"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
pageId*: string(uuid)
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
}
match one or more:
- {
channelId*: string - pattern ^\d{17,19}$
discordInstallationId*: string(uuid)
destinationKind*: "channel"
}
- {
accountId*: string(uuid)
destinationKind*: "direct_message"
}
actionGroups*: [
match one or more:
- {
actions*: [
match one or more:
- {
kind*: "set_option"
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
- {
kind*: "upload_files"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 5
presentation*: "buttons"
(no other fields)
}
- {
actions*: [
{
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
(no other fields)
}
] - maximum items 25
label*: string - maximum length 80
presentation*: "dropdown"
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
] - maximum items 5
additionalMentions*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
enabled*: boolean
filterRules*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string - pattern ^\d{4}-\d{2}-\d{2}$
kind*: "fixed"
(no other fields)
}
- {
days*: integer - minimum -3650; maximum 3650
kind*: "relative"
(no other fields)
}
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - minimum length 1; maximum length 200
(no other fields)
}
- {
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - minimum length 1; maximum length 200
values*: string[]
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[] - minimum items 1
mentionAssignees: boolean
(no other fields)
}
listPresentation* {
rowFields*: string[] - minimum items 1
showHeader*: boolean
sort* {
direction*: enum("asc" | "desc")
fieldId*: string - minimum length 1; maximum length 200
(no other fields)
}
(no other fields)
}
name*: string - minimum length 1; maximum length 120
onlySendIfResults*: boolean
schedule* {
frequency*: enum("hourly" | "daily" | "weekly")
runHour*: match one or more
- integer - minimum 0; maximum 23
- null
runWeekday*: match one or more
- enum(1 | 2 | 3 | 4 | 5 | 6 | 7)
- null
timezone*: string - minimum length 1
(no other fields)
}
}
(no other fields)Example
{
"notionWorkspaceId": "22222222-2222-4222-8222-222222222222",
"sourceType": "all",
"name": "Daily workspace digest",
"destinationKind": "channel",
"discordInstallationId": "11111111-1111-4111-8111-111111111111",
"channelId": "123456789012345678",
"filterRules": [],
"additionalMentions": [],
"itemPresentation": {
"cardLocale": "en-US",
"fields": [
"__title__"
],
"mentionAssignees": false,
"displaySettings": {
"includeContentFiles": true,
"showEmptySelectedProperties": true,
"showOnlyChangedOnUpdate": false
}
},
"listPresentation": {
"rowFields": [
"__title__"
],
"showHeader": true,
"sort": {
"fieldId": "__last_edited_time__",
"direction": "desc"
}
},
"onlySendIfResults": true,
"schedule": {
"frequency": "daily",
"timezone": "UTC",
"runHour": 9,
"runWeekday": null
},
"actionGroups": [],
"enabled": true
}Responses
201Created summary idView response body
{
id*: string(uuid)
(no other fields)
}Example
{
"id": "00000000-0000-0000-0000-000000000000"
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/scheduled-summaries/{summaryId}
Get a scheduled summary
Use this to fetch the complete scheduled summary configuration before editing or cloning it, including channel and direct-message destinations.
Parameters
summaryIdstring(uuid)Responses
200SummaryView response body
choose one:
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "channel"
channelId*: string - pattern ^[0-9]{17,19}$
discordInstallationId*: choose one
- string(uuid)
- ""
id*: string(uuid)
name*: string
enabled*: boolean
filterRules*: [
choose one:
- {
propertyId*: string
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
dateValue*: choose one
- {
kind*: "fixed"
date*: string(date)
(no other fields)
}
- {
kind*: "relative"
days*: integer - Relative day offset where 0 is today, 1 is tomorrow, and -1 is yesterday.; minimum -3650; maximum 3650
(no other fields)
}
(no other fields)
}
- {
propertyId*: string
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
values*: string[]
(no other fields)
}
]
additionalMentions*: [
{
kind*: enum("role" | "user")
id*: string
label*: string
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[]
mentionAssignees: boolean
(no other fields)
}
listPresentation* {
rowFields*: string[]
showHeader*: boolean
sort* {
fieldId*: string
direction*: enum("asc" | "desc")
(no other fields)
}
(no other fields)
}
onlySendIfResults*: boolean
actionGroups*: [
choose one:
- {
presentation*: "buttons"
actions*: [
choose one:
- {
kind*: "set_option"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
optionName*: string
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
]
(no other fields)
}
- {
presentation*: "dropdown"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
actions*: [
{
label*: string
optionName*: string
(no other fields)
}
]
(no other fields)
}
]
schedule* {
frequency*: enum("hourly" | "daily" | "weekly")
timezone*: string
runHour*: integer | null - minimum 0; maximum 23
runWeekday*: integer | null - minimum 1; maximum 7
(no other fields)
}
(no other fields)
}
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
destinationKind*: "direct_message"
accountId*: string(uuid)
id*: string(uuid)
name*: string
enabled*: boolean
filterRules*: [
choose one:
- {
propertyId*: string
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
dateValue*: choose one
- {
kind*: "fixed"
date*: string(date)
(no other fields)
}
- {
kind*: "relative"
days*: integer - Relative day offset where 0 is today, 1 is tomorrow, and -1 is yesterday.; minimum -3650; maximum 3650
(no other fields)
}
(no other fields)
}
- {
propertyId*: string
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
values*: string[]
(no other fields)
}
]
additionalMentions*: [
{
kind*: enum("role" | "user")
id*: string
label*: string
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[]
mentionAssignees: boolean
(no other fields)
}
listPresentation* {
rowFields*: string[]
showHeader*: boolean
sort* {
fieldId*: string
direction*: enum("asc" | "desc")
(no other fields)
}
(no other fields)
}
onlySendIfResults*: boolean
actionGroups*: [
choose one:
- {
presentation*: "buttons"
actions*: [
choose one:
- {
kind*: "set_option"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
optionName*: string
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
]
(no other fields)
}
- {
presentation*: "dropdown"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
actions*: [
{
label*: string
optionName*: string
(no other fields)
}
]
(no other fields)
}
]
schedule* {
frequency*: enum("hourly" | "daily" | "weekly")
timezone*: string
runHour*: integer | null - minimum 0; maximum 23
runWeekday*: integer | null - minimum 1; maximum 7
(no other fields)
}
(no other fields)
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/scheduled-summaries/{summaryId}
Replace a scheduled summary configuration
Use this to replace the full scheduled summary configuration, including enabled state, source, destination, filters, schedule, list layout, fields, mentions, and quick actions.
Parameters
summaryIdstring(uuid)Request body
Required JSON request bodyView schema and example
{
match one or more:
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
sourceType*: "all"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
dataSourceId*: string(uuid)
sourceType*: "database"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
pageId*: string(uuid)
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
}
match one or more:
- {
channelId*: string - pattern ^\d{17,19}$
discordInstallationId*: string(uuid)
destinationKind*: "channel"
}
- {
accountId*: string(uuid)
destinationKind*: "direct_message"
}
actionGroups*: [
match one or more:
- {
actions*: [
match one or more:
- {
kind*: "set_option"
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
- {
kind*: "upload_files"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 5
presentation*: "buttons"
(no other fields)
}
- {
actions*: [
{
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
(no other fields)
}
] - maximum items 25
label*: string - maximum length 80
presentation*: "dropdown"
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
] - maximum items 5
additionalMentions*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
enabled*: boolean
filterRules*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string - pattern ^\d{4}-\d{2}-\d{2}$
kind*: "fixed"
(no other fields)
}
- {
days*: integer - minimum -3650; maximum 3650
kind*: "relative"
(no other fields)
}
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - minimum length 1; maximum length 200
(no other fields)
}
- {
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - minimum length 1; maximum length 200
values*: string[]
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[] - minimum items 1
mentionAssignees: boolean
(no other fields)
}
listPresentation* {
rowFields*: string[] - minimum items 1
showHeader*: boolean
sort* {
direction*: enum("asc" | "desc")
fieldId*: string - minimum length 1; maximum length 200
(no other fields)
}
(no other fields)
}
name*: string - minimum length 1; maximum length 120
onlySendIfResults*: boolean
schedule* {
frequency*: enum("hourly" | "daily" | "weekly")
runHour*: match one or more
- integer - minimum 0; maximum 23
- null
runWeekday*: match one or more
- enum(1 | 2 | 3 | 4 | 5 | 6 | 7)
- null
timezone*: string - minimum length 1
(no other fields)
}
}
(no other fields)Example
{
"notionWorkspaceId": "22222222-2222-4222-8222-222222222222",
"sourceType": "all",
"name": "Daily workspace digest",
"destinationKind": "channel",
"discordInstallationId": "11111111-1111-4111-8111-111111111111",
"channelId": "123456789012345678",
"filterRules": [],
"additionalMentions": [],
"itemPresentation": {
"cardLocale": "en-US",
"fields": [
"__title__"
],
"mentionAssignees": false,
"displaySettings": {
"includeContentFiles": true,
"showEmptySelectedProperties": true,
"showOnlyChangedOnUpdate": false
}
},
"listPresentation": {
"rowFields": [
"__title__"
],
"showHeader": true,
"sort": {
"fieldId": "__last_edited_time__",
"direction": "desc"
}
},
"onlySendIfResults": true,
"schedule": {
"frequency": "daily",
"timezone": "UTC",
"runHour": 9,
"runWeekday": null
},
"actionGroups": [],
"enabled": true
}Responses
200UpdatedView response body
{
success*: true
(no other fields)
}Example
{
"success": true
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/scheduled-summaries/{summaryId}
Delete a scheduled summary
Use this to remove a scheduled summary that should no longer be part of the NotiCord setup.
Parameters
summaryIdstring(uuid)Responses
204Deleted; no response bodyView response body
401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/scheduled-summaries/{id}/health
Read scheduled summary delivery health
Read saved enablement and pause state, latest run outcome, latest recorded delivery attempt and last retained successful delivery, plus current capacities. A no_results run sends no message; lastRunAt is an attempt timestamp. Delivery records and lastRunOutcome must be read separately. No provider calls or retries.
Parameters
idstring(uuid)Responses
200Summary healthView response body
{
id*: string(uuid)
enabled*: boolean
isPaused*: boolean
pausedAt*: string | null
pauseReasonCode*: enum("notion_connection_required" | "notion_token_invalid" | "notion_source_unavailable" | "discord_channel_unavailable" | "discord_missing_access" | "discord_missing_permissions" | "discord_recipient_unavailable" | "discord_direct_message_unavailable" | null)
pauseReasonDetail*: string | null
pauseMessage*: string | null
recoveryAction*: match one or more
- {
actionKind*: enum("app" | "docs")
actionLabel*: string
actionPath*: string
(no other fields)
}
- null
resourceCapacity* {
used*: integer - minimum 0
limit*: integer | null - minimum 0
remaining*: integer | null - minimum 0
exhausted*: boolean
(no other fields)
}
notificationQuota* {
used*: integer - minimum 0
limit*: integer | null - minimum 0
remaining*: integer | null - minimum 0
exhausted*: boolean
periodStart*: string | null
periodEnd*: string | null
(no other fields)
}
lastRunAt*: string | null
latestDelivery*: match one or more
- {
id*: string(uuid)
occurredAt*: string(date-time)
success*: boolean
errorMessage*: string | null
discordMessageId*: string | null
warningMessage*: string | null
(no other fields)
}
- null
lastSuccessfulDelivery*: match one or more
- {
id*: string(uuid)
occurredAt*: string(date-time)
success*: boolean
errorMessage*: string | null
discordMessageId*: string | null
warningMessage*: string | null
(no other fields)
}
- null
lastRunOutcome*: enum("sent" | "no_results" | "failed" | null)
(no other fields)
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}Automations
/automations
List automations
Use this to inventory custom Notion and Discord automations before creating, replacing, disabling, or deleting automation configuration.
Responses
200AutomationsView response body
[
{
id*: string(uuid)
name*: string
isPaused: boolean
pausedAt: string | null
pauseReasonCode: string | null
pauseReasonDetail: string | null
enabled*: boolean
trigger*: match one or more
-
match one or more:
- {
eventTypes*: enum("page_created" | "page_updated" | "page_deleted" | "comment_created")[]
filters*: [
match one or more:
- {
dateValue*: match one or more
- object
- object
id*: string - minimum length 1; maximum length 200
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - maximum length 200
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 200
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - maximum length 200
values*: string[]
(no other fields)
}
]
kind*: "notion"
notionWorkspaceId*: match one or more
- string(uuid)
- null
source*: match one or more
- {
notionWorkspaceId: match one or more
- string(uuid)
- null
sourceType*: "all"
(no other fields)
}
- {
dataSourceId*: string - maximum length 200
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
sourceType*: "database"
(no other fields)
}
- {
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
pageId*: string - maximum length 200
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
(no other fields)
}
updateTypes*: enum("properties" | "content")[]
watchedProperties*: string[] - maximum items 100
(no other fields)
}
- {
threadStateChange: enum("closed" | "reopened" | "locked" | "unlocked")
discordInstallationId*: match one or more
- string(uuid)
- ""
eventType*: enum("message_created" | "thread_created" | "channel_created" | "thread_state_changed")
filters* {
onlyLinkedThreads: boolean
ignoreBotMessages*: boolean
ignoreWebhookMessages*: boolean
rules*: [
match one or more:
- {
field*: ""
id*: string
operator*: ""
value*: object
(no other fields)
}
- {
field*: "message_author"
id*: string
operator*: "is_any_of"
value*: object
(no other fields)
}
- {
field*: "discord_member"
id*: string
operator*: "is_any_of"
value*: object
(no other fields)
}
- {
field*: "author_role"
id*: string
operator*: "has_any_of"
value*: object
(no other fields)
}
- {
field*: "message_text"
id*: string
operator*: enum("contains" | "starts_with")
value*: object
(no other fields)
}
- {
field*: "has_attachment"
id*: string
operator*: "is"
value*: object
(no other fields)
}
- {
field*: "has_link"
id*: string
operator*: "is"
value*: object
(no other fields)
}
- {
field*: "message_mentions"
id*: string
operator*: "includes_any_of"
value*: object
(no other fields)
}
] - maximum items 20
(no other fields)
}
kind*: "discord"
scope*: match one or more
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "channel"
(no other fields)
}
- {
kind*: "thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
categoryId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "category"
(no other fields)
}
(no other fields)
}
- null
(no other fields)
}
]401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/automations
Create an automation
Use this to add a blank-custom automation with one trigger, optional filters, and ordered granular actions. Update Notion page changes exactly one Page title or Status, Select, People or Rich text property per action. Linked targets require a unique registered page/thread relationship; thread-state events observe registered threads only. Dynamic People recipients use explicit identity links and never guess an account. Public API automation management does not run automations directly.
Request body
Required JSON request bodyView schema and example
{
actions*: [
match one or more:
- {
targetType*: enum("thread" | "channel")
visibility: enum("public" | "private")
discordInstallationId*: match one or more
- string(uuid)
- ""
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "create_or_reuse_discord_channel_or_thread"
nameTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
parentCategoryId*: match one or more
-
match one or more:
- string - pattern ^\d{17,19}$
- ""
- null
parentChannelId*: match one or more
-
match one or more:
- string - pattern ^\d{17,19}$
- ""
- null
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_people_or_roles_to_discord_channel_or_thread"
targets*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
target*: match one or more
-
match one or more:
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_thread"
(no other fields)
}
- {
kind*: "linked_thread"
(no other fields)
}
recipients: match one or more
- {
kind*: "fixed"
targets*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
(no other fields)
}
- {
kind*: "notion_people"
notionWorkspaceId*: match one or more
- string(uuid)
- ""
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
(no other fields)
}
- {
kind*: "linked_requester"
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "create_notion_page"
notionWorkspaceId*: match one or more
- string(uuid)
- null
propertyMappings*: [
{
propertyId*: string - maximum length 200
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
] - maximum items 50
target*: match one or more
- {
dataSourceId*: string - maximum length 200
kind*: "database"
(no other fields)
}
- {
kind*: "page"
pageId*: string - maximum length 200
(no other fields)
}
titleTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
channelOrThreadTarget*: match one or more
-
match one or more:
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_conversation"
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_discord_embed_to_notion_page"
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
notionWorkspaceId*: match one or more
- string(uuid)
- null
(no other fields)
}
- {
contentTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_comment_to_notion_page"
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
notionWorkspaceId*: match one or more
- string(uuid)
- null
(no other fields)
}
- {
contentTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "send_plain_discord_message"
mentions*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
target*: match one or more
- {
kind*: "linked_thread"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_discord_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_discord_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_discord_channel"
(no other fields)
}
- {
kind*: "trigger_discord_thread"
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "update_notion_page"
notionWorkspaceId*: match one or more
- string(uuid)
- null
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
property*: match one or more
- {
kind*: "page_title"
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
kind*: "status"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
optionId*: string - maximum length 200
(no other fields)
}
- {
kind*: "select"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
optionId*: string - maximum length 200
(no other fields)
}
- {
kind*: "rich_text"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
kind*: "people"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
operation*: enum("set" | "clear")
people*: [
{
notionWorkspaceId*: string(uuid)
personId*: string(uuid)
(no other fields)
}
] - maximum items 100
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "change_discord_thread_state"
operation*: enum("close" | "close_and_lock" | "reopen" | "lock" | "unlock")
target*: match one or more
- {
kind*: "fixed_thread"
discordInstallationId*: match one or more
- string(uuid)
- ""
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_thread"
(no other fields)
}
- {
kind*: "linked_thread"
(no other fields)
}
- {
kind*: "action"
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
(no other fields)
}
(no other fields)
}
] - maximum items 20
enabled*: boolean
name*: string - maximum length 120
trigger*: match one or more
-
match one or more:
- {
eventTypes*: enum("page_created" | "page_updated" | "page_deleted" | "comment_created")[]
filters*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string
kind*: "fixed"
(no other fields)
}
- {
days*: integer
kind*: "relative"
(no other fields)
}
id*: string - minimum length 1; maximum length 200
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - maximum length 200
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 200
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - maximum length 200
values*: string[]
(no other fields)
}
]
kind*: "notion"
notionWorkspaceId*: string(uuid)
source*: match one or more
- {
notionWorkspaceId: match one or more
- string(uuid)
- null
sourceType*: "all"
(no other fields)
}
- {
dataSourceId*: string - maximum length 200
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
sourceType*: "database"
(no other fields)
}
- {
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
pageId*: string - maximum length 200
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
(no other fields)
}
updateTypes*: enum("properties" | "content")[]
watchedProperties*: string[] - maximum items 100
(no other fields)
}
- {
threadStateChange: enum("closed" | "reopened" | "locked" | "unlocked")
discordInstallationId*: match one or more
- string(uuid)
- ""
eventType*: enum("message_created" | "thread_created" | "channel_created" | "thread_state_changed")
filters* {
onlyLinkedThreads: boolean
ignoreBotMessages*: boolean
ignoreWebhookMessages*: boolean
rules*: [
match one or more:
- {
field*: ""
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: ""
value* {
kind*: "empty"
(no other fields)
}
(no other fields)
}
- {
field*: "message_author"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is_any_of"
value* {
members*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "discord_member"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is_any_of"
value* {
members*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "author_role"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "has_any_of"
value* {
roles*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "message_text"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: enum("contains" | "starts_with")
value* {
text*: string
(no other fields)
}
(no other fields)
}
- {
field*: "has_attachment"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is"
value* {
choice*: "yes"
(no other fields)
}
(no other fields)
}
- {
field*: "has_link"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is"
value* {
choice*: "yes"
(no other fields)
}
(no other fields)
}
- {
field*: "message_mentions"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "includes_any_of"
value* {
mentions*: object[]
(no other fields)
}
(no other fields)
}
] - maximum items 20
(no other fields)
}
kind*: "discord"
scope*: match one or more
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "channel"
(no other fields)
}
- {
kind*: "thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
categoryId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "category"
(no other fields)
}
(no other fields)
}
- null
(no other fields)
} - Actions run in array order and require unique IDs. A target with kind=action references an earlier action by actionId, whose output must match the target type. Template segments can reference earlier outputs by actionId and variableId. When reordering API actions, keep each producer before its consumers. Shapes and field limits are checked for every request; enabling also checks event/action compatibility, references, required configuration, and provider access. Semantic configuration errors include issues with paths to the affected fields or actions. A failed action skips later actions without rolling back earlier effects.Example
{
"name": "Lead room setup",
"enabled": true,
"trigger": {
"kind": "notion",
"eventTypes": [
"page_created"
],
"notionWorkspaceId": "11111111-1111-4111-8111-111111111111",
"source": {
"sourceType": "database",
"dataSourceId": "notion-data-source-id",
"notionWorkspaceId": "11111111-1111-4111-8111-111111111111"
},
"filters": [],
"updateTypes": [
"properties",
"content"
],
"watchedProperties": []
},
"actions": [
{
"id": "create-room",
"kind": "create_or_reuse_discord_channel_or_thread",
"targetType": "thread",
"discordInstallationId": "11111111-1111-4111-8111-111111111111",
"parentChannelId": "123456789012345678",
"parentCategoryId": null,
"nameTemplate": {
"segments": [
{
"kind": "text",
"text": "Lead: "
},
{
"kind": "variable",
"reference": {
"kind": "trigger",
"variableId": "notion.title"
}
}
]
}
},
{
"id": "send-details",
"kind": "send_plain_discord_message",
"target": {
"kind": "action",
"actionId": "create-room"
},
"mentions": [],
"contentTemplate": {
"segments": [
{
"kind": "text",
"text": "Created "
},
{
"kind": "variable",
"reference": {
"kind": "action",
"actionId": "create-room",
"variableId": "discord.channel_or_thread_url"
}
}
]
}
}
]
}Responses
201Created automation idView response body
{
id*: string(uuid)
(no other fields)
}Example
{
"id": "00000000-0000-0000-0000-000000000000"
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/automations/{automationId}
Get an automation
Use this to fetch the complete automation configuration before editing or cloning it.
Parameters
automationIdstring(uuid)Responses
200AutomationView response body
{
id*: string(uuid)
name*: string
isPaused: boolean
pausedAt: string | null
pauseReasonCode: string | null
pauseReasonDetail: string | null
enabled*: boolean
trigger*: match one or more
-
match one or more:
- {
eventTypes*: enum("page_created" | "page_updated" | "page_deleted" | "comment_created")[]
filters*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string
kind*: "fixed"
(no other fields)
}
- {
days*: integer
kind*: "relative"
(no other fields)
}
id*: string - minimum length 1; maximum length 200
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - maximum length 200
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 200
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - maximum length 200
values*: string[]
(no other fields)
}
]
kind*: "notion"
notionWorkspaceId*: match one or more
- string(uuid)
- null
source*: match one or more
- {
notionWorkspaceId: match one or more
- string(uuid)
- null
sourceType*: "all"
(no other fields)
}
- {
dataSourceId*: string - maximum length 200
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
sourceType*: "database"
(no other fields)
}
- {
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
pageId*: string - maximum length 200
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
(no other fields)
}
updateTypes*: enum("properties" | "content")[]
watchedProperties*: string[] - maximum items 100
(no other fields)
}
- {
threadStateChange: enum("closed" | "reopened" | "locked" | "unlocked")
discordInstallationId*: match one or more
- string(uuid)
- ""
eventType*: enum("message_created" | "thread_created" | "channel_created" | "thread_state_changed")
filters* {
onlyLinkedThreads: boolean
ignoreBotMessages*: boolean
ignoreWebhookMessages*: boolean
rules*: [
match one or more:
- {
field*: ""
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: ""
value* {
kind*: "empty"
(no other fields)
}
(no other fields)
}
- {
field*: "message_author"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is_any_of"
value* {
members*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "discord_member"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is_any_of"
value* {
members*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "author_role"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "has_any_of"
value* {
roles*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "message_text"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: enum("contains" | "starts_with")
value* {
text*: string
(no other fields)
}
(no other fields)
}
- {
field*: "has_attachment"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is"
value* {
choice*: "yes"
(no other fields)
}
(no other fields)
}
- {
field*: "has_link"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is"
value* {
choice*: "yes"
(no other fields)
}
(no other fields)
}
- {
field*: "message_mentions"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "includes_any_of"
value* {
mentions*: object[]
(no other fields)
}
(no other fields)
}
] - maximum items 20
(no other fields)
}
kind*: "discord"
scope*: match one or more
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "channel"
(no other fields)
}
- {
kind*: "thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
categoryId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "category"
(no other fields)
}
(no other fields)
}
- null
actions*: [
match one or more:
- {
targetType*: enum("thread" | "channel")
visibility: enum("public" | "private")
discordInstallationId*: match one or more
- string(uuid)
- ""
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "create_or_reuse_discord_channel_or_thread"
nameTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
parentCategoryId*: match one or more
-
match one or more:
- string - pattern ^\d{17,19}$
- ""
- null
parentChannelId*: match one or more
-
match one or more:
- string - pattern ^\d{17,19}$
- ""
- null
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_people_or_roles_to_discord_channel_or_thread"
targets*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
target*: match one or more
-
match one or more:
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_thread"
(no other fields)
}
- {
kind*: "linked_thread"
(no other fields)
}
recipients: match one or more
- {
kind*: "fixed"
targets*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
(no other fields)
}
- {
kind*: "notion_people"
notionWorkspaceId*: match one or more
- string(uuid)
- ""
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
(no other fields)
}
- {
kind*: "linked_requester"
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "create_notion_page"
notionWorkspaceId*: match one or more
- string(uuid)
- null
propertyMappings*: [
{
propertyId*: string - maximum length 200
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
] - maximum items 50
target*: match one or more
- {
dataSourceId*: string - maximum length 200
kind*: "database"
(no other fields)
}
- {
kind*: "page"
pageId*: string - maximum length 200
(no other fields)
}
titleTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
channelOrThreadTarget*: match one or more
-
match one or more:
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_conversation"
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_discord_embed_to_notion_page"
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
notionWorkspaceId*: match one or more
- string(uuid)
- null
(no other fields)
}
- {
contentTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_comment_to_notion_page"
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
notionWorkspaceId*: match one or more
- string(uuid)
- null
(no other fields)
}
- {
contentTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "send_plain_discord_message"
mentions*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
target*: match one or more
- {
kind*: "linked_thread"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_discord_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_discord_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_discord_channel"
(no other fields)
}
- {
kind*: "trigger_discord_thread"
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "update_notion_page"
notionWorkspaceId*: match one or more
- string(uuid)
- null
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
property*: match one or more
- {
kind*: "page_title"
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
kind*: "status"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
optionId*: string - maximum length 200
(no other fields)
}
- {
kind*: "select"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
optionId*: string - maximum length 200
(no other fields)
}
- {
kind*: "rich_text"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
kind*: "people"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
operation*: enum("set" | "clear")
people*: [
{
notionWorkspaceId*: string(uuid)
personId*: string(uuid)
(no other fields)
}
] - maximum items 100
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "change_discord_thread_state"
operation*: enum("close" | "close_and_lock" | "reopen" | "lock" | "unlock")
target*: match one or more
- {
kind*: "fixed_thread"
discordInstallationId*: match one or more
- string(uuid)
- ""
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_thread"
(no other fields)
}
- {
kind*: "linked_thread"
(no other fields)
}
- {
kind*: "action"
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
(no other fields)
}
(no other fields)
}
]
(no other fields)
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/automations/{automationId}
Replace an automation configuration
Use this to replace the full automation configuration, including enabled state, trigger, filters, and ordered actions.
Parameters
automationIdstring(uuid)Request body
Required JSON request bodyView schema and example
{
actions*: [
match one or more:
- {
targetType*: enum("thread" | "channel")
visibility: enum("public" | "private")
discordInstallationId*: match one or more
- string(uuid)
- ""
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "create_or_reuse_discord_channel_or_thread"
nameTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
parentCategoryId*: match one or more
-
match one or more:
- string - pattern ^\d{17,19}$
- ""
- null
parentChannelId*: match one or more
-
match one or more:
- string - pattern ^\d{17,19}$
- ""
- null
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_people_or_roles_to_discord_channel_or_thread"
targets*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
target*: match one or more
-
match one or more:
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_thread"
(no other fields)
}
- {
kind*: "linked_thread"
(no other fields)
}
recipients: match one or more
- {
kind*: "fixed"
targets*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
(no other fields)
}
- {
kind*: "notion_people"
notionWorkspaceId*: match one or more
- string(uuid)
- ""
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
(no other fields)
}
- {
kind*: "linked_requester"
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "create_notion_page"
notionWorkspaceId*: match one or more
- string(uuid)
- null
propertyMappings*: [
{
propertyId*: string - maximum length 200
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
] - maximum items 50
target*: match one or more
- {
dataSourceId*: string - maximum length 200
kind*: "database"
(no other fields)
}
- {
kind*: "page"
pageId*: string - maximum length 200
(no other fields)
}
titleTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
channelOrThreadTarget*: match one or more
-
match one or more:
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_conversation"
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_discord_embed_to_notion_page"
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
notionWorkspaceId*: match one or more
- string(uuid)
- null
(no other fields)
}
- {
contentTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_comment_to_notion_page"
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
notionWorkspaceId*: match one or more
- string(uuid)
- null
(no other fields)
}
- {
contentTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "send_plain_discord_message"
mentions*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
target*: match one or more
- {
kind*: "linked_thread"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_discord_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_discord_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_discord_channel"
(no other fields)
}
- {
kind*: "trigger_discord_thread"
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "update_notion_page"
notionWorkspaceId*: match one or more
- string(uuid)
- null
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
property*: match one or more
- {
kind*: "page_title"
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
kind*: "status"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
optionId*: string - maximum length 200
(no other fields)
}
- {
kind*: "select"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
optionId*: string - maximum length 200
(no other fields)
}
- {
kind*: "rich_text"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
kind*: "people"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
operation*: enum("set" | "clear")
people*: [
{
notionWorkspaceId*: string(uuid)
personId*: string(uuid)
(no other fields)
}
] - maximum items 100
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "change_discord_thread_state"
operation*: enum("close" | "close_and_lock" | "reopen" | "lock" | "unlock")
target*: match one or more
- {
kind*: "fixed_thread"
discordInstallationId*: match one or more
- string(uuid)
- ""
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_thread"
(no other fields)
}
- {
kind*: "linked_thread"
(no other fields)
}
- {
kind*: "action"
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
(no other fields)
}
(no other fields)
}
] - maximum items 20
enabled*: boolean
name*: string - maximum length 120
trigger*: match one or more
-
match one or more:
- {
eventTypes*: enum("page_created" | "page_updated" | "page_deleted" | "comment_created")[]
filters*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string
kind*: "fixed"
(no other fields)
}
- {
days*: integer
kind*: "relative"
(no other fields)
}
id*: string - minimum length 1; maximum length 200
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - maximum length 200
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 200
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - maximum length 200
values*: string[]
(no other fields)
}
]
kind*: "notion"
notionWorkspaceId*: string(uuid)
source*: match one or more
- {
notionWorkspaceId: match one or more
- string(uuid)
- null
sourceType*: "all"
(no other fields)
}
- {
dataSourceId*: string - maximum length 200
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
sourceType*: "database"
(no other fields)
}
- {
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
pageId*: string - maximum length 200
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
(no other fields)
}
updateTypes*: enum("properties" | "content")[]
watchedProperties*: string[] - maximum items 100
(no other fields)
}
- {
threadStateChange: enum("closed" | "reopened" | "locked" | "unlocked")
discordInstallationId*: match one or more
- string(uuid)
- ""
eventType*: enum("message_created" | "thread_created" | "channel_created" | "thread_state_changed")
filters* {
onlyLinkedThreads: boolean
ignoreBotMessages*: boolean
ignoreWebhookMessages*: boolean
rules*: [
match one or more:
- {
field*: ""
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: ""
value* {
kind*: "empty"
(no other fields)
}
(no other fields)
}
- {
field*: "message_author"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is_any_of"
value* {
members*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "discord_member"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is_any_of"
value* {
members*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "author_role"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "has_any_of"
value* {
roles*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "message_text"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: enum("contains" | "starts_with")
value* {
text*: string
(no other fields)
}
(no other fields)
}
- {
field*: "has_attachment"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is"
value* {
choice*: "yes"
(no other fields)
}
(no other fields)
}
- {
field*: "has_link"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is"
value* {
choice*: "yes"
(no other fields)
}
(no other fields)
}
- {
field*: "message_mentions"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "includes_any_of"
value* {
mentions*: object[]
(no other fields)
}
(no other fields)
}
] - maximum items 20
(no other fields)
}
kind*: "discord"
scope*: match one or more
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "channel"
(no other fields)
}
- {
kind*: "thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
categoryId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "category"
(no other fields)
}
(no other fields)
}
- null
(no other fields)
} - Actions run in array order and require unique IDs. A target with kind=action references an earlier action by actionId, whose output must match the target type. Template segments can reference earlier outputs by actionId and variableId. When reordering API actions, keep each producer before its consumers. Shapes and field limits are checked for every request; enabling also checks event/action compatibility, references, required configuration, and provider access. Semantic configuration errors include issues with paths to the affected fields or actions. A failed action skips later actions without rolling back earlier effects.Example
{
"name": "Lead room setup",
"enabled": true,
"trigger": {
"kind": "notion",
"eventTypes": [
"page_created"
],
"notionWorkspaceId": "11111111-1111-4111-8111-111111111111",
"source": {
"sourceType": "database",
"dataSourceId": "notion-data-source-id",
"notionWorkspaceId": "11111111-1111-4111-8111-111111111111"
},
"filters": [],
"updateTypes": [
"properties",
"content"
],
"watchedProperties": []
},
"actions": [
{
"id": "create-room",
"kind": "create_or_reuse_discord_channel_or_thread",
"targetType": "thread",
"discordInstallationId": "11111111-1111-4111-8111-111111111111",
"parentChannelId": "123456789012345678",
"parentCategoryId": null,
"nameTemplate": {
"segments": [
{
"kind": "text",
"text": "Lead: "
},
{
"kind": "variable",
"reference": {
"kind": "trigger",
"variableId": "notion.title"
}
}
]
}
},
{
"id": "send-details",
"kind": "send_plain_discord_message",
"target": {
"kind": "action",
"actionId": "create-room"
},
"mentions": [],
"contentTemplate": {
"segments": [
{
"kind": "text",
"text": "Created "
},
{
"kind": "variable",
"reference": {
"kind": "action",
"actionId": "create-room",
"variableId": "discord.channel_or_thread_url"
}
}
]
}
}
]
}Responses
200Updated automationView response body
{
id*: string(uuid)
name*: string
isPaused: boolean
pausedAt: string | null
pauseReasonCode: string | null
pauseReasonDetail: string | null
enabled*: boolean
trigger*: match one or more
-
match one or more:
- {
eventTypes*: enum("page_created" | "page_updated" | "page_deleted" | "comment_created")[]
filters*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string
kind*: "fixed"
(no other fields)
}
- {
days*: integer
kind*: "relative"
(no other fields)
}
id*: string - minimum length 1; maximum length 200
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - maximum length 200
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 200
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - maximum length 200
values*: string[]
(no other fields)
}
]
kind*: "notion"
notionWorkspaceId*: match one or more
- string(uuid)
- null
source*: match one or more
- {
notionWorkspaceId: match one or more
- string(uuid)
- null
sourceType*: "all"
(no other fields)
}
- {
dataSourceId*: string - maximum length 200
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
sourceType*: "database"
(no other fields)
}
- {
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
pageId*: string - maximum length 200
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
(no other fields)
}
updateTypes*: enum("properties" | "content")[]
watchedProperties*: string[] - maximum items 100
(no other fields)
}
- {
threadStateChange: enum("closed" | "reopened" | "locked" | "unlocked")
discordInstallationId*: match one or more
- string(uuid)
- ""
eventType*: enum("message_created" | "thread_created" | "channel_created" | "thread_state_changed")
filters* {
onlyLinkedThreads: boolean
ignoreBotMessages*: boolean
ignoreWebhookMessages*: boolean
rules*: [
match one or more:
- {
field*: ""
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: ""
value* {
kind*: "empty"
(no other fields)
}
(no other fields)
}
- {
field*: "message_author"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is_any_of"
value* {
members*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "discord_member"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is_any_of"
value* {
members*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "author_role"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "has_any_of"
value* {
roles*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "message_text"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: enum("contains" | "starts_with")
value* {
text*: string
(no other fields)
}
(no other fields)
}
- {
field*: "has_attachment"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is"
value* {
choice*: "yes"
(no other fields)
}
(no other fields)
}
- {
field*: "has_link"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is"
value* {
choice*: "yes"
(no other fields)
}
(no other fields)
}
- {
field*: "message_mentions"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "includes_any_of"
value* {
mentions*: object[]
(no other fields)
}
(no other fields)
}
] - maximum items 20
(no other fields)
}
kind*: "discord"
scope*: match one or more
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "channel"
(no other fields)
}
- {
kind*: "thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
categoryId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "category"
(no other fields)
}
(no other fields)
}
- null
actions*: [
match one or more:
- {
targetType*: enum("thread" | "channel")
visibility: enum("public" | "private")
discordInstallationId*: match one or more
- string(uuid)
- ""
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "create_or_reuse_discord_channel_or_thread"
nameTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
parentCategoryId*: match one or more
-
match one or more:
- string - pattern ^\d{17,19}$
- ""
- null
parentChannelId*: match one or more
-
match one or more:
- string - pattern ^\d{17,19}$
- ""
- null
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_people_or_roles_to_discord_channel_or_thread"
targets*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
target*: match one or more
-
match one or more:
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_thread"
(no other fields)
}
- {
kind*: "linked_thread"
(no other fields)
}
recipients: match one or more
- {
kind*: "fixed"
targets*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
(no other fields)
}
- {
kind*: "notion_people"
notionWorkspaceId*: match one or more
- string(uuid)
- ""
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
(no other fields)
}
- {
kind*: "linked_requester"
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "create_notion_page"
notionWorkspaceId*: match one or more
- string(uuid)
- null
propertyMappings*: [
{
propertyId*: string - maximum length 200
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
] - maximum items 50
target*: match one or more
- {
dataSourceId*: string - maximum length 200
kind*: "database"
(no other fields)
}
- {
kind*: "page"
pageId*: string - maximum length 200
(no other fields)
}
titleTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
channelOrThreadTarget*: match one or more
-
match one or more:
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_conversation"
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_discord_embed_to_notion_page"
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
notionWorkspaceId*: match one or more
- string(uuid)
- null
(no other fields)
}
- {
contentTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_comment_to_notion_page"
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
notionWorkspaceId*: match one or more
- string(uuid)
- null
(no other fields)
}
- {
contentTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "send_plain_discord_message"
mentions*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
target*: match one or more
- {
kind*: "linked_thread"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_discord_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_discord_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_discord_channel"
(no other fields)
}
- {
kind*: "trigger_discord_thread"
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "update_notion_page"
notionWorkspaceId*: match one or more
- string(uuid)
- null
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
property*: match one or more
- {
kind*: "page_title"
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
kind*: "status"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
optionId*: string - maximum length 200
(no other fields)
}
- {
kind*: "select"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
optionId*: string - maximum length 200
(no other fields)
}
- {
kind*: "rich_text"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
kind*: "people"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
operation*: enum("set" | "clear")
people*: [
{
notionWorkspaceId*: string(uuid)
personId*: string(uuid)
(no other fields)
}
] - maximum items 100
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "change_discord_thread_state"
operation*: enum("close" | "close_and_lock" | "reopen" | "lock" | "unlock")
target*: match one or more
- {
kind*: "fixed_thread"
discordInstallationId*: match one or more
- string(uuid)
- ""
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_thread"
(no other fields)
}
- {
kind*: "linked_thread"
(no other fields)
}
- {
kind*: "action"
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
(no other fields)
}
(no other fields)
}
]
(no other fields)
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/automations/{automationId}
Delete an automation
Use this to remove an automation that should no longer be part of the NotiCord setup.
Parameters
automationIdstring(uuid)Responses
204Deleted; no response bodyView response body
401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/automations/{automationId}/enabled
Enable or disable an automation
Use this to toggle automation execution without changing the saved trigger, filters, or actions.
Parameters
automationIdstring(uuid)Request body
Required JSON request bodyView schema and example
{
enabled*: boolean
(no other fields)
}Example
{
"enabled": true
}Responses
200Updated automationView response body
{
id*: string(uuid)
name*: string
isPaused: boolean
pausedAt: string | null
pauseReasonCode: string | null
pauseReasonDetail: string | null
enabled*: boolean
trigger*: match one or more
-
match one or more:
- {
eventTypes*: enum("page_created" | "page_updated" | "page_deleted" | "comment_created")[]
filters*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string
kind*: "fixed"
(no other fields)
}
- {
days*: integer
kind*: "relative"
(no other fields)
}
id*: string - minimum length 1; maximum length 200
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - maximum length 200
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 200
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - maximum length 200
values*: string[]
(no other fields)
}
]
kind*: "notion"
notionWorkspaceId*: match one or more
- string(uuid)
- null
source*: match one or more
- {
notionWorkspaceId: match one or more
- string(uuid)
- null
sourceType*: "all"
(no other fields)
}
- {
dataSourceId*: string - maximum length 200
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
sourceType*: "database"
(no other fields)
}
- {
notionWorkspaceId: match one or more
-
match one or more:
- string(uuid)
- ""
- null
pageId*: string - maximum length 200
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
(no other fields)
}
updateTypes*: enum("properties" | "content")[]
watchedProperties*: string[] - maximum items 100
(no other fields)
}
- {
threadStateChange: enum("closed" | "reopened" | "locked" | "unlocked")
discordInstallationId*: match one or more
- string(uuid)
- ""
eventType*: enum("message_created" | "thread_created" | "channel_created" | "thread_state_changed")
filters* {
onlyLinkedThreads: boolean
ignoreBotMessages*: boolean
ignoreWebhookMessages*: boolean
rules*: [
match one or more:
- {
field*: ""
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: ""
value* {
kind*: "empty"
(no other fields)
}
(no other fields)
}
- {
field*: "message_author"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is_any_of"
value* {
members*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "discord_member"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is_any_of"
value* {
members*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "author_role"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "has_any_of"
value* {
roles*: object[]
(no other fields)
}
(no other fields)
}
- {
field*: "message_text"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: enum("contains" | "starts_with")
value* {
text*: string
(no other fields)
}
(no other fields)
}
- {
field*: "has_attachment"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is"
value* {
choice*: "yes"
(no other fields)
}
(no other fields)
}
- {
field*: "has_link"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "is"
value* {
choice*: "yes"
(no other fields)
}
(no other fields)
}
- {
field*: "message_mentions"
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
operator*: "includes_any_of"
value* {
mentions*: object[]
(no other fields)
}
(no other fields)
}
] - maximum items 20
(no other fields)
}
kind*: "discord"
scope*: match one or more
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "channel"
(no other fields)
}
- {
kind*: "thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
categoryId*: match one or more
- string - pattern ^\d{17,19}$
- ""
kind*: "category"
(no other fields)
}
(no other fields)
}
- null
actions*: [
match one or more:
- {
targetType*: enum("thread" | "channel")
visibility: enum("public" | "private")
discordInstallationId*: match one or more
- string(uuid)
- ""
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "create_or_reuse_discord_channel_or_thread"
nameTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
parentCategoryId*: match one or more
-
match one or more:
- string - pattern ^\d{17,19}$
- ""
- null
parentChannelId*: match one or more
-
match one or more:
- string - pattern ^\d{17,19}$
- ""
- null
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_people_or_roles_to_discord_channel_or_thread"
targets*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
target*: match one or more
-
match one or more:
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_thread"
(no other fields)
}
- {
kind*: "linked_thread"
(no other fields)
}
recipients: match one or more
- {
kind*: "fixed"
targets*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
(no other fields)
}
- {
kind*: "notion_people"
notionWorkspaceId*: match one or more
- string(uuid)
- ""
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
(no other fields)
}
- {
kind*: "linked_requester"
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "create_notion_page"
notionWorkspaceId*: match one or more
- string(uuid)
- null
propertyMappings*: [
{
propertyId*: string - maximum length 200
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
] - maximum items 50
target*: match one or more
- {
dataSourceId*: string - maximum length 200
kind*: "database"
(no other fields)
}
- {
kind*: "page"
pageId*: string - maximum length 200
(no other fields)
}
titleTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
channelOrThreadTarget*: match one or more
-
match one or more:
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_conversation"
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_discord_embed_to_notion_page"
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
notionWorkspaceId*: match one or more
- string(uuid)
- null
(no other fields)
}
- {
contentTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "add_comment_to_notion_page"
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
notionWorkspaceId*: match one or more
- string(uuid)
- null
(no other fields)
}
- {
contentTemplate* {
segments*: [
match one or more:
- {
kind*: "text"
text*: string - maximum length 2000
(no other fields)
}
- {
kind*: "variable"
reference*: match one or more
- object
- object
(no other fields)
}
] - maximum items 50
(no other fields)
}
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "send_plain_discord_message"
mentions*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
target*: match one or more
- {
kind*: "linked_thread"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
channelId*: match one or more
- string - pattern ^\d{17,19}$
- ""
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_discord_channel"
(no other fields)
}
- {
discordInstallationId*: match one or more
- string(uuid)
- ""
kind*: "fixed_discord_thread"
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_discord_channel"
(no other fields)
}
- {
kind*: "trigger_discord_thread"
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "update_notion_page"
notionWorkspaceId*: match one or more
- string(uuid)
- null
notionPageTarget*: match one or more
- {
kind*: "linked_page"
(no other fields)
}
- {
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
kind*: "action"
(no other fields)
}
- {
kind*: "fixed_page"
pageId*: string - maximum length 200
(no other fields)
}
- {
kind*: "trigger_page"
(no other fields)
}
property*: match one or more
- {
kind*: "page_title"
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
kind*: "status"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
optionId*: string - maximum length 200
(no other fields)
}
- {
kind*: "select"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
optionId*: string - maximum length 200
(no other fields)
}
- {
kind*: "rich_text"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
valueTemplate* {
segments*: [
match one or more:
- object
- object
] - maximum items 50
(no other fields)
}
(no other fields)
}
- {
kind*: "people"
dataSourceId*: string - maximum length 200
propertyId*: string - maximum length 200
operation*: enum("set" | "clear")
people*: [
{
notionWorkspaceId*: string(uuid)
personId*: string(uuid)
(no other fields)
}
] - maximum items 100
(no other fields)
}
(no other fields)
}
- {
id*: string - minimum length 1; maximum length 80; pattern ^[A-Za-z0-9_-]+$
kind*: "change_discord_thread_state"
operation*: enum("close" | "close_and_lock" | "reopen" | "lock" | "unlock")
target*: match one or more
- {
kind*: "fixed_thread"
discordInstallationId*: match one or more
- string(uuid)
- ""
threadId*: match one or more
- string - pattern ^\d{17,19}$
- ""
(no other fields)
}
- {
kind*: "trigger_thread"
(no other fields)
}
- {
kind*: "linked_thread"
(no other fields)
}
- {
kind*: "action"
actionId*: string - maximum length 80; pattern ^[A-Za-z0-9_-]*$
(no other fields)
}
(no other fields)
}
]
(no other fields)
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/automations/{id}/health
Read automation execution health
Read saved enablement and pause state, latest run with completed action results and current action, last retained successful run, and current capacities. Running means completion was not recorded, including after interruption; it is not worker liveness. Failed runs may contain successful effects: reconcile them before repeating writes. Notification quota applies to message actions. No provider calls, execution or retries.
Parameters
idstring(uuid)Responses
200Automation healthView response body
{
id*: string(uuid)
enabled*: boolean
isPaused*: boolean
pausedAt*: string | null
pauseReasonCode*: enum("notion_connection_required" | "notion_token_invalid" | "notion_source_unavailable" | "discord_channel_unavailable" | "discord_missing_access" | "discord_missing_permissions" | "discord_recipient_unavailable" | "discord_direct_message_unavailable" | null)
pauseReasonDetail*: string | null
pauseMessage*: string | null
recoveryAction*: match one or more
- {
actionKind*: enum("app" | "docs")
actionLabel*: string
actionPath*: string
(no other fields)
}
- null
resourceCapacity* {
used*: integer - minimum 0
limit*: integer | null - minimum 0
remaining*: integer | null - minimum 0
exhausted*: boolean
(no other fields)
}
notificationQuota* {
used*: integer - minimum 0
limit*: integer | null - minimum 0
remaining*: integer | null - minimum 0
exhausted*: boolean
periodStart*: string | null
periodEnd*: string | null
(no other fields)
}
latestRun*: match one or more
- {
id*: string(uuid)
createdAt*: string(date-time)
status*: enum("running" | "failed" | "skipped" | "success")
sourceIdentity*: string | null
triggerEvent*: string
filterStatus*: enum("matched" | "not_matched" | "not_evaluated")
currentActionId*: string | null
errorMessage*: string | null
actionResults*: [
{
actionId*: string
actionKind*: enum("create_or_reuse_discord_channel_or_thread" | "add_people_or_roles_to_discord_channel_or_thread" | "create_notion_page" | "add_discord_embed_to_notion_page" | "add_comment_to_notion_page" | "send_plain_discord_message" | "update_notion_page" | "change_discord_thread_state")
status*: enum("success" | "skipped" | "failed")
message*: string | null
(no other fields)
}
]
(no other fields)
}
- null
lastSuccessfulRun*: match one or more
- {
id*: string(uuid)
createdAt*: string(date-time)
status*: enum("running" | "failed" | "skipped" | "success")
sourceIdentity*: string | null
triggerEvent*: string
filterStatus*: enum("matched" | "not_matched" | "not_evaluated")
currentActionId*: string | null
errorMessage*: string | null
actionResults*: [
{
actionId*: string
actionKind*: enum("create_or_reuse_discord_channel_or_thread" | "add_people_or_roles_to_discord_channel_or_thread" | "create_notion_page" | "add_discord_embed_to_notion_page" | "add_comment_to_notion_page" | "send_plain_discord_message" | "update_notion_page" | "change_discord_thread_state")
status*: enum("success" | "skipped" | "failed")
message*: string | null
(no other fields)
}
]
(no other fields)
}
- null
(no other fields)
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}Create commands
/create-commands
List create commands
Use this to inventory Discord create-page commands before creating, replacing, or deleting command configuration.
Responses
200Create commandsView response body
[
choose one:
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
id*: string(uuid)
name*: string
createCommandName*: string
messageActionEnabled*: boolean
(no other fields)
}
]401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/create-commands
Create a create command
Use this to add a Discord create-page command that creates Notion pages according to a configured source, modal, thread behavior, and quick actions.
Request body
Required JSON request bodyView schema and example
{
match one or more:
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
sourceType*: "all"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
dataSourceId*: string(uuid)
sourceType*: "database"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
pageId*: string(uuid)
sourceType*: "page"
}
actionGroups*: [
match one or more:
- {
actions*: [
match one or more:
- {
kind*: "set_option"
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
- {
kind*: "upload_files"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 5
presentation*: "buttons"
(no other fields)
}
- {
actions*: [
{
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
(no other fields)
}
] - maximum items 25
label*: string - maximum length 80
presentation*: "dropdown"
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
] - maximum items 5
createCommandConfig* {
createCommandName*: string - minimum length 1; maximum length 32; pattern ^[a-z0-9]+(?:-[a-z0-9]+)*$
messageActionEnabled*: boolean
fixedValues: [
{
propertyId*: string - minimum length 1; maximum length 200
propertyName*: string - minimum length 1; maximum length 200
propertyType*: enum("rich_text" | "number" | "select" | "multi_select" | "date" | "checkbox" | "url" | "email" | "phone_number" | "status")
value*: match one or more
- string - maximum length 2000
- string[]
(no other fields)
}
] - default []
modalFields*: [
{
propertyId*: string - minimum length 1; maximum length 200
propertyName*: string - minimum length 1; maximum length 200
propertyType*: enum("title" | "rich_text" | "number" | "select" | "multi_select" | "date" | "people" | "checkbox" | "url" | "email" | "phone_number" | "status" | "relation" | "content" | "attachments")
required*: boolean
(no other fields)
}
] - maximum items 5
(no other fields)
}
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[] - minimum items 1
mentionAssignees: boolean
(no other fields)
}
name*: string - minimum length 1; maximum length 80
threadConfig*: match one or more
- {
enabled*: false
(no other fields)
}
- {
additionalMembers*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
enabled*: true
parentChannelId*: string - pattern ^\d{17,19}$
(no other fields)
}
}
(no other fields)Example
{
"notionWorkspaceId": "22222222-2222-4222-8222-222222222222",
"sourceType": "all",
"name": "Create page",
"actionGroups": [],
"itemPresentation": {
"cardLocale": "en-US",
"fields": [
"__title__"
],
"mentionAssignees": false,
"displaySettings": {
"includeContentFiles": true,
"showEmptySelectedProperties": true,
"showOnlyChangedOnUpdate": false
}
},
"createCommandConfig": {
"createCommandName": "create-page",
"messageActionEnabled": false,
"modalFields": [
{
"propertyId": "__title__",
"propertyName": "Title",
"propertyType": "title",
"required": true
}
]
},
"threadConfig": {
"enabled": false
}
}Responses
200Created command idView response body
{
id*: string(uuid)
(no other fields)
}Example
{
"id": "00000000-0000-0000-0000-000000000000"
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/create-commands/{commandId}
Get a create command
Use this to fetch the complete create-command configuration before editing or cloning it.
Parameters
commandIdstring(uuid)Responses
200Create commandView response body
choose one:
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
id*: string(uuid)
name*: string
createCommandConfig* {
createCommandName*: string
messageActionEnabled*: boolean
modalFields*: [
{
propertyId*: string
propertyName*: string
propertyType*: enum("title" | "rich_text" | "number" | "select" | "multi_select" | "date" | "people" | "checkbox" | "url" | "email" | "phone_number" | "status" | "relation" | "content" | "attachments")
required*: boolean
(no other fields)
}
]
fixedValues*: [
{
propertyId*: string
propertyName*: string
propertyType*: enum("rich_text" | "number" | "select" | "multi_select" | "date" | "checkbox" | "url" | "email" | "phone_number" | "status")
value*: choose one
- string
- string[]
(no other fields)
}
]
(no other fields)
}
threadConfig*: choose one
- {
enabled*: false
(no other fields)
}
- {
enabled*: true
parentChannelId*: string - Discord snowflake id.; minimum length 17; maximum length 19
additionalMembers*: [
{
kind*: enum("role" | "user")
id*: string
label*: string
(no other fields)
}
]
(no other fields)
}
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[]
mentionAssignees: boolean
(no other fields)
}
actionGroups*: [
choose one:
- {
presentation*: "buttons"
actions*: [
choose one:
- {
kind*: "set_option"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
optionName*: string
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
]
(no other fields)
}
- {
presentation*: "dropdown"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
actions*: [
{
label*: string
optionName*: string
(no other fields)
}
]
(no other fields)
}
]
(no other fields)
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/create-commands/{commandId}
Replace a create command configuration
Use this to replace the full create-command configuration, including source, slash command name, modal fields, message action, thread settings, fields, and quick actions.
Parameters
commandIdstring(uuid)Request body
Required JSON request bodyView schema and example
{
match one or more:
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
sourceType*: "all"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
dataSourceId*: string(uuid)
sourceType*: "database"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
pageId*: string(uuid)
sourceType*: "page"
}
actionGroups*: [
match one or more:
- {
actions*: [
match one or more:
- {
kind*: "set_option"
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
- {
kind*: "upload_files"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 5
presentation*: "buttons"
(no other fields)
}
- {
actions*: [
{
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
(no other fields)
}
] - maximum items 25
label*: string - maximum length 80
presentation*: "dropdown"
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
] - maximum items 5
createCommandConfig* {
createCommandName*: string - minimum length 1; maximum length 32; pattern ^[a-z0-9]+(?:-[a-z0-9]+)*$
messageActionEnabled*: boolean
fixedValues: [
{
propertyId*: string - minimum length 1; maximum length 200
propertyName*: string - minimum length 1; maximum length 200
propertyType*: enum("rich_text" | "number" | "select" | "multi_select" | "date" | "checkbox" | "url" | "email" | "phone_number" | "status")
value*: match one or more
- string - maximum length 2000
- string[]
(no other fields)
}
] - default []
modalFields*: [
{
propertyId*: string - minimum length 1; maximum length 200
propertyName*: string - minimum length 1; maximum length 200
propertyType*: enum("title" | "rich_text" | "number" | "select" | "multi_select" | "date" | "people" | "checkbox" | "url" | "email" | "phone_number" | "status" | "relation" | "content" | "attachments")
required*: boolean
(no other fields)
}
] - maximum items 5
(no other fields)
}
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[] - minimum items 1
mentionAssignees: boolean
(no other fields)
}
name*: string - minimum length 1; maximum length 80
threadConfig*: match one or more
- {
enabled*: false
(no other fields)
}
- {
additionalMembers*: [
{
id*: string - pattern ^\d{17,19}$
kind*: enum("user" | "role")
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 10
enabled*: true
parentChannelId*: string - pattern ^\d{17,19}$
(no other fields)
}
}
(no other fields)Example
{
"notionWorkspaceId": "22222222-2222-4222-8222-222222222222",
"sourceType": "all",
"name": "Create page",
"actionGroups": [],
"itemPresentation": {
"cardLocale": "en-US",
"fields": [
"__title__"
],
"mentionAssignees": false,
"displaySettings": {
"includeContentFiles": true,
"showEmptySelectedProperties": true,
"showOnlyChangedOnUpdate": false
}
},
"createCommandConfig": {
"createCommandName": "create-page",
"messageActionEnabled": false,
"modalFields": [
{
"propertyId": "__title__",
"propertyName": "Title",
"propertyType": "title",
"required": true
}
]
},
"threadConfig": {
"enabled": false
}
}Responses
200UpdatedView response body
{
success*: true
(no other fields)
}Example
{
"success": true
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/create-commands/{commandId}
Delete a create command
Use this to remove a create-page command that should no longer be part of the NotiCord setup or available from the Discord server.
Parameters
commandIdstring(uuid)Responses
200DeletedView response body
{
success*: true
(no other fields)
}Example
{
"success": true
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}Page lists
/page-lists
List page list commands
Use this to inventory Discord page-list commands before creating, replacing, or deleting command configuration.
Responses
200Page listsView response body
[
choose one:
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
id*: string(uuid)
name*: string
channelSharing*: enum("off" | "one_time" | "refreshable")
commandName*: string
(no other fields)
}
]401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/page-lists
Create a page list command
Use this to add a Discord page-list command that lists Notion pages or database items using configured filters, sorting, fields, and quick actions.
Request body
Required JSON request bodyView schema and example
{
match one or more:
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
sourceType*: "all"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
dataSourceId*: string(uuid)
sourceType*: "database"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
pageId*: string(uuid)
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
}
actionGroups*: [
match one or more:
- {
actions*: [
match one or more:
- {
kind*: "set_option"
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
- {
kind*: "upload_files"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 5
presentation*: "buttons"
(no other fields)
}
- {
actions*: [
{
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
(no other fields)
}
] - maximum items 25
label*: string - maximum length 80
presentation*: "dropdown"
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
] - maximum items 5
channelSharing*: enum("off" | "one_time" | "refreshable")
commandName*: string - minimum length 1; maximum length 32; pattern ^[a-z0-9]+(?:-[a-z0-9]+)*$
filterRules*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string - pattern ^\d{4}-\d{2}-\d{2}$
kind*: "fixed"
(no other fields)
}
- {
days*: integer - minimum -3650; maximum 3650
kind*: "relative"
(no other fields)
}
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - minimum length 1; maximum length 200
(no other fields)
}
- {
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - minimum length 1; maximum length 200
values*: string[]
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[] - minimum items 1
mentionAssignees: boolean
(no other fields)
}
listPresentation* {
rowFields*: string[] - minimum items 1
showHeader*: boolean
sort* {
direction*: enum("asc" | "desc")
fieldId*: string - minimum length 1; maximum length 200
(no other fields)
}
(no other fields)
}
name*: string - minimum length 1; maximum length 80
}
(no other fields)Example
{
"notionWorkspaceId": "22222222-2222-4222-8222-222222222222",
"sourceType": "all",
"name": "Recent pages",
"channelSharing": "one_time",
"commandName": "pages",
"filterRules": [],
"actionGroups": [],
"itemPresentation": {
"cardLocale": "en-US",
"fields": [
"__title__"
],
"mentionAssignees": false,
"displaySettings": {
"includeContentFiles": true,
"showEmptySelectedProperties": true,
"showOnlyChangedOnUpdate": false
}
},
"listPresentation": {
"rowFields": [
"__title__"
],
"showHeader": true,
"sort": {
"fieldId": "__last_edited_time__",
"direction": "desc"
}
}
}Responses
200Created page list idView response body
{
id*: string(uuid)
(no other fields)
}Example
{
"id": "00000000-0000-0000-0000-000000000000"
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/page-lists/{listId}
Get a page list command
Use this to fetch the complete page-list command configuration before editing or cloning it, including is-me filters and People quick actions.
Parameters
listIdstring(uuid)Responses
200Page listView response body
choose one:
- {
sourceType*: enum("all" | "database" | "page")
notionWorkspaceId: string(uuid) | null
dataSourceId*: string(uuid) | null
pageId*: string(uuid) | null
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages" | null)
id*: string(uuid)
name*: string
channelSharing*: enum("off" | "one_time" | "refreshable")
commandName*: string
filterRules*: [
choose one:
- {
propertyId*: string
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
dateValue*: choose one
- {
kind*: "fixed"
date*: string(date)
(no other fields)
}
- {
kind*: "relative"
days*: integer - Relative day offset where 0 is today, 1 is tomorrow, and -1 is yesterday.; minimum -3650; maximum 3650
(no other fields)
}
(no other fields)
}
- {
propertyId*: string
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
values*: string[]
(no other fields)
}
]
listPresentation* {
rowFields*: string[]
showHeader*: boolean
sort* {
fieldId*: string
direction*: enum("asc" | "desc")
(no other fields)
}
(no other fields)
}
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[]
mentionAssignees: boolean
(no other fields)
}
actionGroups*: [
choose one:
- {
presentation*: "buttons"
actions*: [
choose one:
- {
kind*: "set_option"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
optionName*: string
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string
propertyId*: string
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string
(no other fields)
}
- {
kind*: "upload_files"
label*: string
(no other fields)
}
]
(no other fields)
}
- {
presentation*: "dropdown"
label*: string
propertyId*: string
propertyType*: enum("status" | "select")
actions*: [
{
label*: string
optionName*: string
(no other fields)
}
]
(no other fields)
}
]
(no other fields)
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/page-lists/{listId}
Replace a page list command configuration
Use this to replace the full page-list command configuration, including source, slash command name, filters, list layout, fields, and quick actions.
Parameters
listIdstring(uuid)Request body
Required JSON request bodyView schema and example
{
match one or more:
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
sourceType*: "all"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
dataSourceId*: string(uuid)
sourceType*: "database"
}
- {
notionWorkspaceId: string(uuid) - Connection id from GET /notion/workspaces. Required for creation when multiple workspaces are connected; updates retain the saved connection when omitted.
pageId*: string(uuid)
pageScopeMode*: enum("page_only" | "subpages_only" | "page_and_subpages")
sourceType*: "page"
}
actionGroups*: [
match one or more:
- {
actions*: [
match one or more:
- {
kind*: "set_option"
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
- {
kind*: "assign_to_me"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "assign_to_teammate"
label*: string - minimum length 1; maximum length 80
propertyId*: string - minimum length 1; maximum length 200
propertyType*: "people"
(no other fields)
}
- {
kind*: "add_comment"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
- {
kind*: "upload_files"
label*: string - minimum length 1; maximum length 80
(no other fields)
}
] - maximum items 5
presentation*: "buttons"
(no other fields)
}
- {
actions*: [
{
label*: string - minimum length 1; maximum length 80
optionName*: string - minimum length 1; maximum length 100
(no other fields)
}
] - maximum items 25
label*: string - maximum length 80
presentation*: "dropdown"
propertyId*: string - minimum length 1; maximum length 200
propertyType*: enum("status" | "select")
(no other fields)
}
] - maximum items 5
channelSharing*: enum("off" | "one_time" | "refreshable")
commandName*: string - minimum length 1; maximum length 32; pattern ^[a-z0-9]+(?:-[a-z0-9]+)*$
filterRules*: [
match one or more:
- {
dateValue*: match one or more
- {
date*: string - pattern ^\d{4}-\d{2}-\d{2}$
kind*: "fixed"
(no other fields)
}
- {
days*: integer - minimum -3650; maximum 3650
kind*: "relative"
(no other fields)
}
operator*: enum("on" | "before" | "after" | "on_or_before" | "on_or_after")
propertyId*: string - minimum length 1; maximum length 200
(no other fields)
}
- {
operator*: enum("is" | "is_not" | "contains" | "is_set" | "is_not_set" | "equals" | "not_equals" | "greater_than" | "greater_than_or_equal" | "less_than" | "less_than_or_equal" | "is_me" | "is_unassigned")
propertyId*: string - minimum length 1; maximum length 200
values*: string[]
(no other fields)
}
]
itemPresentation* {
cardLocale*: enum("en-US" | "pt-BR" | "es-ES" | "pl-PL" | "fr-FR" | "ja-JP" | "de-DE" | "ko-KR" | "zh-TW" | "it-IT" | "id-ID" | "tr-TR" | "nl-NL")
displaySettings* {
includeContentFiles*: boolean
showEmptySelectedProperties*: boolean
showOnlyChangedOnUpdate*: boolean
(no other fields)
}
fields*: string[] - minimum items 1
mentionAssignees: boolean
(no other fields)
}
listPresentation* {
rowFields*: string[] - minimum items 1
showHeader*: boolean
sort* {
direction*: enum("asc" | "desc")
fieldId*: string - minimum length 1; maximum length 200
(no other fields)
}
(no other fields)
}
name*: string - minimum length 1; maximum length 80
}
(no other fields)Example
{
"notionWorkspaceId": "22222222-2222-4222-8222-222222222222",
"sourceType": "all",
"name": "Recent pages",
"channelSharing": "one_time",
"commandName": "pages",
"filterRules": [],
"actionGroups": [],
"itemPresentation": {
"cardLocale": "en-US",
"fields": [
"__title__"
],
"mentionAssignees": false,
"displaySettings": {
"includeContentFiles": true,
"showEmptySelectedProperties": true,
"showOnlyChangedOnUpdate": false
}
},
"listPresentation": {
"rowFields": [
"__title__"
],
"showHeader": true,
"sort": {
"fieldId": "__last_edited_time__",
"direction": "desc"
}
}
}Responses
200UpdatedView response body
{
success*: true
(no other fields)
}Example
{
"success": true
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}409Choose a Notion workspace connectionView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "WORKSPACE_SCOPE_REQUIRED",
"error": "Select notionWorkspaceId from GET /api/v1/notion/workspaces."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/page-lists/{listId}
Delete a page list command
Use this to remove a page-list command that should no longer be part of the NotiCord setup or available from the Discord server.
Parameters
listIdstring(uuid)Responses
200DeletedView response body
{
success*: true
(no other fields)
}Example
{
"success": true
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}Panels
/panels
List Discord panels
Use this to inventory Discord panels before creating, replacing, publishing, or deleting panel configuration.
Responses
200PanelsView response body
[
{
id*: string(uuid)
name*: string
channelId*: string | null - minimum length 17; maximum length 19
status*: enum("draft" | "published" | "needs_update")
publication*: match one or more
- {
publishedAt*: string(date-time)
channelId*: string
discordMessageId*: string
(no other fields)
}
- null
(no other fields)
}
]401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/panels
Create a Discord panel
Use this to add a Discord panel that can launch already configured create commands or page-list commands from a text-channel message or a new forum post. Existing threads and announcement channels are not panel destinations.
Request body
Required JSON request bodyView schema and example
{
actions*: [
match one or more:
- {
emoji*: match one or more
- string - maximum length 40
- null
label*: string - minimum length 1; maximum length 80
style*: enum("primary" | "secondary" | "success" | "danger")
createCommandId*: string(uuid)
kind*: "open_create_command"
parentPage: match one or more
- {
icon*: match one or more
- string
- null
id*: string(uuid)
notionWorkspaceId*: match one or more
- string(uuid)
- null
parentType: match one or more
- string
- null
title*: string - minimum length 1
url*: string(uri) - pattern ^https:\/\/.*
workspaceName*: match one or more
- string
- null
(no other fields)
}
- null
(no other fields)
}
- {
emoji*: match one or more
- string - maximum length 40
- null
label*: string - minimum length 1; maximum length 80
style*: enum("primary" | "secondary" | "success" | "danger")
kind*: "open_page_list"
pageListId*: string(uuid)
(no other fields)
}
] - minimum items 1; maximum items 10
channelId*: match one or more
- string - pattern ^\d{17,19}$
- null
description*: match one or more
- string - maximum length 3876
- null
heading*: match one or more
- string - maximum length 120
- null
name*: string - minimum length 1; maximum length 80
(no other fields)
}Example
{
"name": "Team actions",
"heading": "What do you need?",
"description": "Choose an action below.",
"channelId": "123456789012345678",
"actions": [
{
"kind": "open_create_command",
"createCommandId": "00000000-0000-0000-0000-000000000000",
"label": "New ticket",
"emoji": null,
"style": "primary"
}
]
}Responses
200Created panel idView response body
{
id*: string(uuid)
(no other fields)
}Example
{
"id": "00000000-0000-0000-0000-000000000000"
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/panels/{panelId}
Get a Discord panel
Use this to fetch the complete saved panel configuration before editing, publishing, or cloning it.
Parameters
panelIdstring(uuid)Responses
200PanelView response body
{
id*: string(uuid)
name*: string
heading*: string | null
description*: string | null
channelId*: string | null - minimum length 17; maximum length 19
status*: enum("draft" | "published" | "needs_update")
publication*: match one or more
- {
publishedAt*: string(date-time)
channelId*: string
discordMessageId*: string
(no other fields)
}
- null
actions*: [
choose one:
- {
kind*: "open_create_command"
createCommandId*: string(uuid)
label*: string
emoji*: string | null
parentPage: choose one
- {
icon*: string | null
id*: string(uuid)
notionWorkspaceId*: string(uuid) | null
parentType: string | null
title*: string
url*: string(uri) - pattern ^https://
workspaceName*: string | null
(no other fields)
}
- null
style*: enum("primary" | "secondary" | "success" | "danger")
(no other fields)
}
- {
kind*: "open_page_list"
pageListId*: string(uuid)
label*: string
emoji*: string | null
style*: enum("primary" | "secondary" | "success" | "danger")
(no other fields)
}
]
(no other fields)
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/panels/{panelId}
Replace a Discord panel configuration
Use this to replace the full panel configuration, including heading, description, target channel, and actions linked to existing create commands or page lists.
Parameters
panelIdstring(uuid)Request body
Required JSON request bodyView schema and example
{
actions*: [
match one or more:
- {
emoji*: match one or more
- string - maximum length 40
- null
label*: string - minimum length 1; maximum length 80
style*: enum("primary" | "secondary" | "success" | "danger")
createCommandId*: string(uuid)
kind*: "open_create_command"
parentPage: match one or more
- {
icon*: match one or more
- string
- null
id*: string(uuid)
notionWorkspaceId*: match one or more
- string(uuid)
- null
parentType: match one or more
- string
- null
title*: string - minimum length 1
url*: string(uri) - pattern ^https:\/\/.*
workspaceName*: match one or more
- string
- null
(no other fields)
}
- null
(no other fields)
}
- {
emoji*: match one or more
- string - maximum length 40
- null
label*: string - minimum length 1; maximum length 80
style*: enum("primary" | "secondary" | "success" | "danger")
kind*: "open_page_list"
pageListId*: string(uuid)
(no other fields)
}
] - minimum items 1; maximum items 10
channelId*: match one or more
- string - pattern ^\d{17,19}$
- null
description*: match one or more
- string - maximum length 3876
- null
heading*: match one or more
- string - maximum length 120
- null
name*: string - minimum length 1; maximum length 80
(no other fields)
}Example
{
"name": "Team actions",
"heading": "What do you need?",
"description": "Choose an action below.",
"channelId": "123456789012345678",
"actions": [
{
"kind": "open_create_command",
"createCommandId": "00000000-0000-0000-0000-000000000000",
"label": "New ticket",
"emoji": null,
"style": "primary"
}
]
}Responses
200UpdatedView response body
{
success*: true
(no other fields)
}Example
{
"success": true
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/panels/{panelId}
Delete a Discord panel and its published message if present
Use this to remove a panel that should no longer be part of the NotiCord Discord command surface; published panel messages are removed when possible.
Parameters
panelIdstring(uuid)Responses
200DeletedView response body
{
success*: true
(no other fields)
}Example
{
"success": true
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}/panels/{panelId}/publish
Publish or update a panel message in Discord
Use this after creating or updating a panel to publish the configured panel message to Discord or refresh the already published message.
Parameters
panelIdstring(uuid)Responses
200PublishedView response body
{
success*: true
warning: string
(no other fields)
}Example
{
"success": true
}400Validation or configuration errorView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid input",
"issues": [
{
"path": [
"name"
],
"message": "Name is required"
}
]
}401Missing, invalid, revoked, or over-plan API keyView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Invalid API key"
}403Inactive subscription, plan, or capacity limit blocked the requestView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"code": "SUBSCRIPTION_ACCESS_REQUIRED",
"error": "NotiCord service access is blocked until the subscription is restored."
}404Resource not foundView response body
{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Not found"
}429Rate limit exceededView response body
Headers
Retry-AfterintegerX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-RateLimit-Day-LimitintegerX-RateLimit-Day-RemainingintegerX-RateLimit-Day-Resetinteger{
action {
href*: string
kind*: string
label*: string
(no other fields)
}
code: string
current: integer
error*: string
limit: integer
issues: [
{
path*: [
choose one:
- string
- integer
]
message*: string
(no other fields)
}
]
(no other fields)
}Example
{
"error": "Rate limit exceeded"
}Docs
/docs
Human-readable API documentation
Use this when a human needs the readable contract for configuring NotiCord through the public API. It exists only to document the stable API surface.
Responses
200API documentationView response body
string/openapi.json
OpenAPI document
Use this when an AI agent, script, or API client needs the machine-readable contract for configuring NotiCord through the public API.
Responses
200OpenAPI JSONView response body
{
[key: string]: value
}