Slack Reply
/internal/slack/inbound から fire-and-forget で呼ばれる非同期返信タスク。
gateway 非経由(_GATEWAY_EXEMPT_PATHS)のため X-Internal-Secret を自前で検証する。 _do_query_sync と同じ防御ロジック(レートリミット等)を通し、結果を Block Kit へ 整形して response_url へ POST する。SSRF: response_url は hooks.slack.com 必須。
POST
/tasks/slack-replyHeader parameters
x-internal-secretstring | anyRequest body
requiredapplication/jsonclaimsSlackReplyClaimsrequiredShow propertiesHide properties
user_idstringrequiredtenant_idstringrequiredrolestringrequiredexpintegerrequiredresidency_regionstring | anyShow propertiesHide properties
Any of:
string
stringany
anyquestionstringrequiredresponse_urlstringrequiredResponses
200Successful Response
any422Validation Error
detailValidationError[]Show propertiesHide properties
Array of
ValidationErrorlocstring | integer[]requiredShow propertiesHide properties
Array of
string | integerAny of:
string
stringinteger
integermsgstringrequiredtypestringrequiredRequest
curl -X POST "/tasks/slack-reply" \
-H "Content-Type: application/json" \
-d '{
"claims": {
"user_id": "string",
"tenant_id": "string",
"role": "string",
"exp": 0,
"residency_region": "string"
},
"question": "string",
"response_url": "string"
}'const response = await fetch("/tasks/slack-reply", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"claims": {
"user_id": "string",
"tenant_id": "string",
"role": "string",
"exp": 0,
"residency_region": "string"
},
"question": "string",
"response_url": "string"
})
});import requests
response = requests.post(
"/tasks/slack-reply",
headers={
"Content-Type": "application/json"
},
json={
"claims": {
"user_id": "string",
"tenant_id": "string",
"role": "string",
"exp": 0,
"residency_region": "string"
},
"question": "string",
"response_url": "string"
},
)Response
"string"{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}