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.

Version 1.0.0Server https://app.noticord.com/api/v1Bearer API key auth
Jump to endpoint
Use 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

GET /notion/workspaces

List connected Notion workspaces

When to use

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.

API key required

Responses

200Connected workspacesView response body
application/jsonShape, * required
[
  {
    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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /notion/databases

List shared Notion databases and data sources

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
NamenotionWorkspaceId
Inquery
Requiredno
DescriptionSubscription-local connection id from GET /notion/workspaces. Required when multiple workspaces are connected. This is not Notion’s workspaceId.
Schemastring(uuid)
Namerefresh
Inquery
Requiredno
DescriptionSet to true to refresh Notion directory cache.
Schemaboolean

Responses

200Databases available to the Notion connectionView response body
application/jsonShape, * required
[
  {
    notionWorkspaceId*: string(uuid) | null
    dataSourceId*: string(uuid)
    name*: string
    (no other fields)
  }
]
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /notion/databases/{dataSourceId}

Get one Notion database/data-source with properties

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
NamedataSourceId
Inpath
Requiredyes
DescriptionNotion data source id.
Schemastring(uuid)
NamenotionWorkspaceId
Inquery
Requiredno
DescriptionSubscription-local connection id from GET /notion/workspaces. Required when multiple workspaces are connected. This is not Notion’s workspaceId.
Schemastring(uuid)

Responses

200Database detailView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /notion/databases/{dataSourceId}/relation-pages/search

Search pages for a relation property on a Notion database

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
NamedataSourceId
Inpath
Requiredyes
DescriptionNotion data source id.
Schemastring(uuid)
NamenotionWorkspaceId
Inquery
Requiredno
DescriptionSubscription-local connection id from GET /notion/workspaces. Required when multiple workspaces are connected. This is not Notion’s workspaceId.
Schemastring(uuid)
NamepropertyId
Inquery
Requiredyes
DescriptionRelation property id on the source database.
Schemastring
Namequery
Inquery
Requiredno
DescriptionSearch text.
Schemastring

Responses

200Matching relation pagesView response body
application/jsonShape, * required
[
  {
    notionWorkspaceId*: string(uuid) | null
    id*: string(uuid)
    title*: string
    (no other fields)
  }
]
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /notion/pages/search

Search shared Notion pages

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
NamenotionWorkspaceId
Inquery
Requiredno
DescriptionSubscription-local connection id from GET /notion/workspaces. Required when multiple workspaces are connected. This is not Notion’s workspaceId.
Schemastring(uuid)
Namequery
Inquery
Requiredno
DescriptionSearch text, 1 to 200 characters.
Schemastring

Responses

200Matching pagesView response body
application/jsonShape, * required
[
  {
    notionWorkspaceId*: string(uuid) | null
    id*: string(uuid)
    title*: string
    (no other fields)
  }
]
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /notion/users

List Notion users for people-field values

When to use

Use this when configuration needs a Notion user id for People-property filter values or create-command People modal fields.

API key required

Parameters

NameInRequiredDescriptionSchema
NamenotionWorkspaceId
Inquery
Requiredno
DescriptionSubscription-local connection id from GET /notion/workspaces. Required when multiple workspaces are connected. This is not Notion’s workspaceId.
Schemastring(uuid)

Responses

200Notion usersView response body
application/jsonShape, * required
[
  {
    id*: string
    name*: string
    (no other fields)
  }
]
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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

GET /discord/guild-installations

List connected Discord servers and usable channels

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
Namepurpose
Inquery
Requiredno
DescriptionPanel destination discovery.
Schemaenum("panels")

Responses

200Connected servers with channelsView response body
application/jsonShape, * required
[
  {
    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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /discord/direct-message-recipients

List allowed direct-message workflow recipients

When to use

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.

API key required

Responses

200Allowed DM recipientsView response body
application/jsonShape, * required
[
  {
    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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /discord/guild-install

Get a selected Discord server and usable channels

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
NamediscordInstallationId
Inquery
Requiredno
DescriptionInstallation id from GET /discord/guild-installations. Required when multiple servers are connected.
Schemastring(uuid)
Namepurpose
Inquery
Requiredno
DescriptionPanel destination discovery.
Schemaenum("panels")

Responses

200Connected server with channelsView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
POST /discord/guild-install/notion-link-unfurls

Enable or disable Discord replies for pasted Notion links

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
NamediscordInstallationId
Inquery
Requiredno
DescriptionInstallation id from GET /discord/guild-installations. Required when multiple servers are connected.
Schemastring(uuid)

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  enabled*: boolean
  (no other fields)
}
Example
{
  "enabled": true
}

Responses

200Updated settingView response body
application/jsonShape, * required
{
  enabled*: boolean
  (no other fields)
}
Example
{
  "enabled": true
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
POST /discord/guild-install/{guildInstallId}/notion-link-unfurls

Set pasted Notion link previews for one server

When to use

Updates only the subscription-owned installation selected by its id.

API key required

Parameters

NameInRequiredDescriptionSchema
NameguildInstallId
Inpath
Requiredyes
DescriptionInstallation id from GET /discord/guild-installations.
Schemastring(uuid)

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  enabled*: boolean
  (no other fields)
}
Example
{
  "enabled": true
}

Responses

200Updated settingView response body
application/jsonShape, * required
{
  enabled*: boolean
  (no other fields)
}
Example
{
  "enabled": true
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /discord/guild-install/mention-targets

Search Discord roles and users for mentions and thread members

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
NamediscordInstallationId
Inquery
Requiredno
DescriptionInstallation id from GET /discord/guild-installations. Required when multiple servers are connected.
Schemastring(uuid)
Namequery
Inquery
Requiredno
DescriptionOptional search text for roles and users.
Schemastring

Responses

200Mention targetsView response body
application/jsonShape, * required
{
  targets*: [
    {
      id*: string
      kind*: enum("role" | "user")
      label*: string
      (no other fields)
    }
  ]
  (no other fields)
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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

GET /notification-rules

List notification rules

When to use

Use this to inventory existing notification rules before creating, replacing, disabling, or deleting NotiCord notification configuration. Channel and direct-message destinations are returned.

API key required

Responses

200RulesView response body
application/jsonShape, * required
[
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
POST /notification-rules

Create a notification rule

When to use

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.

API key required

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
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
application/jsonShape, * required
{
  id*: string(uuid)
  (no other fields)
}
Example
{
  "id": "00000000-0000-0000-0000-000000000000"
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /notification-rules/{id}

Get a notification rule

When to use

Use this to fetch the complete notification rule configuration before editing or cloning it, including channel and direct-message destinations.

API key required

Parameters

NameInRequiredDescriptionSchema
Nameid
Inpath
Requiredyes
DescriptionNotification rule id.
Schemastring(uuid)

Responses

200RuleView response body
application/jsonShape, * required
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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
PUT /notification-rules/{id}

Replace a notification rule configuration

When to use

Use this to replace the full notification rule configuration, including enabled state, source, destination, filters, schedule, fields, mentions, and quick actions.

API key required

Parameters

NameInRequiredDescriptionSchema
Nameid
Inpath
Requiredyes
DescriptionNotification rule id.
Schemastring(uuid)

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
DELETE /notification-rules/{id}

Delete a notification rule

When to use

Use this to remove a notification rule that should no longer be part of the NotiCord setup.

API key required

Parameters

NameInRequiredDescriptionSchema
Nameid
Inpath
Requiredyes
DescriptionNotification rule id.
Schemastring(uuid)

Responses

204Deleted; no response bodyView response body
401Missing, invalid, revoked, or over-plan API keyView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /notification-rules/{id}/health

Read notification delivery health

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
Nameid
Inpath
Requiredyes
DescriptionNotification rule id.
Schemastring(uuid)

Responses

200Notification healthView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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

GET /scheduled-summaries

List scheduled summaries

When to use

Use this to inventory existing scheduled summaries before creating, replacing, disabling, or deleting NotiCord summary configuration. Channel and direct-message destinations are returned.

API key required

Responses

200SummariesView response body
application/jsonShape, * required
[
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
POST /scheduled-summaries

Create a scheduled summary

When to use

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.

API key required

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  id*: string(uuid)
  (no other fields)
}
Example
{
  "id": "00000000-0000-0000-0000-000000000000"
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /scheduled-summaries/{summaryId}

Get a scheduled summary

When to use

Use this to fetch the complete scheduled summary configuration before editing or cloning it, including channel and direct-message destinations.

API key required

Parameters

NameInRequiredDescriptionSchema
NamesummaryId
Inpath
Requiredyes
DescriptionScheduled summary id.
Schemastring(uuid)

Responses

200SummaryView response body
application/jsonShape, * required
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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
PUT /scheduled-summaries/{summaryId}

Replace a scheduled summary configuration

When to use

Use this to replace the full scheduled summary configuration, including enabled state, source, destination, filters, schedule, list layout, fields, mentions, and quick actions.

API key required

Parameters

NameInRequiredDescriptionSchema
NamesummaryId
Inpath
Requiredyes
DescriptionScheduled summary id.
Schemastring(uuid)

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  success*: true
  (no other fields)
}
Example
{
  "success": true
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
DELETE /scheduled-summaries/{summaryId}

Delete a scheduled summary

When to use

Use this to remove a scheduled summary that should no longer be part of the NotiCord setup.

API key required

Parameters

NameInRequiredDescriptionSchema
NamesummaryId
Inpath
Requiredyes
DescriptionScheduled summary id.
Schemastring(uuid)

Responses

204Deleted; no response bodyView response body
401Missing, invalid, revoked, or over-plan API keyView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /scheduled-summaries/{id}/health

Read scheduled summary delivery health

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
Nameid
Inpath
Requiredyes
DescriptionScheduled summary id.
Schemastring(uuid)

Responses

200Summary healthView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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

GET /automations

List automations

When to use

Use this to inventory custom Notion and Discord automations before creating, replacing, disabling, or deleting automation configuration.

API key required

Responses

200AutomationsView response body
application/jsonShape, * required
[
  {
    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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
POST /automations

Create an automation

When to use

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.

API key required

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  id*: string(uuid)
  (no other fields)
}
Example
{
  "id": "00000000-0000-0000-0000-000000000000"
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /automations/{automationId}

Get an automation

When to use

Use this to fetch the complete automation configuration before editing or cloning it.

API key required

Parameters

NameInRequiredDescriptionSchema
NameautomationId
Inpath
Requiredyes
DescriptionAutomation id.
Schemastring(uuid)

Responses

200AutomationView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
PUT /automations/{automationId}

Replace an automation configuration

When to use

Use this to replace the full automation configuration, including enabled state, trigger, filters, and ordered actions.

API key required

Parameters

NameInRequiredDescriptionSchema
NameautomationId
Inpath
Requiredyes
DescriptionAutomation id.
Schemastring(uuid)

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
DELETE /automations/{automationId}

Delete an automation

When to use

Use this to remove an automation that should no longer be part of the NotiCord setup.

API key required

Parameters

NameInRequiredDescriptionSchema
NameautomationId
Inpath
Requiredyes
DescriptionAutomation id.
Schemastring(uuid)

Responses

204Deleted; no response bodyView response body
401Missing, invalid, revoked, or over-plan API keyView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
PUT /automations/{automationId}/enabled

Enable or disable an automation

When to use

Use this to toggle automation execution without changing the saved trigger, filters, or actions.

API key required

Parameters

NameInRequiredDescriptionSchema
NameautomationId
Inpath
Requiredyes
DescriptionAutomation id.
Schemastring(uuid)

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  enabled*: boolean
  (no other fields)
}
Example
{
  "enabled": true
}

Responses

200Updated automationView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /automations/{id}/health

Read automation execution health

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
Nameid
Inpath
Requiredyes
DescriptionAutomation id.
Schemastring(uuid)

Responses

200Automation healthView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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

GET /create-commands

List create commands

When to use

Use this to inventory Discord create-page commands before creating, replacing, or deleting command configuration.

API key required

Responses

200Create commandsView response body
application/jsonShape, * required
[
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
POST /create-commands

Create a create command

When to use

Use this to add a Discord create-page command that creates Notion pages according to a configured source, modal, thread behavior, and quick actions.

API key required

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  id*: string(uuid)
  (no other fields)
}
Example
{
  "id": "00000000-0000-0000-0000-000000000000"
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /create-commands/{commandId}

Get a create command

When to use

Use this to fetch the complete create-command configuration before editing or cloning it.

API key required

Parameters

NameInRequiredDescriptionSchema
NamecommandId
Inpath
Requiredyes
DescriptionCreate command id.
Schemastring(uuid)

Responses

200Create commandView response body
application/jsonShape, * required
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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
PUT /create-commands/{commandId}

Replace a create command configuration

When to use

Use this to replace the full create-command configuration, including source, slash command name, modal fields, message action, thread settings, fields, and quick actions.

API key required

Parameters

NameInRequiredDescriptionSchema
NamecommandId
Inpath
Requiredyes
DescriptionCreate command id.
Schemastring(uuid)

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  success*: true
  (no other fields)
}
Example
{
  "success": true
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
DELETE /create-commands/{commandId}

Delete a create command

When to use

Use this to remove a create-page command that should no longer be part of the NotiCord setup or available from the Discord server.

API key required

Parameters

NameInRequiredDescriptionSchema
NamecommandId
Inpath
Requiredyes
DescriptionCreate command id.
Schemastring(uuid)

Responses

200DeletedView response body
application/jsonShape, * required
{
  success*: true
  (no other fields)
}
Example
{
  "success": true
}
401Missing, invalid, revoked, or over-plan API keyView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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

GET /page-lists

List page list commands

When to use

Use this to inventory Discord page-list commands before creating, replacing, or deleting command configuration.

API key required

Responses

200Page listsView response body
application/jsonShape, * required
[
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
POST /page-lists

Create a page list command

When to use

Use this to add a Discord page-list command that lists Notion pages or database items using configured filters, sorting, fields, and quick actions.

API key required

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  id*: string(uuid)
  (no other fields)
}
Example
{
  "id": "00000000-0000-0000-0000-000000000000"
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /page-lists/{listId}

Get a page list command

When to use

Use this to fetch the complete page-list command configuration before editing or cloning it, including is-me filters and People quick actions.

API key required

Parameters

NameInRequiredDescriptionSchema
NamelistId
Inpath
Requiredyes
DescriptionPage list id.
Schemastring(uuid)

Responses

200Page listView response body
application/jsonShape, * required
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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
PUT /page-lists/{listId}

Replace a page list command configuration

When to use

Use this to replace the full page-list command configuration, including source, slash command name, filters, list layout, fields, and quick actions.

API key required

Parameters

NameInRequiredDescriptionSchema
NamelistId
Inpath
Requiredyes
DescriptionPage list id.
Schemastring(uuid)

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  success*: true
  (no other fields)
}
Example
{
  "success": true
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
DELETE /page-lists/{listId}

Delete a page list command

When to use

Use this to remove a page-list command that should no longer be part of the NotiCord setup or available from the Discord server.

API key required

Parameters

NameInRequiredDescriptionSchema
NamelistId
Inpath
Requiredyes
DescriptionPage list id.
Schemastring(uuid)

Responses

200DeletedView response body
application/jsonShape, * required
{
  success*: true
  (no other fields)
}
Example
{
  "success": true
}
401Missing, invalid, revoked, or over-plan API keyView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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

GET /panels

List Discord panels

When to use

Use this to inventory Discord panels before creating, replacing, publishing, or deleting panel configuration.

API key required

Responses

200PanelsView response body
application/jsonShape, * required
[
  {
    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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
POST /panels

Create a Discord panel

When to use

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.

API key required

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  id*: string(uuid)
  (no other fields)
}
Example
{
  "id": "00000000-0000-0000-0000-000000000000"
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
GET /panels/{panelId}

Get a Discord panel

When to use

Use this to fetch the complete saved panel configuration before editing, publishing, or cloning it.

API key required

Parameters

NameInRequiredDescriptionSchema
NamepanelId
Inpath
Requiredyes
DescriptionPanel id.
Schemastring(uuid)

Responses

200PanelView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
PUT /panels/{panelId}

Replace a Discord panel configuration

When to use

Use this to replace the full panel configuration, including heading, description, target channel, and actions linked to existing create commands or page lists.

API key required

Parameters

NameInRequiredDescriptionSchema
NamepanelId
Inpath
Requiredyes
DescriptionPanel id.
Schemastring(uuid)

Request body

Required JSON request bodyView schema and example
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  success*: true
  (no other fields)
}
Example
{
  "success": true
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
DELETE /panels/{panelId}

Delete a Discord panel and its published message if present

When to use

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.

API key required

Parameters

NameInRequiredDescriptionSchema
NamepanelId
Inpath
Requiredyes
DescriptionPanel id.
Schemastring(uuid)

Responses

200DeletedView response body
application/jsonShape, * required
{
  success*: true
  (no other fields)
}
Example
{
  "success": true
}
401Missing, invalid, revoked, or over-plan API keyView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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"
}
POST /panels/{panelId}/publish

Publish or update a panel message in Discord

When to use

Use this after creating or updating a panel to publish the configured panel message to Discord or refresh the already published message.

API key required

Parameters

NameInRequiredDescriptionSchema
NamepanelId
Inpath
Requiredyes
DescriptionPanel id.
Schemastring(uuid)

Responses

200PublishedView response body
application/jsonShape, * required
{
  success*: true
  warning: string
  (no other fields)
}
Example
{
  "success": true
}
400Validation or configuration errorView response body
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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
application/jsonShape, * required
{
  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

NameDescriptionSchema
NameRetry-After
DescriptionSeconds until another request may be attempted.
Schemainteger
NameX-RateLimit-Limit
DescriptionLimit for the current window.
Schemainteger
NameX-RateLimit-Remaining
DescriptionRequests remaining in the current window.
Schemainteger
NameX-RateLimit-Reset
DescriptionUnix timestamp when the current minute window resets.
Schemainteger
NameX-RateLimit-Day-Limit
DescriptionDaily request limit.
Schemainteger
NameX-RateLimit-Day-Remaining
DescriptionRequests remaining in the current day window.
Schemainteger
NameX-RateLimit-Day-Reset
DescriptionUnix timestamp when the current day window resets.
Schemainteger
application/jsonShape, * required
{
  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

GET /docs

Human-readable API documentation

When to use

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.

Public

Responses

200API documentationView response body
text/htmlShape, * required
string
GET /openapi.json

OpenAPI document

When to use

Use this when an AI agent, script, or API client needs the machine-readable contract for configuring NotiCord through the public API.

Public

Responses

200OpenAPI JSONView response body
application/jsonShape, * required
{
  [key: string]: value
}