Files
team/api/v4/source/actions.yaml
69efa65158 Preserve 429/503 retry status codes through DoActionRequest (#36700)
* Preserve 429/503 retry status codes through DoActionRequest

DoActionRequest collapsed all plugin non-200 responses to 400, losing
the retry semantics carried by 429 and 503 (RFC 6585, RFC 7231). This
preserves 429/503 verbatim, maps other 5xx to 502 Bad Gateway, and
leaves other non-200 responses wrapped as 400.

* update api documentation for new errors

* fix tests affected by change

---------

Co-authored-by: Mattermost Build <[email protected]>
Co-authored-by: Scott Bishel <[email protected]>
2026-07-10 12:19:25 -06:00

346 lines
13 KiB
YAML

/api/v4/actions/dialogs/open:
post:
tags:
- integration_actions
summary: Open a dialog
description: >
Open an interactive dialog using a trigger ID provided by a slash
command, or some other action payload. See
https://docs.mattermost.com/developer/interactive-dialogs.html for more
information on interactive dialogs.
Up to 3 interactive dialogs may be open at once (minimum server version
11.10). Additional `open_dialog` events beyond this limit are silently
ignored by the client.
__Minimum server version: 5.6__
operationId: OpenInteractiveDialog
requestBody:
content:
application/json:
schema:
type: object
required:
- trigger_id
- url
- dialog
properties:
trigger_id:
type: string
description: Trigger ID provided by other action
url:
type: string
description: The URL to send the submitted dialog payload to
dialog:
type: object
required:
- title
- elements
description: Post object to create
properties:
callback_id:
type: string
description: Set an ID that will be included when the dialog is
submitted
title:
type: string
description: Title of the dialog
introduction_text:
type: string
description: Markdown formatted introductory paragraph
elements:
type: array
description: >
Input elements, see
https://docs.mattermost.com/developer/interactive-dialogs.html#elements.
Supported element types include `text`, `textarea`, `select`,
`radio`, `bool`, and `action_button`. An `action_button` element
(minimum server version 11.10) renders a clickable button — fields:
`name`, `display_name`, `type` set to "action_button", and an
`action_button` object with a required `url` (must be a valid lookup
URL) and optional `context` (string map). Clicking it calls
`POST /api/v4/actions/dialogs/execute`. `action_button` elements are
not included in the dialog submission payload.
items:
type: object
submit_label:
type: string
description: Label on the submit button
notify_on_cancel:
type: boolean
description: Set true to receive payloads when user cancels a dialog
state:
type: string
description: Set some state to be echoed back with the dialog
submission
description: Metadata for the dialog to be opened
required: true
responses:
"200":
description: Dialog open successful
content:
application/json:
schema:
$ref: "#/components/schemas/StatusOK"
"400":
$ref: "#/components/responses/BadRequest"
/api/v4/actions/dialogs/submit:
post:
tags:
- integration_actions
summary: Submit a dialog
description: >
Endpoint used by the Mattermost clients to submit a dialog. See
https://docs.mattermost.com/developer/interactive-dialogs.html for more
information on interactive dialogs.
__Minimum server version: 5.6__
operationId: SubmitInteractiveDialog
requestBody:
content:
application/json:
schema:
type: object
required:
- url
- submission
- channel_id
properties:
url:
type: string
description: The URL to send the submitted dialog payload to
channel_id:
type: string
description: Channel ID the user submitted the dialog from
team_id:
type: string
description: >
Optional. The server resolves the authoritative team from the
channel, so a client-supplied value is ignored. Empty for DM/GM
channels (which have no team).
submission:
type: object
description: String map where keys are element names and values are the
element input values
callback_id:
type: string
description: Callback ID sent when the dialog was opened
state:
type: string
description: State sent when the dialog was opened
cancelled:
type: boolean
description: Set to true if the dialog was cancelled
file_ids:
type: array
items:
type: string
description: >
List of file IDs uploaded as part of the dialog submission.
Each file must have been uploaded by the submitting user. A
maximum of 10 file IDs may be submitted.
description: Dialog submission data
required: true
responses:
"200":
description: Dialog submission successful
content:
application/json:
schema:
$ref: "#/components/schemas/StatusOK"
"400":
$ref: "#/components/responses/BadRequest"
"401":
$ref: "#/components/responses/Unauthorized"
"403":
$ref: "#/components/responses/Forbidden"
"429":
description: The upstream integration rate-limited the request. The
original status code is preserved so clients can honor retry
semantics.
content:
application/json:
schema:
$ref: "#/components/schemas/AppError"
"502":
description: The upstream integration returned a 5xx (other than 503).
Surfaced as Bad Gateway because the failure is upstream of Mattermost.
content:
application/json:
schema:
$ref: "#/components/schemas/AppError"
"503":
description: The upstream integration is unavailable. The original
status code is preserved so clients can honor retry semantics.
content:
application/json:
schema:
$ref: "#/components/schemas/AppError"
/api/v4/actions/dialogs/lookup:
post:
tags:
- integration_actions
summary: Lookup dialog elements
description: >
Endpoint used by the Mattermost clients to lookup dynamic dialog
elements. See https://docs.mattermost.com/developer/interactive-dialogs.html
for more information on interactive dialogs.
__Minimum server version: 11.0__
operationId: LookupInteractiveDialog
requestBody:
content:
application/json:
schema:
type: object
required:
- url
- submission
- channel_id
properties:
url:
type: string
description: The URL to send the lookup request to
channel_id:
type: string
description: Channel ID the user is performing the lookup from
team_id:
type: string
description: >
Optional. The server resolves the authoritative team from the
channel, so a client-supplied value is ignored. Empty for DM/GM
channels (which have no team).
submission:
type: object
description: String map where keys are element names and values are the
element input values
callback_id:
type: string
description: Callback ID sent when the dialog was opened
state:
type: string
description: State sent when the dialog was opened
description: Dialog lookup request data
required: true
responses:
"200":
description: Dialog lookup successful
content:
application/json:
schema:
type: object
properties:
options:
type: array
description: List of options returned from the lookup
items:
type: object
properties:
text:
type: string
description: Display text for the option
value:
type: string
description: Value for the option
"400":
$ref: "#/components/responses/BadRequest"
"401":
$ref: "#/components/responses/Unauthorized"
"403":
$ref: "#/components/responses/Forbidden"
"429":
description: The upstream integration rate-limited the request. The
original status code is preserved so clients can honor retry
semantics.
content:
application/json:
schema:
$ref: "#/components/schemas/AppError"
"502":
description: The upstream integration returned a 5xx (other than 503).
Surfaced as Bad Gateway because the failure is upstream of Mattermost.
content:
application/json:
schema:
$ref: "#/components/schemas/AppError"
"503":
description: The upstream integration is unavailable. The original
status code is preserved so clients can honor retry semantics.
content:
application/json:
schema:
$ref: "#/components/schemas/AppError"
/api/v4/actions/dialogs/execute:
post:
tags:
- integration_actions
summary: Execute a dialog action button
description: >
Endpoint used by the Mattermost clients when a user clicks an
`action_button` element inside an interactive dialog. The server
generates a new trigger ID and forwards the button's context to the
integration URL; the integration can then open a child (stacked) dialog
with that trigger ID. See
https://docs.mattermost.com/developer/interactive-dialogs.html for more
information on interactive dialogs.
This request is always processed server-side. The client caps the number
of simultaneously open interactive dialogs at 3, so if the resulting
`open_dialog` event would exceed that limit the client silently skips
rendering the additional dialog.
__Minimum server version: 11.10__
operationId: ExecuteDialogAction
requestBody:
content:
application/json:
schema:
type: object
required:
- url
- channel_id
properties:
url:
type: string
description: The action button URL to send the action payload to.
Must be a valid lookup URL.
context:
type: object
description: String map of context values configured on the action
button, forwarded to the integration
channel_id:
type: string
description: Channel ID the user clicked the action button from
team_id:
type: string
description: >
Optional. The server resolves the authoritative team from the
channel, so a client-supplied value is ignored. Empty for DM/GM
channels (which have no team).
description: Dialog action button execution data
required: true
responses:
"200":
description: Dialog action executed successfully
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: Status of the request ("OK")
trigger_id:
type: string
description: New trigger ID the integration can use to open a child
dialog
"400":
$ref: "#/components/responses/BadRequest"
"401":
$ref: "#/components/responses/Unauthorized"
"403":
$ref: "#/components/responses/Forbidden"