{"files":{"SKILL.md":"---\nname: novu-api\ndescription: \"Novu API skill. Use when working with Novu for environments, events, notifications. Covers 149 endpoints.\"\nversion: 1.0.0\ngenerator: lapsh\n---\n\n# Novu API\nAPI version: 3.19.2\n\n## Auth\nApiKey Authorization in header\n\n## Base URL\nhttps://api.novu.co\n\n## Setup\n1. Set your API key in the appropriate header\n2. GET /v1/environments -- list all environments\n3. POST /v1/environments -- create first environment\n\n## Endpoints\n149 endpoints across 17 groups. See references/api-spec.lap for full details.\n\n### Environments\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /v1/environments | Create an environment |\n| GET | /v1/environments | List all environments |\n| PUT | /v1/environments/{environmentId} | Update an environment |\n| DELETE | /v1/environments/{environmentId} | Delete an environment |\n| GET | /v2/environments/{environmentId}/tags | List environment tags |\n| POST | /v2/environments/{targetEnvironmentId}/publish | Publish resources to target environment |\n| POST | /v2/environments/{targetEnvironmentId}/diff | Compare resources between environments |\n\n### Events\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /v1/events/trigger | Trigger event |\n| POST | /v1/events/trigger/bulk | Bulk trigger event |\n| POST | /v1/events/trigger/broadcast | Broadcast event to all |\n| DELETE | /v1/events/trigger/{transactionId} | Cancel triggered event |\n\n### Notifications\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v1/notifications | List all events |\n| GET | /v1/notifications/{notificationId} | Retrieve an event |\n\n### Agents\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /v1/agents | Create an agent |\n| GET | /v1/agents | List all agents |\n| PUT | /v1/agents/{identifier}/bridge | Update an agent bridge |\n| GET | /v1/agents/{identifier} | Retrieve an agent |\n| PATCH | /v1/agents/{identifier} | Update an agent |\n| DELETE | /v1/agents/{identifier} | Delete an agent |\n| POST | /v1/agents/{identifier}/integrations | Create an agent integration |\n| GET | /v1/agents/{identifier}/integrations | List agent integrations |\n| PATCH | /v1/agents/{identifier}/integrations/{agentIntegrationId} | Update an agent integration |\n| DELETE | /v1/agents/{identifier}/integrations/{agentIntegrationId} | Delete an agent integration |\n| POST | /v1/agents/{agentId}/reply | Send an agent reply |\n\n### Domains\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v1/domains | List domains for an environment |\n| POST | /v1/domains | Create a domain |\n| GET | /v1/domains/{domain} | Retrieve a domain by name |\n| PATCH | /v1/domains/{domain} | Update a domain |\n| DELETE | /v1/domains/{domain} | Delete a domain |\n| POST | /v1/domains/{domain}/verify | Verify a domain |\n| POST | /v1/domains/{domain}/diagnose | Diagnose inbound DNS for a domain |\n| GET | /v1/domains/{domain}/routes | List routes for a domain |\n| POST | /v1/domains/{domain}/routes | Create a route |\n| GET | /v1/domains/{domain}/routes/{address} | Retrieve a route by address |\n| PATCH | /v1/domains/{domain}/routes/{address} | Update a route |\n| DELETE | /v1/domains/{domain}/routes/{address} | Delete a route |\n| POST | /v1/domains/{domain}/routes/{address}/test | Test an inbound route |\n| GET | /v1/domains/{domain}/auto-configure | Retrieve auto-configuration availability |\n| POST | /v1/domains/{domain}/auto-configure/start | Start DNS auto-configuration |\n\n### Integrations\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v1/integrations | List all integrations |\n| POST | /v1/integrations | Create an integration |\n| GET | /v1/integrations/active | List active integrations |\n| PUT | /v1/integrations/{integrationId} | Update an integration |\n| DELETE | /v1/integrations/{integrationId} | Delete an integration |\n| POST | /v1/integrations/{integrationId}/auto-configure | Auto-configure an integration for inbound webhooks |\n| POST | /v1/integrations/{integrationId}/set-primary | Update integration as primary |\n| POST | /v1/integrations/chat/oauth | Generate chat OAuth URL |\n| POST | /v1/integrations/channel-connections/oauth | Generate OAuth URL for a workspace/tenant connection |\n| POST | /v1/integrations/channel-endpoints/oauth | Generate OAuth URL to link a subscriber user identity |\n| POST | /v1/integrations/channel-endpoints/link | Issue a URL to link a subscriber chat identity |\n| POST | /v1/integrations/{integrationIdentifier}/webhook/configure | Configure a chat integration webhook |\n| POST | /v1/integrations/{integrationIdentifier}/mobile-link | Issue a short-lived mobile setup link for an existing integration |\n\n### Contexts\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /v2/contexts | Create a context |\n| GET | /v2/contexts | List all contexts |\n| PATCH | /v2/contexts/{type}/{id} | Update a context |\n| GET | /v2/contexts/{type}/{id} | Retrieve a context |\n| DELETE | /v2/contexts/{type}/{id} | Delete a context |\n\n### Subscribers\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /v1/subscribers/bulk | Bulk create subscribers |\n| PUT | /v1/subscribers/{subscriberId}/credentials | Update provider credentials |\n| PATCH | /v1/subscribers/{subscriberId}/credentials | Upsert provider credentials |\n| DELETE | /v1/subscribers/{subscriberId}/credentials/{providerId} | Delete provider credentials |\n| PATCH | /v1/subscribers/{subscriberId}/online-status | Update subscriber online status |\n| GET | /v1/subscribers/{subscriberId}/notifications/feed | Retrieve subscriber notifications |\n| GET | /v1/subscribers/{subscriberId}/notifications/unseen | Retrieve unseen notifications count |\n| POST | /v1/subscribers/{subscriberId}/messages/mark-as | Update notifications state |\n| POST | /v1/subscribers/{subscriberId}/messages/mark-all | Update all notifications state |\n| POST | /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type} | Update notification action status |\n| GET | /v2/subscribers | Search subscribers |\n| POST | /v2/subscribers | Create a subscriber |\n| GET | /v2/subscribers/{subscriberId} | Retrieve a subscriber |\n| PATCH | /v2/subscribers/{subscriberId} | Update a subscriber |\n| DELETE | /v2/subscribers/{subscriberId} | Delete a subscriber |\n| GET | /v2/subscribers/{subscriberId}/preferences | Retrieve subscriber preferences |\n| PATCH | /v2/subscribers/{subscriberId}/preferences | Update subscriber preferences |\n| PATCH | /v2/subscribers/{subscriberId}/preferences/bulk | Bulk update subscriber preferences |\n| GET | /v2/subscribers/{subscriberId}/subscriptions | Retrieve subscriber subscriptions |\n| GET | /v2/subscribers/{subscriberId}/notifications | Retrieve subscriber notifications |\n| GET | /v2/subscribers/{subscriberId}/notifications/count | Retrieve subscriber notifications count |\n| PATCH | /v2/subscribers/{subscriberId}/notifications/{notificationId}/read | Mark a notification as read |\n| PATCH | /v2/subscribers/{subscriberId}/notifications/{notificationId}/unread | Mark a notification as unread |\n| PATCH | /v2/subscribers/{subscriberId}/notifications/{notificationId}/archive | Archive a notification |\n| PATCH | /v2/subscribers/{subscriberId}/notifications/{notificationId}/unarchive | Unarchive a notification |\n| PATCH | /v2/subscribers/{subscriberId}/notifications/{notificationId}/snooze | Snooze a notification |\n| PATCH | /v2/subscribers/{subscriberId}/notifications/{notificationId}/unsnooze | Unsnooze a notification |\n| DELETE | /v2/subscribers/{subscriberId}/notifications/{notificationId} | Delete a notification |\n| PATCH | /v2/subscribers/{subscriberId}/notifications/{notificationId}/actions/{actionType}/complete | Complete a notification action |\n| PATCH | /v2/subscribers/{subscriberId}/notifications/{notificationId}/actions/{actionType}/revert | Revert a notification action |\n| POST | /v2/subscribers/{subscriberId}/notifications/seen | Mark notifications as seen |\n| POST | /v2/subscribers/{subscriberId}/notifications/read | Mark all notifications as read |\n| POST | /v2/subscribers/{subscriberId}/notifications/archive | Archive all notifications |\n| POST | /v2/subscribers/{subscriberId}/notifications/read-archive | Archive all read notifications |\n| POST | /v2/subscribers/{subscriberId}/notifications/delete | Delete all notifications |\n\n### Layouts\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /v2/layouts | Create a layout |\n| GET | /v2/layouts | List all layouts |\n| PUT | /v2/layouts/{layoutId} | Update a layout |\n| GET | /v2/layouts/{layoutId} | Retrieve a layout |\n| DELETE | /v2/layouts/{layoutId} | Delete a layout |\n| POST | /v2/layouts/{layoutId}/duplicate | Duplicate a layout |\n| POST | /v2/layouts/{layoutId}/preview | Generate layout preview |\n| GET | /v2/layouts/{layoutId}/usage | Get layout usage |\n\n### Messages\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v1/messages | List all messages |\n| DELETE | /v1/messages/{messageId} | Delete a message |\n| DELETE | /v1/messages/transaction/{transactionId} | Delete messages by transactionId |\n\n### Topics\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v1/topics/{topicKey}/subscribers/{externalSubscriberId} | Check topic subscriber |\n| GET | /v2/topics | List all topics |\n| POST | /v2/topics | Create a topic |\n| GET | /v2/topics/{topicKey} | Retrieve a topic |\n| PATCH | /v2/topics/{topicKey} | Update a topic |\n| DELETE | /v2/topics/{topicKey} | Delete a topic |\n| GET | /v2/topics/{topicKey}/subscriptions | List topic subscriptions |\n| POST | /v2/topics/{topicKey}/subscriptions | Create topic subscriptions |\n| DELETE | /v2/topics/{topicKey}/subscriptions | Delete topic subscriptions |\n| GET | /v2/topics/{topicKey}/subscriptions/{identifier} | Retrieve a topic subscription |\n| PATCH | /v2/topics/{topicKey}/subscriptions/{identifier} | Update a topic subscription |\n\n### Environment-variables\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v1/environment-variables | List all variables |\n| POST | /v1/environment-variables | Create a variable |\n| GET | /v1/environment-variables/{variableKey}/usage | Retrieve a variable usage |\n| GET | /v1/environment-variables/{variableKey} | Get environment variable |\n| PATCH | /v1/environment-variables/{variableKey} | Update a variable |\n| DELETE | /v1/environment-variables/{variableKey} | Delete environment variable |\n\n### Workflows\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /v2/workflows | Create a workflow |\n| GET | /v2/workflows | List all workflows |\n| PUT | /v2/workflows/{workflowId}/sync | Sync a workflow |\n| PUT | /v2/workflows/{workflowId} | Update a workflow |\n| GET | /v2/workflows/{workflowId} | Retrieve a workflow |\n| DELETE | /v2/workflows/{workflowId} | Delete a workflow |\n| PATCH | /v2/workflows/{workflowId} | Update a workflow |\n| POST | /v2/workflows/{workflowId}/step/{stepId}/preview | Generate a step preview |\n| GET | /v2/workflows/{workflowId}/steps/{stepId} | Retrieve workflow step |\n\n### Channel-connections\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v1/channel-connections | List all channel connections |\n| POST | /v1/channel-connections | Create a channel connection |\n| GET | /v1/channel-connections/{identifier} | Retrieve a channel connection |\n| PATCH | /v1/channel-connections/{identifier} | Update a channel connection |\n| DELETE | /v1/channel-connections/{identifier} | Delete a channel connection |\n\n### Channel-endpoints\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v1/channel-endpoints | List all channel endpoints |\n| POST | /v1/channel-endpoints | Create a channel endpoint |\n| GET | /v1/channel-endpoints/{identifier} | Retrieve a channel endpoint |\n| PATCH | /v1/channel-endpoints/{identifier} | Update a channel endpoint |\n| DELETE | /v1/channel-endpoints/{identifier} | Delete a channel endpoint |\n\n### Translations\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /v2/translations/upload | Upload translation files |\n| POST | /v2/translations | Create a translation |\n| GET | /v2/translations/master-json | Retrieve master translations JSON |\n| POST | /v2/translations/master-json | Import master translations JSON |\n| POST | /v2/translations/master-json/upload | Upload master translations JSON file |\n| GET | /v2/translations/group/{resourceType}/{resourceId} | Retrieve a translation group |\n| GET | /v2/translations/{resourceType}/{resourceId}/{locale} | Retrieve a translation |\n| DELETE | /v2/translations/{resourceType}/{resourceId}/{locale} | Delete a translation |\n| DELETE | /v2/translations/{resourceType}/{resourceId} | Delete a translation group |\n\n### Inbound-webhooks\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /v2/inbound-webhooks/delivery-providers/{environmentId}/{integrationId} | Track provider activity and engagement events |\n\n## Common Questions\nMatch user requests to endpoints in references/api-spec.lap. Key patterns:\n- \"Create a environment?\" -> POST /v1/environments\n- \"List all environments?\" -> GET /v1/environments\n- \"Update a environment?\" -> PUT /v1/environments/{environmentId}\n- \"Delete a environment?\" -> DELETE /v1/environments/{environmentId}\n- \"Create a trigger?\" -> POST /v1/events/trigger\n- \"Create a bulk?\" -> POST /v1/events/trigger/bulk\n- \"Create a broadcast?\" -> POST /v1/events/trigger/broadcast\n- \"Delete a trigger?\" -> DELETE /v1/events/trigger/{transactionId}\n- \"Search notifications?\" -> GET /v1/notifications\n- \"Get notification details?\" -> GET /v1/notifications/{notificationId}\n- \"Create a agent?\" -> POST /v1/agents\n- \"List all agents?\" -> GET /v1/agents\n- \"Get agent details?\" -> GET /v1/agents/{identifier}\n- \"Partially update a agent?\" -> PATCH /v1/agents/{identifier}\n- \"Delete a agent?\" -> DELETE /v1/agents/{identifier}\n- \"Create a integration?\" -> POST /v1/agents/{identifier}/integrations\n- \"List all integrations?\" -> GET /v1/agents/{identifier}/integrations\n- \"Partially update a integration?\" -> PATCH /v1/agents/{identifier}/integrations/{agentIntegrationId}\n- \"Delete a integration?\" -> DELETE /v1/agents/{identifier}/integrations/{agentIntegrationId}\n- \"Create a reply?\" -> POST /v1/agents/{agentId}/reply\n- \"List all domains?\" -> GET /v1/domains\n- \"Create a domain?\" -> POST /v1/domains\n- \"Get domain details?\" -> GET /v1/domains/{domain}\n- \"Partially update a domain?\" -> PATCH /v1/domains/{domain}\n- \"Delete a domain?\" -> DELETE /v1/domains/{domain}\n- \"Create a verify?\" -> POST /v1/domains/{domain}/verify\n- \"Create a diagnose?\" -> POST /v1/domains/{domain}/diagnose\n- \"List all routes?\" -> GET /v1/domains/{domain}/routes\n- \"Create a route?\" -> POST /v1/domains/{domain}/routes\n- \"Get route details?\" -> GET /v1/domains/{domain}/routes/{address}\n- \"Partially update a route?\" -> PATCH /v1/domains/{domain}/routes/{address}\n- \"Delete a route?\" -> DELETE /v1/domains/{domain}/routes/{address}\n- \"Create a test?\" -> POST /v1/domains/{domain}/routes/{address}/test\n- \"List all auto-configure?\" -> GET /v1/domains/{domain}/auto-configure\n- \"Create a start?\" -> POST /v1/domains/{domain}/auto-configure/start\n- \"List all active?\" -> GET /v1/integrations/active\n- \"Update a integration?\" -> PUT /v1/integrations/{integrationId}\n- \"Create a auto-configure?\" -> POST /v1/integrations/{integrationId}/auto-configure\n- \"Create a set-primary?\" -> POST /v1/integrations/{integrationId}/set-primary\n- \"Create a oauth?\" -> POST /v1/integrations/chat/oauth\n- \"Create a link?\" -> POST /v1/integrations/channel-endpoints/link\n- \"Create a configure?\" -> POST /v1/integrations/{integrationIdentifier}/webhook/configure\n- \"Create a mobile-link?\" -> POST /v1/integrations/{integrationIdentifier}/mobile-link\n- \"Create a context?\" -> POST /v2/contexts\n- \"Search contexts?\" -> GET /v2/contexts\n- \"Partially update a context?\" -> PATCH /v2/contexts/{type}/{id}\n- \"Get context details?\" -> GET /v2/contexts/{type}/{id}\n- \"Delete a context?\" -> DELETE /v2/contexts/{type}/{id}\n- \"Delete a credential?\" -> DELETE /v1/subscribers/{subscriberId}/credentials/{providerId}\n- \"List all feed?\" -> GET /v1/subscribers/{subscriberId}/notifications/feed\n- \"List all unseen?\" -> GET /v1/subscribers/{subscriberId}/notifications/unseen\n- \"Create a mark-a?\" -> POST /v1/subscribers/{subscriberId}/messages/mark-as\n- \"Create a mark-all?\" -> POST /v1/subscribers/{subscriberId}/messages/mark-all\n- \"List all subscribers?\" -> GET /v2/subscribers\n- \"Create a subscriber?\" -> POST /v2/subscribers\n- \"Get subscriber details?\" -> GET /v2/subscribers/{subscriberId}\n- \"Partially update a subscriber?\" -> PATCH /v2/subscribers/{subscriberId}\n- \"Delete a subscriber?\" -> DELETE /v2/subscribers/{subscriberId}\n- \"List all preferences?\" -> GET /v2/subscribers/{subscriberId}/preferences\n- \"List all subscriptions?\" -> GET /v2/subscribers/{subscriberId}/subscriptions\n- \"List all notifications?\" -> GET /v2/subscribers/{subscriberId}/notifications\n- \"List all count?\" -> GET /v2/subscribers/{subscriberId}/notifications/count\n- \"Delete a notification?\" -> DELETE /v2/subscribers/{subscriberId}/notifications/{notificationId}\n- \"Create a seen?\" -> POST /v2/subscribers/{subscriberId}/notifications/seen\n- \"Create a read?\" -> POST /v2/subscribers/{subscriberId}/notifications/read\n- \"Create a archive?\" -> POST /v2/subscribers/{subscriberId}/notifications/archive\n- \"Create a read-archive?\" -> POST /v2/subscribers/{subscriberId}/notifications/read-archive\n- \"Create a delete?\" -> POST /v2/subscribers/{subscriberId}/notifications/delete\n- \"Create a layout?\" -> POST /v2/layouts\n- \"Search layouts?\" -> GET /v2/layouts\n- \"Update a layout?\" -> PUT /v2/layouts/{layoutId}\n- \"Get layout details?\" -> GET /v2/layouts/{layoutId}\n- \"Delete a layout?\" -> DELETE /v2/layouts/{layoutId}\n- \"Create a duplicate?\" -> POST /v2/layouts/{layoutId}/duplicate\n- \"Create a preview?\" -> POST /v2/layouts/{layoutId}/preview\n- \"List all usage?\" -> GET /v2/layouts/{layoutId}/usage\n- \"List all messages?\" -> GET /v1/messages\n- \"Delete a message?\" -> DELETE /v1/messages/{messageId}\n- \"Delete a transaction?\" -> DELETE /v1/messages/transaction/{transactionId}\n- \"List all topics?\" -> GET /v2/topics\n- \"Create a topic?\" -> POST /v2/topics\n- \"Get topic details?\" -> GET /v2/topics/{topicKey}\n- \"Partially update a topic?\" -> PATCH /v2/topics/{topicKey}\n- \"Delete a topic?\" -> DELETE /v2/topics/{topicKey}\n- \"Create a subscription?\" -> POST /v2/topics/{topicKey}/subscriptions\n- \"Get subscription details?\" -> GET /v2/topics/{topicKey}/subscriptions/{identifier}\n- \"Partially update a subscription?\" -> PATCH /v2/topics/{topicKey}/subscriptions/{identifier}\n- \"Search environment-variables?\" -> GET /v1/environment-variables\n- \"Create a environment-variable?\" -> POST /v1/environment-variables\n- \"Get environment-variable details?\" -> GET /v1/environment-variables/{variableKey}\n- \"Partially update a environment-variable?\" -> PATCH /v1/environment-variables/{variableKey}\n- \"Delete a environment-variable?\" -> DELETE /v1/environment-variables/{variableKey}\n- \"Create a workflow?\" -> POST /v2/workflows\n- \"Search workflows?\" -> GET /v2/workflows\n- \"Update a workflow?\" -> PUT /v2/workflows/{workflowId}\n- \"Get workflow details?\" -> GET /v2/workflows/{workflowId}\n- \"Delete a workflow?\" -> DELETE /v2/workflows/{workflowId}\n- \"Partially update a workflow?\" -> PATCH /v2/workflows/{workflowId}\n- \"Get step details?\" -> GET /v2/workflows/{workflowId}/steps/{stepId}\n- \"List all tags?\" -> GET /v2/environments/{environmentId}/tags\n- \"Create a publish?\" -> POST /v2/environments/{targetEnvironmentId}/publish\n- \"Create a diff?\" -> POST /v2/environments/{targetEnvironmentId}/diff\n- \"List all channel-connections?\" -> GET /v1/channel-connections\n- \"Create a channel-connection?\" -> POST /v1/channel-connections\n- \"Get channel-connection details?\" -> GET /v1/channel-connections/{identifier}\n- \"Partially update a channel-connection?\" -> PATCH /v1/channel-connections/{identifier}\n- \"Delete a channel-connection?\" -> DELETE /v1/channel-connections/{identifier}\n- \"List all channel-endpoints?\" -> GET /v1/channel-endpoints\n- \"Create a channel-endpoint?\" -> POST /v1/channel-endpoints\n- \"Get channel-endpoint details?\" -> GET /v1/channel-endpoints/{identifier}\n- \"Partially update a channel-endpoint?\" -> PATCH /v1/channel-endpoints/{identifier}\n- \"Delete a channel-endpoint?\" -> DELETE /v1/channel-endpoints/{identifier}\n- \"Create a upload?\" -> POST /v2/translations/upload\n- \"Create a translation?\" -> POST /v2/translations\n- \"List all master-json?\" -> GET /v2/translations/master-json\n- \"Create a master-json?\" -> POST /v2/translations/master-json\n- \"Get group details?\" -> GET /v2/translations/group/{resourceType}/{resourceId}\n- \"Get translation details?\" -> GET /v2/translations/{resourceType}/{resourceId}/{locale}\n- \"Delete a translation?\" -> DELETE /v2/translations/{resourceType}/{resourceId}/{locale}\n- \"How to authenticate?\" -> See Auth section above\n\n## Response Tips\n- Check response schemas in references/api-spec.lap for field details\n- Paginated endpoints accept limit/offset or cursor parameters\n- Create/update endpoints return the modified resource on success\n- Error responses include status codes and descriptions in the spec\n\n## References\n- Full spec: See references/api-spec.lap for complete endpoint details, parameter tables, and response schemas\n\n> Generated from the official API spec by [LAP](https://lap.sh)\n","references/api-spec.lap":"@lap v0.3\n# Machine-readable API spec. Each @endpoint block is one API call.\n@api Novu API\n@base https://api.novu.co\n@version 3.19.1\n@auth ApiKey Authorization in header\n@endpoints 149\n@hint download_for_search\n@toc environments(7), events(4), notifications(2), agents(11), domains(15), integrations(13), contexts(5), subscribers(35), layouts(8), messages(3), topics(11), environment-variables(6), workflows(9), channel-connections(5), channel-endpoints(5), translations(9), inbound-webhooks(1)\n\n@group environments\n@endpoint POST /v1/environments\n@desc Create an environment\n@required {name: str # Name of the environment to be created, color: str # Hex color code for the environment}\n@optional {parentId: str # MongoDB ObjectId of the parent environment (optional)}\n@returns(201) {data: map{_id: str, name: str, _organizationId: str, identifier: str, type: str?, apiKeys: [map], _parentId: str, slug: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/environments\n@desc List all environments\n@returns(200) {data: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PUT /v1/environments/{environmentId}\n@desc Update an environment\n@required {environmentId: str # The unique identifier of the environment}\n@optional {name: str, identifier: str, parentId: str, color: str, dns: map{inboundParseDomain: str}, bridge: map{url: str}}\n@returns(200) {data: map{_id: str, name: str, _organizationId: str, identifier: str, type: str?, apiKeys: [map], _parentId: str, slug: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/environments/{environmentId}\n@desc Delete an environment\n@required {environmentId: str # The unique identifier of the environment}\n@returns(200)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group events\n@endpoint POST /v1/events/trigger\n@desc Trigger event\n@required {name: str # The trigger identifier of the workflow you wish to send. This identifier can be found on the workflow page., to: any # The recipients list of people who will receive the notification. Maximum number of recipients can be 100.}\n@optional {payload: map # The payload object is used to pass additional custom information that could be      used to render the workflow, or perform routing rules based on it.        This data will also be available when fetching the notifications feed from the API to display certain parts of the UI., bridgeUrl: str # Optional Bridge Endpoint URL used to route this trigger to a specific Bridge application. Useful during local development when multiple engineers share an organization: set this to your personal tunnel URL from `npx novu@latest dev` (for example via NOVU_BRIDGE_URL) so app-fired triggers hit your machine instead of the environment's synced Bridge URL. Must be a publicly reachable https URL — private or localhost addresses are rejected., overrides: any # This could be used to override provider specific configurations, agentId: str # Override the workflow-assigned agent for this trigger using the public agent identifier. Omit to use the workflow default; pass null to disable agent routing for this execution., transactionId: str # A unique identifier for deduplication. If the same **transactionId** is sent again,        the trigger is ignored. Useful to prevent duplicate notifications. The retention period depends on your billing tier., actor: any # It is used to display the Avatar of the provided actor's subscriber id or actor object.     If a new actor object is provided, we will create a new subscriber in our system, tenant: any # It is used to specify a tenant context during trigger event.     Existing tenants will be updated with the provided details., context: map}\n@returns(201) {data: map{acknowledged: bool, status: str, error: [str], transactionId: str, activityFeedLink: str, jobData: map}} # Created\n@errors {400: Payload validation failed - returned when payload does not match the workflow schema, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/events/trigger/bulk\n@desc Bulk trigger event\n@required {events: [map{name!: str, payload: map, bridgeUrl: str, overrides: any, agentId: str, to!: any, transactionId: str, actor: any, tenant: any, context: map}]}\n@returns(201) {data: [map]} # Created\n@errors {400: Payload validation failed - returned when any event payload does not match the workflow schema, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/events/trigger/broadcast\n@desc Broadcast event to all\n@required {name: str # The trigger identifier associated for the template you wish to send. This identifier can be found on the template page., payload: map # The payload object is used to pass additional information that      could be used to render the template, or perform routing rules based on it.        For In-App channel, payload data are also available in}\n@optional {overrides: any # This could be used to override provider specific configurations, agentId: str # Override the workflow-assigned agent for this trigger using the public agent identifier. Omit to use the workflow default; pass null to disable agent routing for this execution., transactionId: str # A unique identifier for this transaction, we will generated a UUID if not provided., actor: any # It is used to display the Avatar of the provided actor's subscriber id or actor object.     If a new actor object is provided, we will create a new subscriber in our system, tenant: any # It is used to specify a tenant context during trigger event.     If a new tenant object is provided, we will create a new tenant., context: map}\n@returns(200) {data: map{acknowledged: bool, status: str, error: [str], transactionId: str, activityFeedLink: str, jobData: map}} # OK\n@returns(201) {acknowledged: bool, status: str, error: [str], transactionId: str, activityFeedLink: str, jobData: map} # Broadcast request has been registered successfully\n@errors {400: Payload validation failed - returned when payload does not match the workflow schema, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/events/trigger/{transactionId}\n@desc Cancel triggered event\n@required {transactionId: str}\n@returns(200)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group notifications\n@endpoint GET /v1/notifications\n@desc List all events\n@optional {channels: [str] # Array of channel types, templates: [str] # Array of template IDs or a single template ID, emails: [str] # Array of email addresses or a single email address, search: str # Search term (deprecated), subscriberIds: [str] # Array of subscriber IDs or a single subscriber ID, severity: [str] # Array of severity levels or a single severity level, page: num=0 # Page number for pagination, limit: num=10 # Limit for pagination, transactionId: str # The transaction ID to filter by, topicKey: str # Topic Key for filtering notifications by topic, subscriptionId: str # Subscription ID for filtering notifications by subscription, contextKeys: [str] # Filter by exact context keys, order insensitive (format: \"type:id\"), after: str # Date filter for records after this timestamp. Defaults to earliest date allowed by subscription plan, before: str # Date filter for records before this timestamp. Defaults to current time of request (now)}\n@returns(200) {hasMore: bool, data: [map], pageSize: num, page: num}\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/notifications/{notificationId}\n@desc Retrieve an event\n@required {notificationId: str}\n@returns(200) {data: map{_id: str, _environmentId: str, _organizationId: str, _subscriberId: str, transactionId: str, _templateId: str, _digestedNotificationId: str, createdAt: str, updatedAt: str, channels: [str], subscriber: any, template: any, jobs: [map], payload: map, tags: [str], controls: map, to: map, topics: [map], severity: str, critical: bool, contextKeys: [str]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group agents\n@endpoint POST /v1/agents\n@desc Create an agent\n@required {Novu-Analytics-Source: str, name: str # Required when not adopting an existing managed agent (i.e. when managedRuntime.externalAgentId is absent). Optional in adopt mode where the name is resolved from the provider., identifier: str # Required when not adopting an existing managed agent. Auto-generated from the provider agent name when omitted in adopt mode.}\n@optional {description: str, active: bool=true, runtime: str(self-hosted/managed), managedRuntime: map{providerId!: str, integrationId!: str, externalAgentId: str, externalEnvironmentId: str, model: str, systemPrompt: str, tools: [str], mcpServers: [str], skills: [map]}}\n@returns(201) {data: map{_id: str, name: str, identifier: str, description: str, behavior: map{acknowledgeOnReceived: bool, reactionOnResolved: map?, subscriberAccess: str}, active: bool, bridgeUrl: str, devBridgeUrl: str, devBridgeActive: bool, runtime: str, visibility: str, managedRuntime: any, _environmentId: str, _organizationId: str, createdBy: str, createdAt: str, updatedAt: str, integrations: [map], exceedsPlanLimit: bool}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/agents\n@desc List all agents\n@optional {after: str # Cursor for pagination indicating the starting point after which to fetch results., before: str # Cursor for pagination indicating the ending point before which to fetch results., limit: num # Limit the number of items to return, orderDirection: str(ASC/DESC) # Direction of sorting, orderBy: str # Field to order by, includeCursor: bool # Include cursor item in response, identifier: str # Filter agents by partial, case-insensitive match on identifier.}\n@returns(200) {data: map{data: [map], next: str?, previous: str?, totalCount: num, totalCountCapped: bool, planUsage: any}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PUT /v1/agents/{identifier}/bridge\n@desc Update an agent bridge\n@required {identifier: str}\n@optional {bridgeUrl: str # Production bridge URL for this agent, devBridgeUrl: str # Development bridge URL (set by npx novu dev), devBridgeActive: bool # Whether the dev bridge override is active}\n@returns(200) {data: map{_id: str, name: str, identifier: str, description: str, behavior: map{acknowledgeOnReceived: bool, reactionOnResolved: map?, subscriberAccess: str}, active: bool, bridgeUrl: str, devBridgeUrl: str, devBridgeActive: bool, runtime: str, visibility: str, managedRuntime: any, _environmentId: str, _organizationId: str, createdBy: str, createdAt: str, updatedAt: str, integrations: [map], exceedsPlanLimit: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The agent was not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/agents/{identifier}\n@desc Retrieve an agent\n@required {identifier: str}\n@returns(200) {data: map{_id: str, name: str, identifier: str, description: str, behavior: map{acknowledgeOnReceived: bool, reactionOnResolved: map?, subscriberAccess: str}, active: bool, bridgeUrl: str, devBridgeUrl: str, devBridgeActive: bool, runtime: str, visibility: str, managedRuntime: any, _environmentId: str, _organizationId: str, createdBy: str, createdAt: str, updatedAt: str, integrations: [map], exceedsPlanLimit: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The agent was not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v1/agents/{identifier}\n@desc Update an agent\n@required {identifier: str}\n@optional {name: str, description: str, active: bool, behavior: map{acknowledgeOnReceived: bool, reactionOnResolved: map, subscriberAccess: str}, bridgeUrl: str # Production bridge URL for this agent, devBridgeUrl: str # Development bridge URL (set by npx novu dev), devBridgeActive: bool # Whether the dev bridge override is active}\n@returns(200) {data: map{_id: str, name: str, identifier: str, description: str, behavior: map{acknowledgeOnReceived: bool, reactionOnResolved: map?, subscriberAccess: str}, active: bool, bridgeUrl: str, devBridgeUrl: str, devBridgeActive: bool, runtime: str, visibility: str, managedRuntime: any, _environmentId: str, _organizationId: str, createdBy: str, createdAt: str, updatedAt: str, integrations: [map], exceedsPlanLimit: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The agent was not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/agents/{identifier}\n@desc Delete an agent\n@required {identifier: str, deleteFromProvider: str}\n@returns(204) The agent was deleted.\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The agent was not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/agents/{identifier}/integrations\n@desc Create an agent integration\n@required {identifier: str}\n@optional {integrationIdentifier: str # The integration identifier (same as in the integration store), not the internal document _id., providerId: str # Provider ID to auto-create a dedicated integration (e.g. novu-agent-email). When set, the server creates the integration if one does not already exist for this agent.}\n@returns(201) {data: map{_id: str, _agentId: str, integration: map{_id: str, identifier: str, name: str, providerId: str, channel: str, active: bool, sharedInboundAddress: str, defaultSenderName: str, sharedInboxDisabled: bool}, _environmentId: str, _organizationId: str, connectedAt: map?, createdAt: str, updatedAt: str, exceedsPlanLimit: bool}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The agent or integration was not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/agents/{identifier}/integrations\n@desc List agent integrations\n@required {identifier: str}\n@optional {after: str # Cursor for pagination indicating the starting point after which to fetch results., before: str # Cursor for pagination indicating the ending point before which to fetch results., limit: num # Limit the number of items to return, orderDirection: str(ASC/DESC) # Direction of sorting, orderBy: str # Field to order by, includeCursor: bool # Include cursor item in response, integrationIdentifier: str # Return only links for this integration identifier (not the internal document _id).}\n@returns(200) {data: map{data: [map], next: str?, previous: str?, totalCount: num, totalCountCapped: bool, planUsage: any}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The agent was not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v1/agents/{identifier}/integrations/{agentIntegrationId}\n@desc Update an agent integration\n@required {identifier: str, agentIntegrationId: str, integrationIdentifier: str # The integration identifier this link should point to (not the internal document _id).}\n@returns(200) {data: map{_id: str, _agentId: str, integration: map{_id: str, identifier: str, name: str, providerId: str, channel: str, active: bool, sharedInboundAddress: str, defaultSenderName: str, sharedInboxDisabled: bool}, _environmentId: str, _organizationId: str, connectedAt: map?, createdAt: str, updatedAt: str, exceedsPlanLimit: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The agent, integration, or link was not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/agents/{identifier}/integrations/{agentIntegrationId}\n@desc Delete an agent integration\n@required {identifier: str, agentIntegrationId: str}\n@returns(204) The link was removed.\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The agent or agent-integration link was not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/agents/{agentId}/reply\n@desc Send an agent reply\n@required {agentId: str # Agent identifier (slug) for the agent that owns the conversation., conversationId: str # Conversation id to reply into. Obtained from the inbound agent event / bridge payload., integrationIdentifier: str # Channel integration identifier linked to the agent for this conversation (e.g. `slack-support`).}\n@optional {reply: any # Outbound message content. Exactly one of `markdown`, `card`, or `toolApprovalCard`. Optional `files` attach to the message. Cannot be combined with `edit`., toolApprovalRequest: any # Tool-lifecycle ledger row for a gated tool call. Pair with `reply.toolApprovalCard` (or another reply shape) to deliver the approval UI., edit: any # In-place edit of a previously posted agent message. Cannot be combined with reply, resolve, signals, toolResults, toolApprovalRequest, addReactions, or deleteMessages., resolve: any # Mark the conversation resolved. May be combined with a final `reply`., signals: [any] # Side-effect signals executed during this turn: conversation metadata mutations, Novu workflow triggers, or human-in-the-loop interactions., toolResults: [map{toolCallId!: str, toolName: str, output: map, preview: str}] # Tool-call outcomes to persist in conversation history (typically before the assistant reply)., addReactions: [map{messageId!: str, emojiName!: str}] # Emoji reactions to add to existing platform messages., deleteMessages: [map{messageId!: str}] # Delete previously posted platform messages. Removes the rendered message only — history is preserved., typing: any # Per-turn typing/status control. Pass `{ status?: string }` to set/update the status (omit `status` for \"Thinking…\"), or `\"stop\"` to clear it. Best-effort per platform., error: bool # Bridge reports that the customer runtime failed this turn. Cannot be combined with other actions. Novu delivers generic user-facing error copy.}\n@returns(200) {data: any?} # OK. When a reply or edit is delivered, `data` contains the platform message identifiers. Side-effect-only requests (typing, reactions, deletes, signals without an outbound message) return `data: null`.\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The agent or conversation was not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n@example_request {\"conversationId\":\"64f5a1c2e8b7a3d9f0c1b2a3\",\"integrationIdentifier\":\"slack-support\",\"reply\":{\"markdown\":\"**Report ready.** Your weekly summary is attached.\"}}\n\n@endgroup\n\n@group domains\n@endpoint GET /v1/domains\n@desc List domains for an environment\n@optional {after: str # Cursor for pagination indicating the starting point after which to fetch results., before: str # Cursor for pagination indicating the ending point before which to fetch results., limit: num # Limit the number of items to return, orderDirection: str(ASC/DESC) # Direction of sorting, orderBy: str # Field to order by, includeCursor: bool # Include cursor item in response, name: str # Domain name to filter results by.}\n@returns(200) {data: map{data: [map], next: str?, previous: str?, totalCount: num, totalCountCapped: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/domains\n@desc Create a domain\n@required {name: str # The domain name (e.g. \"recent.dev\")}\n@optional {data: map # Optional string key-value metadata (max 10 keys, 500 characters total for keys+values).}\n@returns(201) {data: map{_id: str, name: str, status: str, mxRecordConfigured: bool, dnsProvider: str, _environmentId: str, _organizationId: str, createdAt: str, updatedAt: str, expectedDnsRecords: [map], data: map}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/domains/{domain}\n@desc Retrieve a domain by name\n@required {domain: str}\n@returns(200) {data: map{_id: str, name: str, status: str, mxRecordConfigured: bool, dnsProvider: str, _environmentId: str, _organizationId: str, createdAt: str, updatedAt: str, expectedDnsRecords: [map], data: map}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v1/domains/{domain}\n@desc Update a domain\n@required {domain: str}\n@optional {data: map # Replaces domain metadata when provided (max 10 keys, 500 characters total for keys+values).}\n@returns(200) {data: map{_id: str, name: str, status: str, mxRecordConfigured: bool, dnsProvider: str, _environmentId: str, _organizationId: str, createdAt: str, updatedAt: str, expectedDnsRecords: [map], data: map}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/domains/{domain}\n@desc Delete a domain\n@required {domain: str}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/domains/{domain}/verify\n@desc Verify a domain\n@required {domain: str}\n@returns(200) {data: map{_id: str, name: str, status: str, mxRecordConfigured: bool, dnsProvider: str, _environmentId: str, _organizationId: str, createdAt: str, updatedAt: str, expectedDnsRecords: [map], data: map}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/domains/{domain}/diagnose\n@desc Diagnose inbound DNS for a domain\n@required {domain: str}\n@returns(200) {data: map{ok: bool, runAt: str, checks: [map], issues: [map]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/domains/{domain}/routes\n@desc List routes for a domain\n@required {domain: str}\n@optional {after: str # Cursor for pagination indicating the starting point after which to fetch results., before: str # Cursor for pagination indicating the ending point before which to fetch results., limit: num # Limit the number of items to return, orderDirection: str(ASC/DESC) # Direction of sorting, orderBy: str # Field to order by, includeCursor: bool # Include cursor item in response, agentId: str # Agent identifier to filter routes by.}\n@returns(200) {data: map{data: [map], next: str?, previous: str?, totalCount: num, totalCountCapped: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/domains/{domain}/routes\n@desc Create a route\n@required {domain: str, address: str # Inbox address local part (e.g. \"support\", \"*\"), type: str(agent/webhook)}\n@optional {agentId: str # Agent identifier; required when type is agent, unused for webhook, data: map # Optional string key-value metadata (max 10 keys, 500 characters total for keys+values).}\n@returns(201) {data: map{_id: str, _domainId: str, address: str, agentId: str, type: str, _environmentId: str, _organizationId: str, createdAt: str, updatedAt: str, data: map}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/domains/{domain}/routes/{address}\n@desc Retrieve a route by address\n@required {domain: str, address: str}\n@returns(200) {data: map{_id: str, _domainId: str, address: str, agentId: str, type: str, _environmentId: str, _organizationId: str, createdAt: str, updatedAt: str, data: map}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v1/domains/{domain}/routes/{address}\n@desc Update a route\n@required {domain: str, address: str}\n@optional {agentId: str # Agent identifier; required when type is agent, ignored when type is webhook., type: str(agent/webhook), data: map # Replaces route metadata when provided (max 10 keys, 500 characters total for keys+values).}\n@returns(200) {data: map{_id: str, _domainId: str, address: str, agentId: str, type: str, _environmentId: str, _organizationId: str, createdAt: str, updatedAt: str, data: map}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/domains/{domain}/routes/{address}\n@desc Delete a route\n@required {domain: str, address: str}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/domains/{domain}/routes/{address}/test\n@desc Test an inbound route\n@required {domain: str, address: str, from: map{address!: str, name: str}, subject: str}\n@optional {text: str, html: str, dryRun: bool # When true, returns the payload that would be delivered without invoking outbound webhooks or the agent HTTP endpoint.}\n@returns(200) {data: map{matched: bool, dryRun: bool, domainStatus: str, mxRecordConfigured: bool, type: str, wouldDeliverTo: str, payload: map, webhook: map{skipped: bool, latencyMs: num}, agent: map{agentId: str, httpStatus: num, agentReply: map, latencyMs: num}}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/domains/{domain}/auto-configure\n@desc Retrieve auto-configuration availability\n@required {domain: str}\n@returns(200) {data: map{available: bool, providerName: str, providerId: str, reason: str, reasonCode: str, manualRecords: [map]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/domains/{domain}/auto-configure/start\n@desc Start DNS auto-configuration\n@required {domain: str}\n@optional {redirectUri: str # Dashboard URL to return to after the DNS provider consent flow completes.}\n@returns(201) {data: map{applyUrl: str, providerName: str, redirectUri: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group integrations\n@endpoint GET /v1/integrations\n@desc List all integrations\n@returns(200) The list of integrations belonging to the organization that are successfully returned.\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/integrations\n@desc Create an integration\n@optional {name: str # The name of the integration, identifier: str # The unique identifier for the integration, _environmentId: str(uuid) # The ID of the associated environment, providerId: str # The provider ID for the integration, channel: str(in_app/email/sms/chat/push/tool) # The channel type for the integration. Not required for agent-kind integrations., kind: str(delivery/agent) # Distinguishes delivery integrations from agent-runtime integrations. Defaults to \"delivery\". Agent integrations do not require a channel., credentials: any # The credentials for the integration, active: bool # If the integration is active, the validation on the credentials field will run, check: bool # Flag to check the integration status, conditions: [map{isNegated!: bool, type!: str, value!: str, children!: [map]}] # Legacy StepFilter conditions. Ignored when `rules` is also set., rules: map # JSONLogic used at send time to select this integration. Takes precedence over `conditions`., configurations: map # Configurations for the integration}\n@returns(201) {data: map{_id: str, _environmentId: str, _organizationId: str, name: str, identifier: str, providerId: str, channel: str, kind: str, credentials: any, configurations: any, active: bool, deleted: bool, deletedAt: str, deletedBy: str, primary: bool, conditions: [map], rules: map?}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/integrations/active\n@desc List active integrations\n@returns(200) The list of active integrations belonging to the organization that are successfully returned.\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PUT /v1/integrations/{integrationId}\n@desc Update an integration\n@required {integrationId: str}\n@optional {name: str, identifier: str, _environmentId: str, active: bool # If the integration is active the validation on the credentials field will run, credentials: map{apiKey: str, user: str, secretKey: str, hmacSecretKeyEncoding: str, domain: str, password: str, host: str, port: str, secure: bool, region: str, accountSid: str, messageProfileId: str, token: str, from: str, senderName: str, projectName: str, applicationId: str, clientId: str, requireTls: bool, ignoreTls: bool, tlsOptions: map, baseUrl: str, webhookUrl: str, redirectUrl: str, hmac: bool, serviceAccount: str, ipPoolName: str, configurationSetName: str, apiKeyRequestHeader: str, secretKeyRequestHeader: str, idPath: str, datePath: str, apiToken: str, authenticateByToken: bool, authenticationTokenKey: str, instanceId: str, alertUid: str, title: str, imageUrl: str, state: str, externalLink: str, channelId: str, phoneNumberIdentification: str, accessKey: str, appSid: str, senderId: str, tenantId: str, AppIOBaseUrl: str, signingSecret: str, outboundIntegrationId: str, outboundConnectedAt: str, whatsNextCompletedAt: str, useFromAddressOverride: bool, fromAddressOverride: str, emailSlugPrefix: str, externalEnvironmentId: str, externalVaultId: str, externalWorkspaceId: str}, check: bool, conditions: [map{isNegated!: bool, type!: str, value!: str, children!: [map]}] # Legacy StepFilter conditions. Ignored when `rules` is also set., rules: map # JSONLogic used at send time to select this integration. Takes precedence over `conditions`., configurations: map # Configurations for the integration}\n@returns(200) {data: map{_id: str, _environmentId: str, _organizationId: str, name: str, identifier: str, providerId: str, channel: str, kind: str, credentials: any, configurations: any, active: bool, deleted: bool, deletedAt: str, deletedBy: str, primary: bool, conditions: [map], rules: map?}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The integration with the integrationId provided does not exist in the database., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/integrations/{integrationId}\n@desc Delete an integration\n@required {integrationId: str}\n@returns(200) {data: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/integrations/{integrationId}/auto-configure\n@desc Auto-configure an integration for inbound webhooks\n@required {integrationId: str}\n@returns(200) {data: map{success: bool, message: str, integration: map}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The integration with the integrationId provided does not exist in the database., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/integrations/{integrationId}/set-primary\n@desc Update integration as primary\n@required {integrationId: str}\n@returns(200) {data: map{_id: str, _environmentId: str, _organizationId: str, name: str, identifier: str, providerId: str, channel: str, kind: str, credentials: any, configurations: any, active: bool, deleted: bool, deletedAt: str, deletedBy: str, primary: bool, conditions: [map], rules: map?}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: The integration with the integrationId provided does not exist in the database., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/integrations/chat/oauth\n@desc Generate chat OAuth URL\n@required {integrationIdentifier: str # Integration identifier}\n@optional {subscriberId: str # The subscriber ID to link the channel connection to. For Slack: Required for incoming webhook endpoints, optional for workspace connections. For MS Teams: Optional. Admin consent is tenant-wide and can be associated with a subscriber for organizational purposes., connectionIdentifier: str # Identifier of the channel connection that will be created. It is generated automatically if not provided., context: map, scope: [str] # **Slack only**: OAuth scopes to request during authorization. These define the permissions your Slack integration will have. If not specified, default scopes will be used: chat:write, chat:write.public, channels:read, groups:read, users:read, users:read.email. **Webex**: OAuth scopes to request during authorization. Defaults to: spark:messages_write, spark:rooms_read, spark:people_read, spark:memberships_read, spark:kms. **MS Teams**: This parameter is ignored. MS Teams uses admin consent with pre-configured permissions in Azure AD. Note: The generated OAuth URL expires after 5 minutes., userScope: [str] # **Slack only, link_user mode**: User-level OAuth scopes to request during authorization. Used when mode is \"link_user\" to identify the Slack user via \"Sign in with Slack\". If not specified, defaults to: identity.basic., mode: str(connect/link_user) # OAuth flow mode. Use \"connect\" (default) to create a workspace channel connection, or \"link_user\" to identify the subscriber's Slack user ID without creating a connection., connectionMode: str(subscriber/shared) # Connection mode that determines how the channel connection is scoped. Use \"subscriber\" (default) to associate the connection with a specific subscriber. Use \"shared\" to associate the connection with a context instead of a subscriber — subscriberId will not be stored on the connection., autoLinkUser: bool # When true, after the workspace/tenant connection is created the OAuth flow also links the subscriber who clicked \"Connect\" as a personal endpoint. For Slack, this uses the authed_user.id already returned by oauth.v2.access — no extra redirect. For Webex, this uses the authenticated Webex person returned by people/me — no extra redirect. For MS Teams, this triggers a second OAuth redirect for delegated user-identity consent. Defaults to false when omitted; the SlackConnectButton and MsTeamsConnectButton SDK components default this to true.}\n@returns(201) {data: map{url: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/integrations/channel-connections/oauth\n@desc Generate OAuth URL for a workspace/tenant connection\n@required {integrationIdentifier: str # Integration identifier}\n@optional {subscriberId: str # The subscriber ID to associate with the channel connection. For Slack: optional for workspace connections (required only for incoming-webhook scope). For Webex: optional for workspace connections. For MS Teams: optional. Admin consent is tenant-wide., connectionIdentifier: str # Identifier of the channel connection that will be created. Generated automatically if not provided., context: map, contextHash: str # HMAC-SHA256 of the canonicalized `context`, signed with the tenant environment secret key (the same \"Inbox with context\" signing scheme). Required when the integration has HMAC validation enabled and the session did not already HMAC-verify the context. Establishes that the context/tenant binding was minted by an authenticated backend rather than forged in the browser., scope: [str] # **Slack only**: OAuth scopes to request during authorization. If not specified, default scopes will be used: chat:write, chat:write.public, channels:read, groups:read, users:read, users:read.email. **Webex**: OAuth scopes to request during authorization. Defaults to: spark:messages_write, spark:rooms_read, spark:people_read, spark:memberships_read, spark:kms. **MS Teams**: ignored — uses admin consent with pre-configured Azure AD permissions., connectionMode: str(subscriber/shared) # Connection mode that determines how the channel connection is scoped. \"subscriber\" (default) associates the connection with a specific subscriber. \"shared\" associates the connection with a context instead of a subscriber., autoLinkUser: bool # When true (default when connectionMode is \"subscriber\"), after the workspace/tenant connection is created the OAuth flow also links the subscriber who clicked \"Connect\" as a personal endpoint. For Slack, uses the authed_user.id returned by oauth.v2.access — no extra redirect. For Webex, uses the authenticated Webex person returned by people/me — no extra redirect. For MS Teams, triggers a second OAuth redirect for delegated user-identity consent. Set to false to only create the workspace connection without linking the individual user.}\n@returns(201) {data: map{url: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/integrations/channel-endpoints/oauth\n@desc Generate OAuth URL to link a subscriber user identity\n@required {subscriberId: str # The subscriber ID to link to their chat identity. Required — this operation always binds a specific subscriber to a user identity in the chat provider., integrationIdentifier: str # Integration identifier}\n@optional {connectionIdentifier: str # Identifier of the existing channel connection to associate this user endpoint with. Generated automatically if not provided for providers that support standalone user linking. Required for Webex., context: map, contextHash: str # HMAC-SHA256 of the canonicalized `context`, signed with the tenant environment secret key (the same \"Inbox with context\" signing scheme). Required when the integration has HMAC validation enabled and the session did not already HMAC-verify the context, so the per-user link carries a trustworthy subscriber/tenant binding., userScope: [str] # **Slack only**: User-level OAuth scopes for \"Sign in with Slack\". Defaults to: identity.basic. **Webex**: Optional Webex scopes for people/me; defaults to spark:people_read. **MS Teams**: ignored — uses delegated OpenID scopes (openid, profile, User.Read).}\n@returns(201) {data: map{url: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/integrations/channel-endpoints/link\n@desc Issue a URL to link a subscriber chat identity\n@required {integrationIdentifier: str # Integration identifier for the chat provider integration, subscriberId: str # External subscriber identifier to link to their chat identity}\n@optional {context: map, contextHash: str # HMAC-SHA256 of the canonicalized `context`, signed with the tenant environment secret key (the same \"Inbox with context\" signing scheme). Required when the integration has HMAC validation enabled.}\n@returns(200) {data: map{url: str, providerMetadata: map}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/integrations/{integrationIdentifier}/webhook/configure\n@desc Configure a chat integration webhook\n@required {integrationIdentifier: str}\n@returns(200) {data: map{webhookUrl: str, configuredAt: str, botUsername: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/integrations/{integrationIdentifier}/mobile-link\n@desc Issue a short-lived mobile setup link for an existing integration\n@required {integrationIdentifier: str}\n@optional {subscriberId: str # Optional subscriber to link via `/start` deep link after mobile setup completes. When provided, the consume response may include a ready-to-open Telegram deep link.}\n@returns(200) {data: map{token: str, url: str, expiresAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group contexts\n@endpoint POST /v2/contexts\n@desc Create a context\n@required {type: str # Context type (e.g., tenant, app, workspace). Must be lowercase alphanumeric with optional separators., id: str # Unique identifier for this context. Must be lowercase alphanumeric with optional separators.}\n@optional {data: map # Optional custom data to associate with this context., bridgeUrl: str # Optional bridge URL override for agent connect. When an inbound agent turn resolves this context, its bridge call is routed here instead of the agent default bridge URL. Must be a publicly reachable URL.}\n@returns(201) {data: map{type: str, id: str, data: map, bridgeUrl: str, createdAt: str, updatedAt: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/contexts\n@desc List all contexts\n@optional {after: str # Cursor for pagination indicating the starting point after which to fetch results., before: str # Cursor for pagination indicating the ending point before which to fetch results., limit: num # Limit the number of items to return, orderDirection: str(ASC/DESC) # Direction of sorting, orderBy: str # Field to order by, includeCursor: bool # Include cursor item in response, id: str # Filter contexts by id, search: str # Search contexts by type or id (supports partial matching across both fields)}\n@returns(200) {data: map{data: [map], next: str?, previous: str?, totalCount: num, totalCountCapped: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/contexts/{type}/{id}\n@desc Update a context\n@required {id: str # Context ID, type: str # Context type, data: map # Custom data to associate with this context. Replaces existing data.}\n@optional {bridgeUrl: str # Optional bridge URL override for agent connect. When an inbound agent turn resolves this context, its bridge call is routed here instead of the agent default bridge URL. Must be a publicly reachable URL. Pass null to clear an existing override.}\n@returns(200) {data: map{type: str, id: str, data: map, bridgeUrl: str, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/contexts/{type}/{id}\n@desc Retrieve a context\n@required {id: str # Context ID, type: str # Context type}\n@returns(200) {data: map{type: str, id: str, data: map, bridgeUrl: str, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v2/contexts/{type}/{id}\n@desc Delete a context\n@required {id: str # Context ID, type: str # Context type}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group subscribers\n@endpoint POST /v1/subscribers/bulk\n@desc Bulk create subscribers\n@required {subscribers: [map{firstName: str, lastName: str, email: str, phone: str, avatar: str, locale: str, timezone: str, data: map, subscriberId!: str}] # An array of subscribers to be created in bulk.}\n@returns(201) {data: map{updated: [map], created: [map], failed: [map]}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PUT /v1/subscribers/{subscriberId}/credentials\n@desc Update provider credentials\n@required {subscriberId: str, providerId: str(slack/discord/msteams/webex-messaging/mattermost/ryver/zulip/grafana-on-call/getstream/rocket-chat/whatsapp-business/line/chat-webhook/novu-slack/telegram/sendblue/novu-web-chat/fcm/apns/expo/one-signal/pushpad/push-webhook/pusher-beams/appio) # The provider identifier for the credentials, credentials: any # Credentials payload for the specified provider}\n@optional {integrationIdentifier: str # The integration identifier}\n@returns(200) {data: map{_id: str, firstName: str?, lastName: str?, email: str?, phone: str?, avatar: str?, locale: str?, channels: [map], topics: [str], isOnline: bool?, lastOnlineAt: str?, __v: num, data: map?, timezone: str?, subscriberId: str, _organizationId: str, _environmentId: str, deleted: bool, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v1/subscribers/{subscriberId}/credentials\n@desc Upsert provider credentials\n@required {subscriberId: str, providerId: str(slack/discord/msteams/webex-messaging/mattermost/ryver/zulip/grafana-on-call/getstream/rocket-chat/whatsapp-business/line/chat-webhook/novu-slack/telegram/sendblue/novu-web-chat/fcm/apns/expo/one-signal/pushpad/push-webhook/pusher-beams/appio) # The provider identifier for the credentials, credentials: any # Credentials payload for the specified provider}\n@optional {integrationIdentifier: str # The integration identifier}\n@returns(200) {data: map{_id: str, firstName: str?, lastName: str?, email: str?, phone: str?, avatar: str?, locale: str?, channels: [map], topics: [str], isOnline: bool?, lastOnlineAt: str?, __v: num, data: map?, timezone: str?, subscriberId: str, _organizationId: str, _environmentId: str, deleted: bool, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/subscribers/{subscriberId}/credentials/{providerId}\n@desc Delete provider credentials\n@required {subscriberId: str, providerId: str}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v1/subscribers/{subscriberId}/online-status\n@desc Update subscriber online status\n@required {subscriberId: str, isOnline: bool}\n@returns(200) {data: map{_id: str, firstName: str?, lastName: str?, email: str?, phone: str?, avatar: str?, locale: str?, channels: [map], topics: [str], isOnline: bool?, lastOnlineAt: str?, __v: num, data: map?, timezone: str?, subscriberId: str, _organizationId: str, _environmentId: str, deleted: bool, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/subscribers/{subscriberId}/notifications/feed\n@desc Retrieve subscriber notifications\n@required {subscriberId: str}\n@optional {page: num, limit: num=10, read: bool, seen: bool, payload: str # Base64 encoded string of the partial payload JSON object}\n@returns(200) {data: map{totalCount: num, hasMore: bool, data: [map], pageSize: num, page: num}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/subscribers/{subscriberId}/notifications/unseen\n@desc Retrieve unseen notifications count\n@required {subscriberId: str}\n@optional {seen: bool=false # Indicates whether to count seen notifications., limit: num=100 # The maximum number of notifications to return.}\n@returns(200) {data: map{count: num}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/subscribers/{subscriberId}/messages/mark-as\n@desc Update notifications state\n@required {subscriberId: str, messageId: any, markAs: str(read/seen/unread/unseen)}\n@returns(201) {data: [map]} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/subscribers/{subscriberId}/messages/mark-all\n@desc Update all notifications state\n@required {subscriberId: str, markAs: str(read/seen/unread/unseen) # Mark all subscriber messages as read, unread, seen or unseen}\n@optional {feedIdentifier: any # Optional feed identifier or array of feed identifiers}\n@returns(201)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/subscribers/{subscriberId}/messages/{messageId}/actions/{type}\n@desc Update notification action status\n@required {messageId: str, type: any, subscriberId: str, status: str(pending/done) # Message action status}\n@optional {payload: map # Message action payload}\n@returns(201) {data: map{_id: str, _templateId: str?, _environmentId: str, _messageTemplateId: str?, _organizationId: str, _notificationId: str, _subscriberId: str, subscriber: any, template: any, templateIdentifier: str, createdAt: str, deliveredAt: [str], lastSeenDate: str, lastReadDate: str, content: any?, transactionId: str, subject: str, channel: str, read: bool, seen: bool, snoozedUntil: str, email: str, phone: str, directWebhookUrl: str, providerId: str, deviceTokens: [str], title: str, cta: any, _feedId: str?, status: str, errorId: str, errorText: str, payload: map, overrides: map, contextKeys: [str]}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/subscribers\n@desc Search subscribers\n@optional {after: str # Cursor for pagination indicating the starting point after which to fetch results., before: str # Cursor for pagination indicating the ending point before which to fetch results., limit: num # Limit the number of items to return, orderDirection: str(ASC/DESC) # Direction of sorting, orderBy: str # Field to order by, includeCursor: bool # Include cursor item in response, email: str # Email address of the subscriber to filter results., name: str # Name of the subscriber to filter results., phone: str # Phone number of the subscriber to filter results., subscriberId: str # Unique identifier of the subscriber to filter results.}\n@returns(200) {data: map{data: [map], next: str?, previous: str?, totalCount: num, totalCountCapped: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/subscribers\n@desc Create a subscriber\n@required {subscriberId: str # Unique identifier of the subscriber}\n@optional {failIfExists: bool # If true, the request will fail if a subscriber with the same subscriberId already exists, firstName: str # First name of the subscriber, lastName: str # Last name of the subscriber, email: str # Email address of the subscriber, phone: str # Phone number of the subscriber, avatar: str # Avatar URL or identifier, locale: str # Locale of the subscriber, timezone: str # Timezone of the subscriber, data: map # Additional custom data associated with the subscriber}\n@returns(201) {data: map{_id: str, firstName: str?, lastName: str?, email: str?, phone: str?, avatar: str?, locale: str?, channels: [map], topics: [str], isOnline: bool?, lastOnlineAt: str?, __v: num, data: map?, timezone: str?, subscriberId: str, _organizationId: str, _environmentId: str, deleted: bool, createdAt: str, updatedAt: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Subscriber already exists (when query param failIfExists=true), 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/subscribers/{subscriberId}\n@desc Retrieve a subscriber\n@required {subscriberId: str # The identifier of the subscriber}\n@returns(200) {data: map{_id: str, firstName: str?, lastName: str?, email: str?, phone: str?, avatar: str?, locale: str?, channels: [map], topics: [str], isOnline: bool?, lastOnlineAt: str?, __v: num, data: map?, timezone: str?, subscriberId: str, _organizationId: str, _environmentId: str, deleted: bool, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/subscribers/{subscriberId}\n@desc Update a subscriber\n@required {subscriberId: str # The identifier of the subscriber}\n@optional {firstName: str # First name of the subscriber, lastName: str # Last name of the subscriber, email: str # Email address of the subscriber, phone: str # Phone number of the subscriber, avatar: str # Avatar URL or identifier, locale: str # Locale of the subscriber, timezone: str # Timezone of the subscriber, data: map # Additional custom data associated with the subscriber}\n@returns(200) {data: map{_id: str, firstName: str?, lastName: str?, email: str?, phone: str?, avatar: str?, locale: str?, channels: [map], topics: [str], isOnline: bool?, lastOnlineAt: str?, __v: num, data: map?, timezone: str?, subscriberId: str, _organizationId: str, _environmentId: str, deleted: bool, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v2/subscribers/{subscriberId}\n@desc Delete a subscriber\n@required {subscriberId: str # The identifier of the subscriber}\n@returns(200) {data: map{acknowledged: bool, status: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/subscribers/{subscriberId}/preferences\n@desc Retrieve subscriber preferences\n@required {subscriberId: str # The identifier of the subscriber}\n@optional {criticality: str(critical/nonCritical/all)=nonCritical, contextKeys: [str] # Context keys for filtering preferences (e.g., [\"tenant:acme\"])}\n@returns(200) {data: map{global: any, workflows: [map]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/subscribers/{subscriberId}/preferences\n@desc Update subscriber preferences\n@required {subscriberId: str # The identifier of the subscriber}\n@optional {channels: any # Channel-specific preference settings, workflowId: str # Workflow internal _id, identifier or slug. If provided, update workflow specific preferences, otherwise update global preferences, schedule: any # Subscriber schedule, context: map}\n@returns(200) {data: map{global: any, workflows: [map]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/subscribers/{subscriberId}/preferences/bulk\n@desc Bulk update subscriber preferences\n@required {subscriberId: str # The identifier of the subscriber, preferences: [map{channels!: any, workflowId!: str}] # Array of workflow preferences to update (maximum 100 items)}\n@optional {context: map}\n@returns(200) {data: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/subscribers/{subscriberId}/subscriptions\n@desc Retrieve subscriber subscriptions\n@required {subscriberId: str # The identifier of the subscriber}\n@optional {after: str # Cursor for pagination indicating the starting point after which to fetch results., before: str # Cursor for pagination indicating the ending point before which to fetch results., limit: num # Limit the number of items to return (max 100), orderDirection: str(ASC/DESC) # Direction of sorting, orderBy: str # Field to order by, includeCursor: bool # Include cursor item in response, key: str # Filter by topic key, contextKeys: [str] # Filter by exact context keys, order insensitive (format: \"type:id\")}\n@returns(200) {data: map{data: [map], next: str?, previous: str?, totalCount: num, totalCountCapped: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/subscribers/{subscriberId}/notifications\n@desc Retrieve subscriber notifications\n@required {subscriberId: str # The identifier of the subscriber}\n@optional {limit: num=10, after: str, offset: num, read: bool # Filter by read/unread state, archived: bool # Filter by archived state, snoozed: bool # Filter by snoozed state, seen: bool # Filter by seen state, data: str # Filter by data attributes (JSON string), severity: [str] # Filter by severity levels, createdGte: num # Filter notifications created on or after this timestamp (Unix timestamp in milliseconds), createdLte: num # Filter notifications created on or before this timestamp (Unix timestamp in milliseconds), contextKeys: [str] # Context keys for filtering notifications in multi-context scenarios}\n@returns(200) {data: map{data: [map], hasMore: bool, filter: map}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/subscribers/{subscriberId}/notifications/count\n@desc Retrieve subscriber notifications count\n@required {subscriberId: str # The identifier of the subscriber, filters: str # Array of filter objects (max 30) to count notifications by different criteria}\n@returns(200) {data: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/subscribers/{subscriberId}/notifications/{notificationId}/read\n@desc Mark a notification as read\n@required {subscriberId: str # The identifier of the subscriber, notificationId: str # The identifier of the notification}\n@optional {contextKeys: [str] # Context keys for filtering}\n@returns(200) {id: str, transactionId: str, subject: str, body: str, to: any, isRead: bool, isSeen: bool, isArchived: bool, isSnoozed: bool, snoozedUntil: str?, deliveredAt: [str], createdAt: str, readAt: str?, firstSeenAt: str?, archivedAt: str?, avatar: str, primaryAction: any, secondaryAction: any, channelType: str, tags: [str], data: map, redirect: any, workflow: any, severity: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/subscribers/{subscriberId}/notifications/{notificationId}/unread\n@desc Mark a notification as unread\n@required {subscriberId: str # The identifier of the subscriber, notificationId: str # The identifier of the notification}\n@optional {contextKeys: [str] # Context keys for filtering}\n@returns(200) {id: str, transactionId: str, subject: str, body: str, to: any, isRead: bool, isSeen: bool, isArchived: bool, isSnoozed: bool, snoozedUntil: str?, deliveredAt: [str], createdAt: str, readAt: str?, firstSeenAt: str?, archivedAt: str?, avatar: str, primaryAction: any, secondaryAction: any, channelType: str, tags: [str], data: map, redirect: any, workflow: any, severity: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/subscribers/{subscriberId}/notifications/{notificationId}/archive\n@desc Archive a notification\n@required {subscriberId: str # The identifier of the subscriber, notificationId: str # The identifier of the notification}\n@optional {contextKeys: [str] # Context keys for filtering}\n@returns(200) {id: str, transactionId: str, subject: str, body: str, to: any, isRead: bool, isSeen: bool, isArchived: bool, isSnoozed: bool, snoozedUntil: str?, deliveredAt: [str], createdAt: str, readAt: str?, firstSeenAt: str?, archivedAt: str?, avatar: str, primaryAction: any, secondaryAction: any, channelType: str, tags: [str], data: map, redirect: any, workflow: any, severity: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/subscribers/{subscriberId}/notifications/{notificationId}/unarchive\n@desc Unarchive a notification\n@required {subscriberId: str # The identifier of the subscriber, notificationId: str # The identifier of the notification}\n@optional {contextKeys: [str] # Context keys for filtering}\n@returns(200) {id: str, transactionId: str, subject: str, body: str, to: any, isRead: bool, isSeen: bool, isArchived: bool, isSnoozed: bool, snoozedUntil: str?, deliveredAt: [str], createdAt: str, readAt: str?, firstSeenAt: str?, archivedAt: str?, avatar: str, primaryAction: any, secondaryAction: any, channelType: str, tags: [str], data: map, redirect: any, workflow: any, severity: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/subscribers/{subscriberId}/notifications/{notificationId}/snooze\n@desc Snooze a notification\n@required {subscriberId: str # The identifier of the subscriber, notificationId: str # The identifier of the notification, snoozeUntil: str(date-time) # The date and time until which the notification should be snoozed}\n@optional {contextKeys: [str] # Context keys for filtering}\n@returns(200) {id: str, transactionId: str, subject: str, body: str, to: any, isRead: bool, isSeen: bool, isArchived: bool, isSnoozed: bool, snoozedUntil: str?, deliveredAt: [str], createdAt: str, readAt: str?, firstSeenAt: str?, archivedAt: str?, avatar: str, primaryAction: any, secondaryAction: any, channelType: str, tags: [str], data: map, redirect: any, workflow: any, severity: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/subscribers/{subscriberId}/notifications/{notificationId}/unsnooze\n@desc Unsnooze a notification\n@required {subscriberId: str # The identifier of the subscriber, notificationId: str # The identifier of the notification}\n@optional {contextKeys: [str] # Context keys for filtering}\n@returns(200) {id: str, transactionId: str, subject: str, body: str, to: any, isRead: bool, isSeen: bool, isArchived: bool, isSnoozed: bool, snoozedUntil: str?, deliveredAt: [str], createdAt: str, readAt: str?, firstSeenAt: str?, archivedAt: str?, avatar: str, primaryAction: any, secondaryAction: any, channelType: str, tags: [str], data: map, redirect: any, workflow: any, severity: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v2/subscribers/{subscriberId}/notifications/{notificationId}\n@desc Delete a notification\n@required {subscriberId: str # The identifier of the subscriber, notificationId: str # The identifier of the notification}\n@optional {contextKeys: [str] # Context keys for filtering}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/subscribers/{subscriberId}/notifications/{notificationId}/actions/{actionType}/complete\n@desc Complete a notification action\n@required {subscriberId: str # The identifier of the subscriber, notificationId: str # The identifier of the notification, actionType: str(primary/secondary) # The type of action (primary or secondary)}\n@optional {contextKeys: [str] # Context keys for filtering}\n@returns(200) {id: str, transactionId: str, subject: str, body: str, to: any, isRead: bool, isSeen: bool, isArchived: bool, isSnoozed: bool, snoozedUntil: str?, deliveredAt: [str], createdAt: str, readAt: str?, firstSeenAt: str?, archivedAt: str?, avatar: str, primaryAction: any, secondaryAction: any, channelType: str, tags: [str], data: map, redirect: any, workflow: any, severity: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/subscribers/{subscriberId}/notifications/{notificationId}/actions/{actionType}/revert\n@desc Revert a notification action\n@required {subscriberId: str # The identifier of the subscriber, notificationId: str # The identifier of the notification, actionType: str(primary/secondary) # The type of action (primary or secondary)}\n@optional {contextKeys: [str] # Context keys for filtering}\n@returns(200) {id: str, transactionId: str, subject: str, body: str, to: any, isRead: bool, isSeen: bool, isArchived: bool, isSnoozed: bool, snoozedUntil: str?, deliveredAt: [str], createdAt: str, readAt: str?, firstSeenAt: str?, archivedAt: str?, avatar: str, primaryAction: any, secondaryAction: any, channelType: str, tags: [str], data: map, redirect: any, workflow: any, severity: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/subscribers/{subscriberId}/notifications/seen\n@desc Mark notifications as seen\n@required {subscriberId: str # The identifier of the subscriber}\n@optional {notificationIds: [str] # Specific notification IDs to mark as seen, tags: map # Filter notifications by workflow tags (OR for string[], or { and: [{ or: string[] }, ...] } for AND of OR-groups)., data: str # Filter notifications by data attributes (JSON string), contextKeys: [str] # Context keys for filtering notifications}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/subscribers/{subscriberId}/notifications/read\n@desc Mark all notifications as read\n@required {subscriberId: str # The identifier of the subscriber}\n@optional {tags: map # Filter notifications by workflow tags (OR for string[], or { and: [{ or: string[] }, ...] } for AND of OR-groups)., data: str # Filter notifications by data attributes (JSON string), contextKeys: [str] # Context keys for filtering notifications}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/subscribers/{subscriberId}/notifications/archive\n@desc Archive all notifications\n@required {subscriberId: str # The identifier of the subscriber}\n@optional {tags: map # Filter notifications by workflow tags (OR for string[], or { and: [{ or: string[] }, ...] } for AND of OR-groups)., data: str # Filter notifications by data attributes (JSON string), contextKeys: [str] # Context keys for filtering notifications}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/subscribers/{subscriberId}/notifications/read-archive\n@desc Archive all read notifications\n@required {subscriberId: str # The identifier of the subscriber}\n@optional {tags: map # Filter notifications by workflow tags (OR for string[], or { and: [{ or: string[] }, ...] } for AND of OR-groups)., data: str # Filter notifications by data attributes (JSON string), contextKeys: [str] # Context keys for filtering notifications}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/subscribers/{subscriberId}/notifications/delete\n@desc Delete all notifications\n@required {subscriberId: str # The identifier of the subscriber}\n@optional {tags: map # Filter notifications by workflow tags (OR for string[], or { and: [{ or: string[] }, ...] } for AND of OR-groups)., data: str # Filter notifications by data attributes (JSON string), contextKeys: [str] # Context keys for filtering notifications}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group layouts\n@endpoint POST /v2/layouts\n@desc Create a layout\n@required {layoutId: str # Unique identifier for the layout, name: str # Name of the layout}\n@optional {isTranslationEnabled: bool=false # Enable or disable translations for this layout, __source: str=dashboard # Source of layout creation}\n@returns(201) {data: map{_id: str, layoutId: str, slug: str, name: str, isDefault: bool, isTranslationEnabled: bool, updatedAt: str, updatedBy: any?, createdAt: str, origin: str, type: str, variables: map?, controls: any}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/layouts\n@desc List all layouts\n@optional {limit: num # Number of items to return per page, offset: num # Number of items to skip before starting to return results, orderDirection: str # Direction of sorting, orderBy: str # Field to sort the results by, query: str # Search query to filter layouts}\n@returns(200) {data: map{layouts: [map], totalCount: num}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PUT /v2/layouts/{layoutId}\n@desc Update a layout\n@required {layoutId: str, name: str # Name of the layout}\n@optional {isTranslationEnabled: bool=false # Enable or disable translations for this layout, controlValues: any # Control values for the layout. Omit to leave unchanged, or set to null to clear stored control values.}\n@returns(200) {data: map{_id: str, layoutId: str, slug: str, name: str, isDefault: bool, isTranslationEnabled: bool, updatedAt: str, updatedBy: any?, createdAt: str, origin: str, type: str, variables: map?, controls: any}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/layouts/{layoutId}\n@desc Retrieve a layout\n@required {layoutId: str}\n@returns(200) {data: map{_id: str, layoutId: str, slug: str, name: str, isDefault: bool, isTranslationEnabled: bool, updatedAt: str, updatedBy: any?, createdAt: str, origin: str, type: str, variables: map?, controls: any}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v2/layouts/{layoutId}\n@desc Delete a layout\n@required {layoutId: str # The unique identifier of the layout}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/layouts/{layoutId}/duplicate\n@desc Duplicate a layout\n@required {layoutId: str, name: str # Name of the layout}\n@optional {layoutId: str # Identifier for the duplicated layout. When omitted, it is derived from the name., isTranslationEnabled: bool=false # Enable or disable translations for this layout}\n@returns(201) {data: map{_id: str, layoutId: str, slug: str, name: str, isDefault: bool, isTranslationEnabled: bool, updatedAt: str, updatedBy: any?, createdAt: str, origin: str, type: str, variables: map?, controls: any}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/layouts/{layoutId}/preview\n@desc Generate layout preview\n@required {layoutId: str}\n@optional {controlValues: map # Optional control values for layout preview, previewPayload: any # Optional payload for layout preview}\n@returns(201) {data: map{previewPayloadExample: any, schema: map?, result: any}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/layouts/{layoutId}/usage\n@desc Get layout usage\n@required {layoutId: str}\n@returns(200) {data: map{workflows: [map]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group messages\n@endpoint GET /v1/messages\n@desc List all messages\n@optional {channel: str, subscriberId: str, transactionId: [str], contextKeys: [str] # Filter by exact context keys, order insensitive (format: \"type:id\"), page: num=0, limit: num=10}\n@returns(200) {totalCount: num, hasMore: bool, data: [map], pageSize: num, page: num}\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/messages/{messageId}\n@desc Delete a message\n@required {messageId: str}\n@returns(200) {data: map{acknowledged: bool, status: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/messages/transaction/{transactionId}\n@desc Delete messages by transactionId\n@required {transactionId: str}\n@optional {channel: str(in_app/email/sms/chat/push/tool) # The channel of the message to be deleted}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group topics\n@endpoint GET /v1/topics/{topicKey}/subscribers/{externalSubscriberId}\n@desc Check topic subscriber\n@required {externalSubscriberId: str # The external subscriber id, topicKey: str # The topic key}\n@returns(200) {_organizationId: str, _environmentId: str, _subscriberId: str, _topicId: str, topicKey: str, externalSubscriberId: str}\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/topics\n@desc List all topics\n@optional {after: str # Cursor for pagination indicating the starting point after which to fetch results., before: str # Cursor for pagination indicating the ending point before which to fetch results., limit: num # Limit the number of items to return (max 100), orderDirection: str(ASC/DESC) # Direction of sorting, orderBy: str # Field to order by, includeCursor: bool # Include cursor item in response, key: str # Key of the topic to filter results., name: str # Name of the topic to filter results.}\n@returns(200) {data: map{data: [map], next: str?, previous: str?, totalCount: num, totalCountCapped: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/topics\n@desc Create a topic\n@required {key: str # The unique key identifier for the topic. The key must contain only alphanumeric characters (a-z, A-Z, 0-9), hyphens (-), underscores (_), colons (:), or be a valid email address.}\n@optional {failIfExists: bool # If true, the request will fail if a topic with the same key already exists, name: str # The display name for the topic, data: map # Additional custom data associated with the topic. Flat key-value pairs of scalars (string, number, boolean, string[]). Maximum size: 64KB.}\n@returns(200) {data: map{_id: str, key: str, name: str, data: map, createdAt: str, updatedAt: str}} # OK\n@returns(201) {data: map{_id: str, key: str, name: str, data: map, createdAt: str, updatedAt: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Topic already exists (when query param failIfExists=true), 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/topics/{topicKey}\n@desc Retrieve a topic\n@required {topicKey: str # The key identifier of the topic}\n@returns(200) {data: map{_id: str, key: str, name: str, data: map, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/topics/{topicKey}\n@desc Update a topic\n@required {topicKey: str # The key identifier of the topic}\n@optional {name: str # The display name for the topic, data: map # Additional custom data associated with the topic. Flat key-value pairs of scalars (string, number, boolean, string[]). Maximum size: 64KB. Pass null to clear.}\n@returns(200) {data: map{_id: str, key: str, name: str, data: map, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v2/topics/{topicKey}\n@desc Delete a topic\n@required {topicKey: str # The key identifier of the topic}\n@returns(200) {data: map{acknowledged: bool}} # Topic deleted successfully\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/topics/{topicKey}/subscriptions\n@desc List topic subscriptions\n@required {topicKey: str # The key identifier of the topic}\n@optional {after: str # Cursor for pagination indicating the starting point after which to fetch results., before: str # Cursor for pagination indicating the ending point before which to fetch results., limit: num # Limit the number of items to return (max 100), orderDirection: str(ASC/DESC) # Direction of sorting, orderBy: str # Field to order by, includeCursor: bool # Include cursor item in response, subscriberId: str # Filter by subscriber ID, contextKeys: [str] # Filter by exact context keys, order insensitive (format: \"type:id\")}\n@returns(200) {data: map{data: [map], next: str?, previous: str?, totalCount: num, totalCountCapped: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/topics/{topicKey}/subscriptions\n@desc Create topic subscriptions\n@required {topicKey: str # The key identifier of the topic}\n@optional {subscriberIds: [str] # List of subscriber IDs to subscribe to the topic (max: 100). @deprecated Use the \"subscriptions\" property instead., subscriptions: [any] # List of subscriptions to subscribe to the topic (max: 100). Can be either a string array of subscriber IDs or an array of objects with identifier and subscriberId, name: str # The name of the topic, context: map, preferences: [any] # The preferences of the topic. Can be a simple workflow ID string, workflow preference object, or group filter object}\n@returns(201) {data: map{data: [map], meta: any, errors: [map]}} # Subscriptions created successfully\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v2/topics/{topicKey}/subscriptions\n@desc Delete topic subscriptions\n@required {topicKey: str # The key identifier of the topic}\n@optional {subscriberIds: [str] # List of subscriber identifiers to unsubscribe from the topic (max: 100). @deprecated Use the \"subscriptions\" property instead., subscriptions: [any] # List of subscriptions to unsubscribe from the topic (max: 100). Can be either a string array of subscriber IDs or an array of objects with identifier and/or subscriberId. If only subscriberId is provided, all subscriptions for that subscriber within the topic will be deleted.}\n@returns(200) {data: [map], meta: any, errors: [map]} # Subscriptions deleted successfully\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/topics/{topicKey}/subscriptions/{identifier}\n@desc Retrieve a topic subscription\n@required {topicKey: str # The key identifier of the topic, identifier: str # The unique identifier of the subscription}\n@returns(200) {data: map{id: str, identifier: str, name: str, preferences: [map], contextKeys: [str]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/topics/{topicKey}/subscriptions/{identifier}\n@desc Update a topic subscription\n@required {topicKey: str # The key identifier of the topic, identifier: str # The unique identifier of the subscription}\n@optional {name: str # The name of the subscription, preferences: [any] # The preferences of the topic. Can be a simple workflow ID string, workflow preference object, or group filter object}\n@returns(200) {data: map{_id: str, identifier: str, name: str, topic: any, subscriber: any?, preferences: [map], contextKeys: [str], createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group environment-variables\n@endpoint GET /v1/environment-variables\n@desc List all variables\n@optional {search: str # Filter variables by key (case-insensitive partial match)}\n@returns(200) {data: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/environment-variables\n@desc Create a variable\n@required {key: str # Unique key for the variable. Must start with a letter and contain only letters, digits, and underscores.}\n@optional {type: str # The type of the variable, isSecret: bool # Whether this variable is a secret (encrypted at rest, masked in responses), values: [map{_environmentId!: str, value!: str}]}\n@returns(200) {data: map{_id: str, _organizationId: str, key: str, type: str, isSecret: bool, values: [map], createdAt: str, updatedAt: str}} # OK\n@errors {400: A submitted value equals the public secret mask placeholder, which is reserved., 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: An environment variable with the same key already exists., 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/environment-variables/{variableKey}/usage\n@desc Retrieve a variable usage\n@required {variableKey: str # The unique key of the environment variable (e.g. BASE_URL)}\n@returns(200) {data: map{workflows: [map]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Environment variable not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/environment-variables/{variableKey}\n@desc Get environment variable\n@required {variableKey: str # The unique key of the environment variable (e.g. BASE_URL)}\n@returns(200) {data: map{_id: str, _organizationId: str, key: str, type: str, isSecret: bool, values: [map], createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Environment variable not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v1/environment-variables/{variableKey}\n@desc Update a variable\n@required {variableKey: str # The unique key of the environment variable (e.g. BASE_URL)}\n@optional {key: str # Unique key for the variable. Must start with a letter and contain only letters, digits, and underscores., type: str # The type of the variable, isSecret: bool, values: [map{_environmentId!: str, value!: str}]}\n@returns(200) {data: map{_id: str, _organizationId: str, key: str, type: str, isSecret: bool, values: [map], createdAt: str, updatedAt: str}} # OK\n@errors {400: A submitted value equals the public secret mask placeholder, or no fields were provided to update., 401: Unauthorized, 403: Forbidden, 404: Environment variable not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/environment-variables/{variableKey}\n@desc Delete environment variable\n@required {variableKey: str # The unique key of the environment variable (e.g. BASE_URL)}\n@returns(204) The environment variable has been deleted.\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Environment variable not found., 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group workflows\n@endpoint POST /v2/workflows\n@desc Create a workflow\n@required {name: str # Name of the workflow, workflowId: str # Unique identifier for the workflow, steps: [any] # Steps of the workflow}\n@optional {description: str # Description of the workflow, tags: [str] # Tags associated with the workflow, active: bool=false # Whether the workflow is active, validatePayload: bool # Enable or disable payload schema validation, payloadSchema: map # The payload JSON Schema for the workflow, isTranslationEnabled: bool=false # Enable or disable translations for this workflow, agent: any # Optional agent assignment used to route this workflow through an agent's connected channels. Pass null to clear., __source: str(template_store/editor/notification_directory/onboarding_digest_demo/onboarding_in_app/empty_state/dropdown/onboarding_get_started/bridge/dashboard/ai)=editor # Source of workflow creation, preferences: any # Workflow preferences, severity: str(high/medium/low/none) # Severity of the workflow}\n@returns(201) {data: map{name: str, description: str, tags: [str], active: bool, validatePayload: bool, payloadSchema: map?, isTranslationEnabled: bool, agent: any?, _id: str, workflowId: str, slug: str, updatedAt: str, createdAt: str, updatedBy: any?, lastPublishedAt: str?, lastPublishedBy: any?, steps: [any], origin: str, preferences: any, status: str, issues: map, lastTriggeredAt: str?, payloadExample: map?, severity: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/workflows\n@desc List all workflows\n@optional {limit: num # Number of items to return per page, offset: num # Number of items to skip before starting to return results, orderDirection: str # Direction of sorting, orderBy: str # Field to sort the results by, query: str # Search query to filter workflows, tags: [str] # Filter workflows by tags, status: [str] # Filter workflows by status}\n@returns(200) {data: map{workflows: [map], totalCount: num}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PUT /v2/workflows/{workflowId}/sync\n@desc Sync a workflow\n@required {workflowId: str, targetEnvironmentId: str # Target environment identifier to sync the workflow to}\n@returns(200) {data: map{name: str, description: str, tags: [str], active: bool, validatePayload: bool, payloadSchema: map?, isTranslationEnabled: bool, agent: any?, _id: str, workflowId: str, slug: str, updatedAt: str, createdAt: str, updatedBy: any?, lastPublishedAt: str?, lastPublishedBy: any?, steps: [any], origin: str, preferences: any, status: str, issues: map, lastTriggeredAt: str?, payloadExample: map?, severity: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PUT /v2/workflows/{workflowId}\n@desc Update a workflow\n@required {workflowId: str, name: str # Name of the workflow, steps: [any] # Steps of the workflow, preferences: any # Workflow preferences}\n@optional {description: str # Description of the workflow, tags: [str] # Tags associated with the workflow, active: bool=false # Whether the workflow is active, validatePayload: bool # Enable or disable payload schema validation, payloadSchema: map # The payload JSON Schema for the workflow, isTranslationEnabled: bool=false # Enable or disable translations for this workflow, agent: any # Optional agent assignment used to route this workflow through an agent's connected channels. Pass null to clear., workflowId: str # Workflow ID (allowed only for code-first workflows), origin: str(novu-cloud/novu-cloud-v1/external) # Origin of the layout, severity: str(high/medium/low/none) # Severity of the workflow}\n@returns(200) {data: map{name: str, description: str, tags: [str], active: bool, validatePayload: bool, payloadSchema: map?, isTranslationEnabled: bool, agent: any?, _id: str, workflowId: str, slug: str, updatedAt: str, createdAt: str, updatedBy: any?, lastPublishedAt: str?, lastPublishedBy: any?, steps: [any], origin: str, preferences: any, status: str, issues: map, lastTriggeredAt: str?, payloadExample: map?, severity: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/workflows/{workflowId}\n@desc Retrieve a workflow\n@required {workflowId: str}\n@optional {environmentId: str}\n@returns(200) {data: map{name: str, description: str, tags: [str], active: bool, validatePayload: bool, payloadSchema: map?, isTranslationEnabled: bool, agent: any?, _id: str, workflowId: str, slug: str, updatedAt: str, createdAt: str, updatedBy: any?, lastPublishedAt: str?, lastPublishedBy: any?, steps: [any], origin: str, preferences: any, status: str, issues: map, lastTriggeredAt: str?, payloadExample: map?, severity: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v2/workflows/{workflowId}\n@desc Delete a workflow\n@required {workflowId: str}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v2/workflows/{workflowId}\n@desc Update a workflow\n@required {workflowId: str}\n@optional {active: bool # Activate or deactivate the workflow, name: str # New name for the workflow, description: str # Updated description of the workflow, tags: [str] # Tags associated with the workflow, payloadSchema: map # The payload JSON Schema for the workflow, validatePayload: bool # Enable or disable payload schema validation, isTranslationEnabled: bool # Enable or disable translations for this workflow}\n@returns(200) {data: map{name: str, description: str, tags: [str], active: bool, validatePayload: bool, payloadSchema: map?, isTranslationEnabled: bool, agent: any?, _id: str, workflowId: str, slug: str, updatedAt: str, createdAt: str, updatedBy: any?, lastPublishedAt: str?, lastPublishedBy: any?, steps: [any], origin: str, preferences: any, status: str, issues: map, lastTriggeredAt: str?, payloadExample: map?, severity: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/workflows/{workflowId}/step/{stepId}/preview\n@desc Generate a step preview\n@required {workflowId: str, stepId: str}\n@optional {controlValues: map # Optional control values, previewPayload: any # Optional payload for preview generation}\n@returns(201) {data: map{previewPayloadExample: any, schema: map?, novuSignature: str, result: any}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v2/workflows/{workflowId}/steps/{stepId}\n@desc Retrieve workflow step\n@required {workflowId: str, stepId: str}\n@returns(200) {data: map{controls: any, controlValues: map, providerOverrides: map?, variables: map, stepId: str, _id: str, name: str, slug: str, type: str, origin: str, workflowId: str, workflowDatabaseId: str, issues: any, stepResolverHash: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group environments\n@endpoint GET /v2/environments/{environmentId}/tags\n@desc List environment tags\n@required {environmentId: str # Environment internal ID (MongoDB ObjectId) or identifier}\n@returns(200) {data: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/environments/{targetEnvironmentId}/publish\n@desc Publish resources to target environment\n@required {targetEnvironmentId: str # Target environment ID (MongoDB ObjectId) to publish resources to}\n@optional {sourceEnvironmentId: str # Source environment ID to sync from. Defaults to the Development environment if not provided., dryRun: bool=false # Perform a dry run without making actual changes, resources: [map{resourceType!: str, resourceId!: str}] # Array of specific resources to publish. If not provided, all resources will be published.}\n@returns(200) {data: map{results: [map], summary: any}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v2/environments/{targetEnvironmentId}/diff\n@desc Compare resources between environments\n@required {targetEnvironmentId: str # Target environment ID (MongoDB ObjectId) to compare against}\n@optional {sourceEnvironmentId: str # Source environment ID to compare from. Defaults to the Development environment if not provided.}\n@returns(200) {data: map{sourceEnvironmentId: str, targetEnvironmentId: str, resources: [map], summary: any}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group channel-connections\n@endpoint GET /v1/channel-connections\n@desc List all channel connections\n@optional {after: str # Cursor for pagination indicating the starting point after which to fetch results., before: str # Cursor for pagination indicating the ending point before which to fetch results., limit: num # Limit the number of items to return (max 100), orderDirection: str(ASC/DESC) # Direction of sorting, orderBy: str # Field to order by, includeCursor: bool # Include cursor item in response, subscriberId: str # The subscriber ID to filter results by, connectionMode: str(subscriber/shared) # Scope results relative to the subscriber. `subscriber` returns only the subscriber-owned connections, `shared` returns only shared (workspace-level) connections. Omit to return both., channel: str(in_app/email/sms/chat/push/tool) # Filter by channel type (email, sms, push, chat, etc.)., providerId: str # Filter by provider identifier (e.g., sendgrid, twilio, slack, etc.)., integrationIdentifier: str # Filter by integration identifier., contextKeys: [str] # Filter by exact context keys, order insensitive (format: \"type:id\")}\n@returns(200) {data: map{data: [map], next: str?, previous: str?, totalCount: num, totalCountCapped: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/channel-connections\n@desc Create a channel connection\n@required {integrationIdentifier: str # The identifier of the integration to use for this channel connection., workspace: map{id!: str, name: str, botUserId: str}, auth: map{accessToken!: str, refreshToken: str, expiresAt: str, refreshTokenExpiresAt: str}}\n@optional {identifier: str # The unique identifier for the channel connection. If not provided, one will be generated automatically., subscriberId: str # The subscriber ID to link the channel connection to, context: map, connectionMode: str(subscriber/shared) # Connection mode that determines how the channel connection is scoped. Use \"subscriber\" (default) to associate the connection with a specific subscriber. Use \"shared\" to associate the connection with a context instead of a subscriber — subscriberId will not be stored on the connection.}\n@returns(201) {data: map{identifier: str, channel: str?, providerId: str?, integrationIdentifier: str?, subscriberId: str?, contextKeys: [str], workspace: map{id: str, name: str, botUserId: str}, auth: map{accessToken: str, refreshToken: str, expiresAt: str, refreshTokenExpiresAt: str}, createdAt: str, updatedAt: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/channel-connections/{identifier}\n@desc Retrieve a channel connection\n@required {identifier: str # The unique identifier of the channel connection}\n@returns(200) {data: map{identifier: str, channel: str?, providerId: str?, integrationIdentifier: str?, subscriberId: str?, contextKeys: [str], workspace: map{id: str, name: str, botUserId: str}, auth: map{accessToken: str, refreshToken: str, expiresAt: str, refreshTokenExpiresAt: str}, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v1/channel-connections/{identifier}\n@desc Update a channel connection\n@required {identifier: str # The unique identifier of the channel connection, workspace: map{id!: str, name: str, botUserId: str}, auth: map{accessToken!: str, refreshToken: str, expiresAt: str, refreshTokenExpiresAt: str}}\n@returns(200) {data: map{identifier: str, channel: str?, providerId: str?, integrationIdentifier: str?, subscriberId: str?, contextKeys: [str], workspace: map{id: str, name: str, botUserId: str}, auth: map{accessToken: str, refreshToken: str, expiresAt: str, refreshTokenExpiresAt: str}, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/channel-connections/{identifier}\n@desc Delete a channel connection\n@required {identifier: str # The unique identifier of the channel connection}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group channel-endpoints\n@endpoint GET /v1/channel-endpoints\n@desc List all channel endpoints\n@optional {after: str # Cursor for pagination indicating the starting point after which to fetch results., before: str # Cursor for pagination indicating the ending point before which to fetch results., limit: num # Limit the number of items to return (max 100), orderDirection: str(ASC/DESC) # Direction of sorting, orderBy: str # Field to order by, includeCursor: bool # Include cursor item in response, subscriberId: str # The subscriber ID to filter results by, contextKeys: [str] # Filter by exact context keys, order insensitive (format: \"type:id\"), channel: str(in_app/email/sms/chat/push/tool) # Channel type to filter results., providerId: str # Filter by provider identifier (e.g., sendgrid, twilio, slack, etc.)., integrationIdentifier: str # Integration identifier to filter results., connectionIdentifier: str # Connection identifier to filter results.}\n@returns(200) {data: map{data: [map], next: str?, previous: str?, totalCount: num, totalCountCapped: bool}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint POST /v1/channel-endpoints\n@desc Create a channel endpoint\n@returns(201) {data: map{identifier: str, channel: str?, providerId: str?, integrationIdentifier: str?, connectionIdentifier: str?, subscriberId: str?, contextKeys: [str], type: str, endpoint: any, createdAt: str, updatedAt: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint GET /v1/channel-endpoints/{identifier}\n@desc Retrieve a channel endpoint\n@required {identifier: str # The unique identifier of the channel endpoint}\n@returns(200) {data: map{identifier: str, channel: str?, providerId: str?, integrationIdentifier: str?, connectionIdentifier: str?, subscriberId: str?, contextKeys: [str], type: str, endpoint: any, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint PATCH /v1/channel-endpoints/{identifier}\n@desc Update a channel endpoint\n@required {identifier: str # The unique identifier of the channel endpoint, endpoint: any # Updated endpoint data. The structure must match the existing channel endpoint type.}\n@returns(200) {data: map{identifier: str, channel: str?, providerId: str?, integrationIdentifier: str?, connectionIdentifier: str?, subscriberId: str?, contextKeys: [str], type: str, endpoint: any, createdAt: str, updatedAt: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endpoint DELETE /v1/channel-endpoints/{identifier}\n@desc Delete a channel endpoint\n@required {identifier: str # The unique identifier of the channel endpoint}\n@returns(204)\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 405: Method Not Allowed, 409: Conflict, 413: Payload Too Large, 414: URI Too Long, 415: Unsupported Media Type, 422: Unprocessable Entity, 429: The client has sent too many requests in a given amount of time., 500: Internal Server Error, 503: The server is currently unable to handle the request due to a temporary overload or scheduled maintenance, which will likely be alleviated after some delay.}\n\n@endgroup\n\n@group translations\n@endpoint POST /v2/translations/upload\n@desc Upload translation files\n@returns(200) {totalFiles: num, successfulUploads: num, failedUploads: num, errors: [str]} # Upload results\n\n@endpoint POST /v2/translations\n@desc Create a translation\n@required {resourceId: str # The resource ID to associate translation with. Accepts identifier or slug format, resourceType: str(workflow/layout) # The resource type to associate translation with, locale: str # Locale code (e.g., en_US, es_ES), content: map # Translation content as JSON object}\n@returns(200) {resourceId: str, resourceType: str, locale: str, content: map, createdAt: str, updatedAt: str} # Translation created or updated successfully\n\n@endpoint GET /v2/translations/master-json\n@desc Retrieve master translations JSON\n@optional {locale: str # Locale to export. If not provided, exports organization default locale}\n@returns(200) {workflows: map, layouts: map} # Master translations JSON retrieved successfully\n\n@endpoint POST /v2/translations/master-json\n@desc Import master translations JSON\n@required {locale: str # The locale for which translations are being imported, masterJson: map # Master JSON object containing all translations organized by workflow identifier}\n@returns(200) {success: bool, message: str, successful: [str], failed: [str]} # Master translations imported successfully\n\n@endpoint POST /v2/translations/master-json/upload\n@desc Upload master translations JSON file\n@returns(200) {success: bool, message: str, successful: [str], failed: [str]} # Master translations uploaded successfully\n\n@endpoint GET /v2/translations/group/{resourceType}/{resourceId}\n@desc Retrieve a translation group\n@required {resourceType: str(workflow/layout) # Resource type, resourceId: str # Resource ID}\n@returns(200) {resourceId: str, resourceType: str, resourceName: str, locales: [str], outdatedLocales: [str], createdAt: str, updatedAt: str} # Translation group details\n@errors {404: Translation group not found}\n\n@endpoint GET /v2/translations/{resourceType}/{resourceId}/{locale}\n@desc Retrieve a translation\n@required {resourceType: str(workflow/layout) # Resource type, resourceId: str # Resource ID, locale: str # Locale code}\n@returns(200) {resourceId: str, resourceType: str, locale: str, content: map, createdAt: str, updatedAt: str} # Translation found\n@errors {404: Translation not found}\n\n@endpoint DELETE /v2/translations/{resourceType}/{resourceId}/{locale}\n@desc Delete a translation\n@required {resourceType: str(workflow/layout) # Resource type, resourceId: str # Resource ID, locale: str # Locale code}\n@returns(204) Translation deleted successfully\n@errors {404: Translation not found}\n\n@endpoint DELETE /v2/translations/{resourceType}/{resourceId}\n@desc Delete a translation group\n@required {resourceType: str(workflow/layout) # Resource type, resourceId: str # Resource ID}\n@returns(204) Translation group deleted successfully\n@errors {404: Translation group not found}\n\n@endgroup\n\n@group inbound-webhooks\n@endpoint POST /v2/inbound-webhooks/delivery-providers/{environmentId}/{integrationId}\n@desc Track provider activity and engagement events\n@required {environmentId: str # The environment identifier, integrationId: str # The integration identifier for the delivery provider}\n@returns(200) Successfully processed webhook events\n\n@endgroup\n\n@end\n"}}