Coming from Slack
Amedeus apps follow Slack’s model on purpose, so what you know carries over. This page lists what is the same and what is different. Slack details are from its public documentation.
The same
Section titled “The same”- Concepts: an app has a bot user, permissions (scopes), a bot token, incoming webhooks, slash commands, and event subscriptions with a signed request URL.
- Request signing: HMAC-SHA256 of
v0:{timestamp}:{raw body}, compared in constant time, with a 5-minute window. Only the header names change (X-Amedeus-Signature,X-Amedeus-Request-Timestamp). - URL verification: a signed
{"type":"url_verification","challenge":…}, answered with the challenge. - Acknowledge fast: answer
2xxwithin 3 seconds and work afterwards. - Incoming webhooks: the same
{"text": …}body, and Slack’sattachmentsare understood. - Slash command replies: a
response_url, private by default,in_channelfor everyone. - An app acts only where it belongs, and joins public channels itself.
Different
Section titled “Different”| Topic | Slack | Amedeus |
|---|---|---|
| Errors | Usually HTTP 200 with {"ok": false, "error": "code"} |
The real HTTP status, with {"ok": false, "error": "code", "message": …} |
| Pagination | cursor and response_metadata.next_cursor |
cursor and a top-level next_cursor |
| Message id | ts, a timestamp string |
id, a UUID. Times are ISO 8601 created_at |
| Text format | mrkdwn, with <@U123> mentions and <url|label> links |
Markdown as written; mentions as @Name plus a mentions list of ids |
| Event envelope | team_id, api_app_id, authorizations, event_context |
workspace_id, app_id, bot_user_id |
| Event names | message.channels, message.groups, message.im, message.mpim, app_mention |
message.channel (public and private), message.im, app_mention |
| Channel type | channel_type: channel, group, im, mpim |
channel_kind: public, private, dm |
| Author field | user |
user everywhere |
| Retry headers | X-Slack-Retry-Num, X-Slack-Retry-Reason |
X-Amedeus-Retry-Num, X-Amedeus-Retry-Reason (same reason values) |
| Retries | 3 retries: immediately, 1 minute, 5 minutes | 4 attempts: immediately, 1, 5 and 30 minutes |
| Redirects | Followed, up to 2 | Not followed: give the final URL |
| Slash command body | application/x-www-form-urlencoded |
JSON |
Command reply in the 200 body |
Yes | No: use response_url (or the Web API) |
| Direct messages to a bot | App Home → Messages Tab, and a checkbox to let people write | App Home → “Allow people to message this app” |
| Installing an app | Each workspace installs and approves it (OAuth) | An app belongs to the workspace that created it; there is no install step |
| Posting response | {ok, channel, ts, message} |
{ok, message} |
Not in Amedeus yet
Section titled “Not in Amedeus yet”Updating or deleting a message the app wrote, Block Kit, interactive components, app unfurls, events on behalf of users, OAuth for apps distributed across workspaces, and the optional 24-hour “Delayed events”. Apps that need them can’t be built yet.