DeewanDocs
API keys

API reference

Base URL https://deewan.io/api/v1. Every request needs Authorization: Bearer <key>.

Account

GET/me

Inspect the key

Returns the key's id, workspace, scopes and environment. Useful as a connectivity check.

Returns An api_key object.

Request
curl -X GET "https://deewan.io/api/v1/me" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "api_key",
  "id": "9b1f…",
  "workspace_id": "org_8Hk2…",
  "scopes": [
    "rooms:read",
    "rooms:write"
  ],
  "environment": "live"
}

Rooms

GET/roomsrooms:read

List rooms

Rooms in the key's scope, newest first. Paginate with starting_after set to the last id of the previous page.

Query parameters

limitinteger
1–100, default 25.
starting_afteruuid
Return rooms created before this room.

Returns A list of room objects.

Request
curl -X GET "https://deewan.io/api/v1/rooms" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "object": "room",
      "id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
      "name": "Onboarding call",
      "code": "k7pq-3mzt-9xwe",
      "description": null,
      "url": "https://deewan.io/en/r/k7pq-3mzt-9xwe",
      "locked": false,
      "workspace_id": "org_8Hk2…",
      "team_id": null,
      "settings": {
        "access": "link",
        "admission": "knock",
        "mute_on_entry": false,
        "camera_off_on_entry": false,
        "screen_share": "hosts",
        "reactions": true,
        "chat": true,
        "encryption": "standard",
        "recordings": "workspace",
        "before_host": "join",
        "type": "meeting"
      },
      "created_at": "2026-09-17T09:12:44.120Z",
      "updated_at": "2026-09-17T09:12:44.120Z"
    }
  ],
  "has_more": false
}
POST/roomsrooms:write

Create a room

Creates a room with a permanent link. Rooms created through the API default to access: "link".

Body

namestringrequired
1–80 characters.
descriptionstring | null
Up to 500 characters.
settings.access"members" | "link"
link: anyone with the link can join, with or without an account. members: only people who can already see the room.
settings.admission"direct" | "knock"
direct: everyone the room lets in walks straight in (in a link room, anyone with the link). knock: everyone but hosts waits for a host to admit them.
settings.mute_on_entryboolean
Join participants with their microphone off.
settings.camera_off_on_entryboolean
Join participants with their camera off.
settings.screen_share"everyone" | "hosts"
Who may share their screen.
settings.reactionsboolean
Allow emoji reactions.
settings.chatboolean
Allow meeting chat.
settings.encryption"standard" | "strict"
strict: the meeting key exists only on participants' devices and Deewan can't access meeting content. Media tokens and live captions aren't available; use join links. Can't be changed while a meeting is running.
settings.recordings"workspace" | "end_to_end"
workspace (the default for rooms made through the API): recordings can be downloaded and played through this API. end_to_end: only people allowed in the room can open them — not Deewan, not the API. Strict rooms are always end_to_end.
settings.before_host"join" | "wait"
What happens before a host arrives. join (default): people let into the room go straight in. wait: they wait on the pre-join page and come in automatically the moment a host joins. Applies to the room's own link; join links you create through this API always go straight in.

Returns The new room.

Request
curl -X POST "https://deewan.io/api/v1/rooms" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Onboarding call","settings":{"admission":"knock","screen_share":"hosts"}}'
Response
{
  "object": "room",
  "id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "name": "Onboarding call",
  "code": "k7pq-3mzt-9xwe",
  "description": null,
  "url": "https://deewan.io/en/r/k7pq-3mzt-9xwe",
  "locked": false,
  "workspace_id": "org_8Hk2…",
  "team_id": null,
  "settings": {
    "access": "link",
    "admission": "knock",
    "mute_on_entry": false,
    "camera_off_on_entry": false,
    "screen_share": "hosts",
    "reactions": true,
    "chat": true,
    "encryption": "standard",
    "recordings": "workspace",
    "before_host": "join",
    "type": "meeting"
  },
  "created_at": "2026-09-17T09:12:44.120Z",
  "updated_at": "2026-09-17T09:12:44.120Z"
}
GET/rooms/{room_id}rooms:read

Retrieve a room

Returns one room.

Path parameters

room_iduuidrequired
The room's id.

Returns A room.

Request
curl -X GET "https://deewan.io/api/v1/rooms/$ROOM_ID" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "room",
  "id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "name": "Onboarding call",
  "code": "k7pq-3mzt-9xwe",
  "description": null,
  "url": "https://deewan.io/en/r/k7pq-3mzt-9xwe",
  "locked": false,
  "workspace_id": "org_8Hk2…",
  "team_id": null,
  "settings": {
    "access": "link",
    "admission": "knock",
    "mute_on_entry": false,
    "camera_off_on_entry": false,
    "screen_share": "hosts",
    "reactions": true,
    "chat": true,
    "encryption": "standard",
    "recordings": "workspace",
    "before_host": "join",
    "type": "meeting"
  },
  "created_at": "2026-09-17T09:12:44.120Z",
  "updated_at": "2026-09-17T09:12:44.120Z"
}
PATCH/rooms/{room_id}rooms:write

Update a room

Changes the name, description, lock or settings. Setting changes apply immediately to a meeting in progress (who may share, chat and react).

Path parameters

room_iduuidrequired
The room's id.

Body

namestring
1–80 characters.
descriptionstring | null
Up to 500 characters.
lockedboolean
A locked room admits nobody new.
settings.access"members" | "link"
link: anyone with the link can join, with or without an account. members: only people who can already see the room.
settings.admission"direct" | "knock"
direct: everyone the room lets in walks straight in (in a link room, anyone with the link). knock: everyone but hosts waits for a host to admit them.
settings.mute_on_entryboolean
Join participants with their microphone off.
settings.camera_off_on_entryboolean
Join participants with their camera off.
settings.screen_share"everyone" | "hosts"
Who may share their screen.
settings.reactionsboolean
Allow emoji reactions.
settings.chatboolean
Allow meeting chat.
settings.encryption"standard" | "strict"
strict: the meeting key exists only on participants' devices and Deewan can't access meeting content. Media tokens and live captions aren't available; use join links. Can't be changed while a meeting is running.
settings.recordings"workspace" | "end_to_end"
workspace (the default for rooms made through the API): recordings can be downloaded and played through this API. end_to_end: only people allowed in the room can open them — not Deewan, not the API. Strict rooms are always end_to_end.
settings.before_host"join" | "wait"
What happens before a host arrives. join (default): people let into the room go straight in. wait: they wait on the pre-join page and come in automatically the moment a host joins. Applies to the room's own link; join links you create through this API always go straight in.

Returns The updated room.

Request
curl -X PATCH "https://deewan.io/api/v1/rooms/$ROOM_ID" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"locked":true}'
Response
{
  "object": "room",
  "id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "name": "Onboarding call",
  "code": "k7pq-3mzt-9xwe",
  "description": null,
  "url": "https://deewan.io/en/r/k7pq-3mzt-9xwe",
  "locked": true,
  "workspace_id": "org_8Hk2…",
  "team_id": null,
  "settings": {
    "access": "link",
    "admission": "knock",
    "mute_on_entry": false,
    "camera_off_on_entry": false,
    "screen_share": "hosts",
    "reactions": true,
    "chat": true,
    "encryption": "standard",
    "recordings": "workspace",
    "before_host": "join",
    "type": "meeting"
  },
  "created_at": "2026-09-17T09:12:44.120Z",
  "updated_at": "2026-09-17T09:12:44.120Z"
}
DELETE/rooms/{room_id}rooms:write

Delete a room

Deletes the room and ends any meeting in it. Its link stops working.

Path parameters

room_iduuidrequired
The room's id.

Returns The deleted room with deleted: true.

Request
curl -X DELETE "https://deewan.io/api/v1/rooms/$ROOM_ID" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "room",
  "id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "name": "Onboarding call",
  "code": "k7pq-3mzt-9xwe",
  "description": null,
  "url": "https://deewan.io/en/r/k7pq-3mzt-9xwe",
  "locked": false,
  "workspace_id": "org_8Hk2…",
  "team_id": null,
  "settings": {
    "access": "link",
    "admission": "knock",
    "mute_on_entry": false,
    "camera_off_on_entry": false,
    "screen_share": "hosts",
    "reactions": true,
    "chat": true,
    "encryption": "standard",
    "recordings": "workspace",
    "before_host": "join",
    "type": "meeting"
  },
  "created_at": "2026-09-17T09:12:44.120Z",
  "updated_at": "2026-09-17T09:12:44.120Z",
  "deleted": true
}

Joining

POST/rooms/{room_id}/tokenstokens:create

Create a media token

Credentials for an interface you build yourself, using @deewan/client in the browser. Valid for 10 minutes to connect. Includes the meeting's end-to-end encryption passphrase: treat the whole response as a secret for that one person. For Deewan's own interface, create a join link instead. Rooms with strict encryption return 409: their key never exists on our servers, so there is no passphrase to give.

Path parameters

room_iduuidrequired
The room's id.

Body

namestringrequired
Display name (1–60).
role"host" | "participant"
Default participant.
user_idstring
Your own id for this person (max 64).
avatarstring
A Deewan avatar preset id, a01–a16.

Returns A room_token.

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/tokens" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Omar","user_id":"user_456"}'
Response
{
  "object": "room_token",
  "server_url": "wss://media.deewan.io",
  "token": "eyJhbGciOi…",
  "identity": "api_Qm9vZ3Y…3pvf.k2d9x0aa",
  "e2ee_passphrase": "Yx3…",
  "expires_in": 600
}

Participants

GET/rooms/{room_id}/participantsparticipants:read

List participants

Who is in the meeting right now. Empty when the meeting isn't running.

Path parameters

room_iduuidrequired
The room's id.

Returns A list of participant objects.

Request
curl -X GET "https://deewan.io/api/v1/rooms/$ROOM_ID/participants" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "object": "participant",
      "identity": "api_Qm9vZ3Y.k2d9x0aa",
      "name": "Omar",
      "role": "participant",
      "joined_at": "2026-09-17T09:20:11.000Z",
      "audio_muted": false,
      "video_muted": true,
      "screen_sharing": false,
      "hand_raised": false
    }
  ],
  "has_more": false
}
POST/rooms/{room_id}/participants/{identity}/muteparticipants:write

Mute a participant

Mutes someone's microphone. Only they can unmute themselves.

Path parameters

room_iduuidrequired
The room's id.
identitystringrequired
The participant's identity.

Returns { object, identity, audio_muted: true }

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/participants/$IDENTITY/mute" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "participant",
  "identity": "api_Qm9vZ3Y.k2d9x0aa",
  "audio_muted": true
}
POST/rooms/{room_id}/participants/{identity}/cohostparticipants:write

Make a co-host

Gives someone in the meeting host powers for this meeting only: admitting, muting and removing people, and running breakout rooms and polls. Not the room itself — a co-host can't change its saved settings or delete it — and it ends when the meeting ends. Works for Deewan accounts and for your own users who joined with a token from this API — for them it lasts while they're connected (to make someone a host from the start, create their token with role: "host"). The key's creator must manage the room.

Path parameters

room_iduuidrequired
The room's id.
identitystringrequired
The participant's identity.

Returns { object, identity, cohost: true }

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/participants/$IDENTITY/cohost" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "participant",
  "identity": "user_2fK9Lm.k2d9x0aa",
  "cohost": true
}
DELETE/rooms/{room_id}/participants/{identity}/cohostparticipants:write

Remove a co-host

Takes co-host powers back. Never demotes one of the room's own hosts (400 not_a_cohost).

Path parameters

room_iduuidrequired
The room's id.
identitystringrequired
The participant's identity.

Returns { object, identity, cohost: false }

Request
curl -X DELETE "https://deewan.io/api/v1/rooms/$ROOM_ID/participants/$IDENTITY/cohost" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "participant",
  "identity": "user_2fK9Lm.k2d9x0aa",
  "cohost": false
}
POST/rooms/{room_id}/participants/{identity}/stageparticipants:write

Invite to speak (webinars)

In a webinar, puts someone from the audience on stage: the media server now lets them publish their microphone and camera (and their screen, if the room allows it). Lasts while they're connected. Hosts are always on stage (400 already_host); a meeting has no audience (400 not_a_webinar). The key's creator must manage the room.

Path parameters

room_iduuidrequired
The room's id.
identitystringrequired
The participant's identity.

Returns { object, identity, on_stage: true }

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/participants/$IDENTITY/stage" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "participant",
  "identity": "api_Qm9vZ3Y.k2d9x0aa",
  "on_stage": true
}
DELETE/rooms/{room_id}/participants/{identity}/stageparticipants:write

Move to audience (webinars)

Sends someone on stage back to the audience. The media server stops their microphone, camera and screen at once.

Path parameters

room_iduuidrequired
The room's id.
identitystringrequired
The participant's identity.

Returns { object, identity, on_stage: false }

Request
curl -X DELETE "https://deewan.io/api/v1/rooms/$ROOM_ID/participants/$IDENTITY/stage" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "participant",
  "identity": "api_Qm9vZ3Y.k2d9x0aa",
  "on_stage": false
}
GET/rooms/{room_id}/waitingparticipants:read

List the waiting room

People asking to join, oldest first. People wait in rooms set to "Ask to join", and outsiders wait in members-only rooms. Nobody is kept waiting more than an hour.

Path parameters

room_iduuidrequired
The room's id.

Returns A list of waiting_participant objects.

Request
curl -X GET "https://deewan.io/api/v1/rooms/$ROOM_ID/waiting" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "object": "waiting_participant",
      "identity": "guest_Hk2p9QwEr3.m1x0aa2b",
      "name": "Rania"
    }
  ]
}
POST/rooms/{room_id}/waiting/{identity}participants:write

Admit or deny

Lets someone in from the waiting room, or turns them away.

Path parameters

room_iduuidrequired
The room's id.
identitystringrequired
The participant's identity.

Body

decision"admit" | "deny"required
What to do.

Returns { object: "waiting_participant", identity, decision }

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/waiting/$IDENTITY" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"decision":"admit"}'
Response
{
  "object": "waiting_participant",
  "identity": "guest_Hk2p9QwEr3.m1x0aa2b",
  "decision": "admit"
}
DELETE/rooms/{room_id}/participants/{identity}participants:write

Remove a participant

Removes someone from the meeting. Lock the room as well if they shouldn't come back.

Path parameters

room_iduuidrequired
The room's id.
identitystringrequired
The participant's identity.

Returns { object, identity, removed: true }

Request
curl -X DELETE "https://deewan.io/api/v1/rooms/$ROOM_ID/participants/$IDENTITY" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "participant",
  "identity": "api_Qm9vZ3Y.k2d9x0aa",
  "removed": true
}
POST/rooms/{room_id}/endparticipants:write

End the meeting

Disconnects everyone. The room and its link remain.

Path parameters

room_iduuidrequired
The room's id.

Returns { object: "room", id, ended: true }

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/end" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "room",
  "id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "ended": true
}

Meetings

GET/meetingsmeetings:read

List scheduled meetings

Meetings overlapping a time window, soonest first.

Query parameters

fromISO 8601
Default: now.
toISO 8601
Default: 30 days after from.
limitinteger
1–100, default 25.

Returns A list of meeting objects.

Request
curl -X GET "https://deewan.io/api/v1/meetings" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "object": "meeting",
      "id": "a1d3f0c9-6b2e-4e8f-8d1a-7c0b9e5f2a11",
      "title": "Weekly sync",
      "description": null,
      "starts_at": "2026-10-01T09:00:00.000Z",
      "ends_at": "2026-10-01T09:30:00.000Z",
      "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
      "join_url": "https://deewan.io/en/r/k7pq-3mzt-9xwe",
      "recurrence": "weekly",
      "recurrence_until": null,
      "timezone": "Asia/Amman",
      "created_at": "2026-09-17T09:15:02.000Z"
    }
  ],
  "has_more": false
}
POST/meetingsmeetings:write

Schedule a meeting

Adds a meeting to the workspace calendar, once or on a repeating rule, optionally in a room. It is also written to the key creator's connected Google and Outlook calendars, and sends meeting.scheduled.

Body

titlestringrequired
1–120 characters.
starts_atISO 8601required
With a timezone offset. For a series, the first occurrence.
ends_atISO 8601required
After starts_at; a meeting lasts at most 24 hours.
room_iduuid
A room in the key's scope.
descriptionstring | null
Up to 1000 characters.
recurrence"none" | "daily" | "weekdays" | "weekly" | "biweekly" | "monthly"
How the meeting repeats. Default none.
recurrence_untilISO 8601 | null
When a series ends. null: it doesn't.
timezonestring | null
IANA zone the series repeats in, e.g. Asia/Amman, so 10:00 stays 10:00 through daylight saving.

Returns The new meeting.

Request
curl -X POST "https://deewan.io/api/v1/meetings" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Weekly sync","room_id":"5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44","starts_at":"2026-10-01T09:00:00.000Z","ends_at":"2026-10-01T09:30:00.000Z","recurrence":"weekly","timezone":"Asia/Amman"}'
Response
{
  "object": "meeting",
  "id": "a1d3f0c9-6b2e-4e8f-8d1a-7c0b9e5f2a11",
  "title": "Weekly sync",
  "description": null,
  "starts_at": "2026-10-01T09:00:00.000Z",
  "ends_at": "2026-10-01T09:30:00.000Z",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "join_url": "https://deewan.io/en/r/k7pq-3mzt-9xwe",
  "recurrence": "weekly",
  "recurrence_until": null,
  "timezone": "Asia/Amman",
  "created_at": "2026-09-17T09:15:02.000Z"
}
GET/meetings/{meeting_id}meetings:read

Retrieve a meeting

Returns one scheduled meeting.

Path parameters

meeting_iduuidrequired
The meeting's id.

Returns A meeting.

Request
curl -X GET "https://deewan.io/api/v1/meetings/$MEETING_ID" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "meeting",
  "id": "a1d3f0c9-6b2e-4e8f-8d1a-7c0b9e5f2a11",
  "title": "Weekly sync",
  "description": null,
  "starts_at": "2026-10-01T09:00:00.000Z",
  "ends_at": "2026-10-01T09:30:00.000Z",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "join_url": "https://deewan.io/en/r/k7pq-3mzt-9xwe",
  "recurrence": "weekly",
  "recurrence_until": null,
  "timezone": "Asia/Amman",
  "created_at": "2026-09-17T09:15:02.000Z"
}
PATCH/meetings/{meeting_id}meetings:write

Update a meeting

Changes a meeting. Fields you leave out keep their value. For a repeating meeting every occurrence changes. Connected calendars are updated too, and meeting.updated is sent.

Path parameters

meeting_iduuidrequired
The meeting's id.

Body

titlestring
1–120 characters.
starts_atISO 8601
With a timezone offset. For a series, the first occurrence.
ends_atISO 8601
After starts_at; a meeting lasts at most 24 hours.
descriptionstring | null
Up to 1000 characters.
recurrence"none" | "daily" | "weekdays" | "weekly" | "biweekly" | "monthly"
How the meeting repeats. Default none.
recurrence_untilISO 8601 | null
When a series ends. null: it doesn't.
timezonestring | null
IANA zone the series repeats in, e.g. Asia/Amman, so 10:00 stays 10:00 through daylight saving.

Returns The updated meeting.

Request
curl -X PATCH "https://deewan.io/api/v1/meetings/$MEETING_ID" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Weekly sync (new time)","starts_at":"2026-10-01T10:00:00+03:00","ends_at":"2026-10-01T10:30:00+03:00"}'
Response
{
  "object": "meeting",
  "id": "a1d3f0c9-6b2e-4e8f-8d1a-7c0b9e5f2a11",
  "title": "Weekly sync",
  "description": null,
  "starts_at": "2026-10-01T09:00:00.000Z",
  "ends_at": "2026-10-01T09:30:00.000Z",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "join_url": "https://deewan.io/en/r/k7pq-3mzt-9xwe",
  "recurrence": "weekly",
  "recurrence_until": null,
  "timezone": "Asia/Amman",
  "created_at": "2026-09-17T09:15:02.000Z"
}
DELETE/meetings/{meeting_id}meetings:write

Cancel a meeting

Removes the meeting from the calendar, and from connected Google and Outlook calendars. The room is not affected.

Path parameters

meeting_iduuidrequired
The meeting's id.

Returns The cancelled meeting with deleted: true.

Request
curl -X DELETE "https://deewan.io/api/v1/meetings/$MEETING_ID" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "meeting",
  "id": "a1d3f0c9-6b2e-4e8f-8d1a-7c0b9e5f2a11",
  "title": "Weekly sync",
  "description": null,
  "starts_at": "2026-10-01T09:00:00.000Z",
  "ends_at": "2026-10-01T09:30:00.000Z",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "join_url": "https://deewan.io/en/r/k7pq-3mzt-9xwe",
  "recurrence": "weekly",
  "recurrence_until": null,
  "timezone": "Asia/Amman",
  "created_at": "2026-09-17T09:15:02.000Z",
  "deleted": true
}

Polls

GET/rooms/{room_id}/pollspolls:read

List polls

Polls asked in this room in the last 24 hours, newest first, with their counts. Voter names are never returned.

Path parameters

room_iduuidrequired
The room's id.

Returns A list of poll objects.

Request
curl -X GET "https://deewan.io/api/v1/rooms/$ROOM_ID/polls" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "object": "poll",
      "id": "7c1f4a90-52d3-4f1e-9a6b-2e8c0d4f7b31",
      "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
      "question": "Ready to move on?",
      "kind": "single",
      "anonymous": false,
      "results": "after_close",
      "status": "open",
      "created_by": "API",
      "created_at": "2026-09-17T09:30:02.000Z",
      "closed_at": null,
      "total_voters": 12,
      "options": [
        {
          "id": "3b9d1c77-0a44-4f52-8f0e-1d2c3b4a5e60",
          "label": "Yes",
          "votes": 9
        },
        {
          "id": "9f2a5e31-7c08-4b63-9d1a-8e7f6c5b4a32",
          "label": "Not yet",
          "votes": 3
        }
      ]
    }
  ],
  "has_more": false
}
POST/rooms/{room_id}/pollspolls:write

Create a poll

Asks everyone in the meeting a question. It appears immediately for people in Deewan's meeting interface.

Path parameters

room_iduuidrequired
The room's id.

Body

questionstringrequired
Up to 240 characters.
optionsstring[]required
Two to ten answers, each up to 120 characters.
kind"single" | "multiple"
One answer, or several. Defaults to single.
anonymousboolean
When true, nobody — including hosts — learns who picked what.
results"live" | "after_vote" | "after_close"
When participants see the counts. Defaults to live.

Returns The created poll.

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/polls" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"question":"Ready to move on?","options":["Yes","Not yet"],"results":"after_close"}'
Response
{
  "object": "poll",
  "id": "7c1f4a90-52d3-4f1e-9a6b-2e8c0d4f7b31",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "question": "Ready to move on?",
  "kind": "single",
  "anonymous": false,
  "results": "after_close",
  "status": "open",
  "created_by": "API",
  "created_at": "2026-09-17T09:30:02.000Z",
  "closed_at": null,
  "total_voters": 12,
  "options": [
    {
      "id": "3b9d1c77-0a44-4f52-8f0e-1d2c3b4a5e60",
      "label": "Yes",
      "votes": 9
    },
    {
      "id": "9f2a5e31-7c08-4b63-9d1a-8e7f6c5b4a32",
      "label": "Not yet",
      "votes": 3
    }
  ]
}
PATCH/polls/{poll_id}polls:write

Close or reopen a poll

Closing stops voting and reveals results that were hidden until the end.

Path parameters

poll_iduuidrequired
The poll's id.

Body

status"open" | "closed"required
The new state.

Returns The updated poll.

Request
curl -X PATCH "https://deewan.io/api/v1/polls/{poll_id}" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"closed"}'
Response
{
  "object": "poll",
  "id": "7c1f4a90-52d3-4f1e-9a6b-2e8c0d4f7b31",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "question": "Ready to move on?",
  "kind": "single",
  "anonymous": false,
  "results": "after_close",
  "status": "closed",
  "created_by": "API",
  "created_at": "2026-09-17T09:30:02.000Z",
  "closed_at": "2026-09-17T09:31:10.000Z",
  "total_voters": 12,
  "options": [
    {
      "id": "3b9d1c77-0a44-4f52-8f0e-1d2c3b4a5e60",
      "label": "Yes",
      "votes": 9
    },
    {
      "id": "9f2a5e31-7c08-4b63-9d1a-8e7f6c5b4a32",
      "label": "Not yet",
      "votes": 3
    }
  ]
}
DELETE/polls/{poll_id}polls:write

Delete a poll

Removes the poll and its votes for everyone.

Path parameters

poll_iduuidrequired
The poll's id.

Returns { object: "poll", id, deleted: true }.

Request
curl -X DELETE "https://deewan.io/api/v1/polls/{poll_id}" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "poll",
  "id": "7c1f4a90-52d3-4f1e-9a6b-2e8c0d4f7b31",
  "deleted": true
}

Breakout rooms

GET/rooms/{room_id}/breakoutsbreakouts:read

Get breakout rooms

The breakout session running in this meeting, with who is placed in each room and who is still unassigned, plus the ten most recent sessions. active is null when nothing is running.

Path parameters

room_iduuidrequired
The room's id.

Returns { object: "breakouts", room_id, active, history }, where active is a breakout_session.

Request
curl -X GET "https://deewan.io/api/v1/rooms/$ROOM_ID/breakouts" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "breakouts",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "active": {
    "object": "breakout_session",
    "id": "b3d9a7c2-6e41-4f08-8c15-0a7e52d1f9c6",
    "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
    "status": "open",
    "auto_join": true,
    "allow_return": true,
    "self_select": false,
    "duration_seconds": 600,
    "started_at": "2026-09-17T10:00:00.000Z",
    "ends_at": "2026-09-17T10:10:00.000Z",
    "rooms": [
      {
        "id": "e14b07d9-3a52-4c6f-b8d1-92f6a0c73e58",
        "name": "Room 1",
        "members": [
          {
            "id": "user_2fK9…",
            "name": "Salma",
            "present": true,
            "can_return": true
          },
          {
            "id": "api_Xk3mQp9Lr2",
            "name": "Omar",
            "present": true,
            "can_return": false
          }
        ]
      },
      {
        "id": "5a0c9e21-77d4-4b3e-a1f8-c4d62b90e7a3",
        "name": "Room 2",
        "members": [
          {
            "id": "user_7Qa1…",
            "name": "Hana",
            "present": true,
            "can_return": true
          }
        ]
      }
    ],
    "unassigned": []
  },
  "history": [
    {
      "object": "breakout_session_summary",
      "id": "b3d9a7c2-6e41-4f08-8c15-0a7e52d1f9c6",
      "status": "open",
      "started_by": "api",
      "started_at": "2026-09-17T10:00:00.000Z",
      "ends_at": "2026-09-17T10:10:00.000Z",
      "closed_at": null,
      "rooms": 2,
      "people": 3
    }
  ]
}
POST/rooms/{room_id}/breakoutsbreakouts:write

Start breakout rooms

Splits the people in the meeting into smaller private rooms. Each breakout has its own end-to-end encryption key, so nobody can join or decrypt a room they were not placed in. Only one session can be open at a time; a second start returns 409. Hosts stay in the main room unless include_hosts is set, and can visit any breakout.

Path parameters

room_iduuidrequired
The room's id.

Body

roomsinteger | string[]required
How many rooms (1–50), or their names. Unnamed rooms are called Room 1, Room 2, …
assign"auto" | "manual" | "none"
auto (default) deals everyone out evenly at random; manual uses placements; none opens empty rooms for people to choose from.
placements{ participant, room }[]
With assign: "manual": who goes where. participant is a participant id or a connection identity; room is a 0-based index into rooms. Anyone not in the meeting is ignored.
auto_joinboolean
Move people into their room without asking. Defaults to true.
allow_returnboolean
Let people go back to the main room by themselves. Defaults to true.
self_selectboolean
Let people pick their own room. Implied by assign: "none".
duration_secondsinteger | null
Close the rooms automatically after this long (60 to 14400). Omit to run until ended.
include_hostsboolean
Deal hosts into rooms too when using auto.

Returns The started breakout_session.

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/breakouts" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"rooms":2,"assign":"auto","duration_seconds":600}'
Response
{
  "object": "breakout_session",
  "id": "b3d9a7c2-6e41-4f08-8c15-0a7e52d1f9c6",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "status": "open",
  "auto_join": true,
  "allow_return": true,
  "self_select": false,
  "duration_seconds": 600,
  "started_at": "2026-09-17T10:00:00.000Z",
  "ends_at": "2026-09-17T10:10:00.000Z",
  "rooms": [
    {
      "id": "e14b07d9-3a52-4c6f-b8d1-92f6a0c73e58",
      "name": "Room 1",
      "members": [
        {
          "id": "user_2fK9…",
          "name": "Salma",
          "present": true,
          "can_return": true
        },
        {
          "id": "api_Xk3mQp9Lr2",
          "name": "Omar",
          "present": true,
          "can_return": false
        }
      ]
    },
    {
      "id": "5a0c9e21-77d4-4b3e-a1f8-c4d62b90e7a3",
      "name": "Room 2",
      "members": [
        {
          "id": "user_7Qa1…",
          "name": "Hana",
          "present": true,
          "can_return": true
        }
      ]
    }
  ],
  "unassigned": []
}
POST/rooms/{room_id}/breakouts/assignmentsbreakouts:write

Move a participant

Places one person in a breakout room, moves them to another, or sends them back to the main room. It takes effect straight away for people who are connected, and holds for people who reconnect.

Path parameters

room_iduuidrequired
The room's id.

Body

participantstringrequired
The participant id, or a connection identity from GET /rooms/{room_id}/participants.
breakout_iduuid | nullrequired
The breakout room's id, or null for the main room.
can_returnboolean
Whether this person may go back to the main room by themselves. Defaults to the session's allow_return.

Returns The updated breakout_session.

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/breakouts/assignments" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"participant":"api_Xk3mQp9Lr2","breakout_id":"5a0c9e21-77d4-4b3e-a1f8-c4d62b90e7a3"}'
Response
{
  "object": "breakout_session",
  "id": "b3d9a7c2-6e41-4f08-8c15-0a7e52d1f9c6",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "status": "open",
  "auto_join": true,
  "allow_return": true,
  "self_select": false,
  "duration_seconds": 600,
  "started_at": "2026-09-17T10:00:00.000Z",
  "ends_at": "2026-09-17T10:10:00.000Z",
  "rooms": [
    {
      "id": "e14b07d9-3a52-4c6f-b8d1-92f6a0c73e58",
      "name": "Room 1",
      "members": [
        {
          "id": "user_2fK9…",
          "name": "Salma",
          "present": true,
          "can_return": true
        },
        {
          "id": "api_Xk3mQp9Lr2",
          "name": "Omar",
          "present": true,
          "can_return": false
        }
      ]
    },
    {
      "id": "5a0c9e21-77d4-4b3e-a1f8-c4d62b90e7a3",
      "name": "Room 2",
      "members": [
        {
          "id": "user_7Qa1…",
          "name": "Hana",
          "present": true,
          "can_return": true
        }
      ]
    }
  ],
  "unassigned": []
}
POST/rooms/{room_id}/breakouts/roomsbreakouts:write

Add a room

Adds a room to the running session, with its own end-to-end key. Up to 50 rooms.

Path parameters

room_iduuidrequired
The room's id.

Body

namestring
Up to 60 characters. Defaults to "Room N".

Returns The updated breakout_session.

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/breakouts/rooms" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Room 3"}'
Response
{
  "object": "breakout_session",
  "id": "b3d9a7c2-6e41-4f08-8c15-0a7e52d1f9c6",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "status": "open",
  "auto_join": true,
  "allow_return": true,
  "self_select": false,
  "duration_seconds": 600,
  "started_at": "2026-09-17T10:00:00.000Z",
  "ends_at": "2026-09-17T10:10:00.000Z",
  "rooms": [
    {
      "id": "e14b07d9-3a52-4c6f-b8d1-92f6a0c73e58",
      "name": "Room 1",
      "members": [
        {
          "id": "user_2fK9…",
          "name": "Salma",
          "present": true,
          "can_return": true
        },
        {
          "id": "api_Xk3mQp9Lr2",
          "name": "Omar",
          "present": true,
          "can_return": false
        }
      ]
    },
    {
      "id": "5a0c9e21-77d4-4b3e-a1f8-c4d62b90e7a3",
      "name": "Room 2",
      "members": [
        {
          "id": "user_7Qa1…",
          "name": "Hana",
          "present": true,
          "can_return": true
        }
      ]
    }
  ],
  "unassigned": []
}
PATCH/rooms/{room_id}/breakouts/rooms/{breakout_id}breakouts:write

Rename a room

Renames a room. People inside see the new name at once.

Path parameters

room_iduuidrequired
The room's id.
breakout_iduuidrequired
The breakout room's id.

Body

namestringrequired
1–60 characters.

Returns The updated breakout_session.

Request
curl -X PATCH "https://deewan.io/api/v1/rooms/$ROOM_ID/breakouts/rooms/{breakout_id}" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Design review"}'
Response
{
  "object": "breakout_session",
  "id": "b3d9a7c2-6e41-4f08-8c15-0a7e52d1f9c6",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "status": "open",
  "auto_join": true,
  "allow_return": true,
  "self_select": false,
  "duration_seconds": 600,
  "started_at": "2026-09-17T10:00:00.000Z",
  "ends_at": "2026-09-17T10:10:00.000Z",
  "rooms": [
    {
      "id": "e14b07d9-3a52-4c6f-b8d1-92f6a0c73e58",
      "name": "Room 1",
      "members": [
        {
          "id": "user_2fK9…",
          "name": "Salma",
          "present": true,
          "can_return": true
        },
        {
          "id": "api_Xk3mQp9Lr2",
          "name": "Omar",
          "present": true,
          "can_return": false
        }
      ]
    },
    {
      "id": "5a0c9e21-77d4-4b3e-a1f8-c4d62b90e7a3",
      "name": "Room 2",
      "members": [
        {
          "id": "user_7Qa1…",
          "name": "Hana",
          "present": true,
          "can_return": true
        }
      ]
    }
  ],
  "unassigned": []
}
DELETE/rooms/{room_id}/breakouts/rooms/{breakout_id}breakouts:write

Remove a room

Removes a room from the running session. Anyone in it goes back to the main room. A session keeps at least one room.

Path parameters

room_iduuidrequired
The room's id.
breakout_iduuidrequired
The breakout room's id.

Returns The updated breakout_session.

Request
curl -X DELETE "https://deewan.io/api/v1/rooms/$ROOM_ID/breakouts/rooms/{breakout_id}" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "breakout_session",
  "id": "b3d9a7c2-6e41-4f08-8c15-0a7e52d1f9c6",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "status": "open",
  "auto_join": true,
  "allow_return": true,
  "self_select": false,
  "duration_seconds": 600,
  "started_at": "2026-09-17T10:00:00.000Z",
  "ends_at": "2026-09-17T10:10:00.000Z",
  "rooms": [
    {
      "id": "e14b07d9-3a52-4c6f-b8d1-92f6a0c73e58",
      "name": "Room 1",
      "members": [
        {
          "id": "user_2fK9…",
          "name": "Salma",
          "present": true,
          "can_return": true
        },
        {
          "id": "api_Xk3mQp9Lr2",
          "name": "Omar",
          "present": true,
          "can_return": false
        }
      ]
    },
    {
      "id": "5a0c9e21-77d4-4b3e-a1f8-c4d62b90e7a3",
      "name": "Room 2",
      "members": [
        {
          "id": "user_7Qa1…",
          "name": "Hana",
          "present": true,
          "can_return": true
        }
      ]
    }
  ],
  "unassigned": []
}
POST/rooms/{room_id}/breakouts/announcebreakouts:write

Broadcast a message

Shows a short message to everyone in the meeting and in every breakout room at once, for example "Five minutes left". Announcements are shown as a banner and are not end-to-end encrypted, so do not put anything private in them. Limited to ten a minute.

Path parameters

room_iduuidrequired
The room's id.

Body

messagestringrequired
Up to 300 characters.

Returns { object: "breakout_announcement", room_id, sent: true }.

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/breakouts/announce" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"message":"Five minutes left."}'
Response
{
  "object": "breakout_announcement",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "sent": true
}
POST/rooms/{room_id}/breakouts/endbreakouts:write

End breakout rooms

Brings everyone back to the main room. With warn: true people see a 60-second countdown and the rooms close when it ends; otherwise they close at once. Ending the whole meeting also ends any open breakouts.

Path parameters

room_iduuidrequired
The room's id.

Body

warnboolean
Give a 60-second countdown first. Defaults to false.

Returns { object: "breakouts", room_id, ended, closing, ends_at }.

Request
curl -X POST "https://deewan.io/api/v1/rooms/$ROOM_ID/breakouts/end" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"warn":true}'
Response
{
  "object": "breakouts",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "ended": false,
  "closing": true,
  "ends_at": "2026-09-17T10:06:00.000Z"
}

Recordings

GET/recordingsrecordings:read

List recordings

Recordings made in this workspace's rooms, newest first.

Query parameters

room_iduuid
Only recordings from this room.
limitinteger
1–100, default 50.

Returns A list of recording objects.

Request
curl -X GET "https://deewan.io/api/v1/recordings" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "object": "recording",
      "id": "e91c7d45-3a62-4b8f-9c0d-1a2b3c4d5e6f",
      "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
      "title": "Onboarding call",
      "status": "ready",
      "visibility": "room",
      "mime_type": "video/webm;codecs=vp9,opus",
      "parts": 14,
      "bytes": 65011712,
      "duration_ms": 1832000,
      "started_at": "2026-09-17T09:20:00.000Z",
      "ended_at": "2026-09-17T09:50:32.000Z"
    }
  ],
  "has_more": false
}
GET/recordings/{recording_id}recordings:read

Retrieve a recording

Metadata for one recording, including how many encrypted parts it has.

Path parameters

recording_iduuidrequired
The recording's id.

Returns A recording object.

Request
curl -X GET "https://deewan.io/api/v1/recordings/{recording_id}" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "recording",
  "id": "e91c7d45-3a62-4b8f-9c0d-1a2b3c4d5e6f",
  "room_id": "5f0c2b8e-1d7a-4c52-9a0e-2f3b7c1d9e44",
  "title": "Onboarding call",
  "status": "ready",
  "visibility": "room",
  "mime_type": "video/webm;codecs=vp9,opus",
  "parts": 14,
  "bytes": 65011712,
  "duration_ms": 1832000,
  "started_at": "2026-09-17T09:20:00.000Z",
  "ended_at": "2026-09-17T09:50:32.000Z"
}
POST/recordings/{recording_id}/downloadrecordings:read

Get the parts and key

Everything needed to rebuild the file: the part URLs and the key for this one recording. Each part is a 12-byte IV followed by AES-256-GCM ciphertext, authenticated with deewan-recording:<recording id>:<index>. The SDK's recordings.download() does this for you. Treat the key like a password.

Path parameters

recording_iduuidrequired
The recording's id.

Returns A recording.download object.

Request
curl -X POST "https://deewan.io/api/v1/recordings/{recording_id}/download" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "recording.download",
  "id": "e91c7d45-3a62-4b8f-9c0d-1a2b3c4d5e6f",
  "mime_type": "video/webm;codecs=vp9,opus",
  "bytes": 65011712,
  "encryption": {
    "algorithm": "AES-256-GCM",
    "key": "xq7…",
    "key_encoding": "base64url",
    "iv_bytes": 12
  },
  "parts": [
    {
      "index": 0,
      "url": "https://deewan.io/api/v1/recordings/e91c7d45-3a62-4b8f-9c0d-1a2b3c4d5e6f/parts/0"
    }
  ]
}
GET/recordings/{recording_id}/parts/{index}recordings:read

Download one part

One encrypted part, exactly as stored. The response is binary, not JSON.

Path parameters

recording_iduuidrequired
The recording's id.
indexintegerrequired
Part number, starting at 0.

Returns application/octet-stream — IV + ciphertext.

Request
curl -X GET "https://deewan.io/api/v1/recordings/{recording_id}/parts/{index}" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
"<binary>"
DELETE/recordings/{recording_id}recordings:write

Delete a recording

Deletes the recording and its stored parts. This cannot be undone.

Path parameters

recording_iduuidrequired
The recording's id.

Returns { object: "recording", id, deleted: true }.

Request
curl -X DELETE "https://deewan.io/api/v1/recordings/{recording_id}" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "recording",
  "id": "e91c7d45-3a62-4b8f-9c0d-1a2b3c4d5e6f",
  "deleted": true
}

Webhooks

GET/webhookswebhooks:manage

List endpoints

Webhook endpoints in the key's scope.

Returns A list of webhook_endpoint objects.

Request
curl -X GET "https://deewan.io/api/v1/webhooks" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "object": "webhook_endpoint",
      "id": "3c9e…",
      "url": "https://example.com/hooks/deewan",
      "description": null,
      "events": [
        "room.started"
      ],
      "enabled": true,
      "created_at": "2026-09-17T09:00:00.000Z"
    }
  ],
  "has_more": false
}
POST/webhookswebhooks:manage

Create an endpoint

Registers a public HTTPS endpoint. The response includes secret, shown only once — store it to verify signatures. Up to 10 endpoints per scope.

Body

urlstringrequired
A public https:// URL. Private and local addresses are refused.
eventsstring[]required
Event types to receive, or ["*"] for all.
descriptionstring | null
Up to 120 characters.
enabledboolean
Default true.

Returns The new webhook_endpoint plus secret.

Request
curl -X POST "https://deewan.io/api/v1/webhooks" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/hooks/deewan","events":["room.started","room.finished","participant.joined"]}'
Response
{
  "object": "webhook_endpoint",
  "id": "3c9e…",
  "url": "https://example.com/hooks/deewan",
  "description": null,
  "events": [
    "room.started",
    "room.finished",
    "participant.joined"
  ],
  "enabled": true,
  "created_at": "2026-09-17T09:00:00.000Z",
  "secret": "whsec_…"
}
PATCH/webhooks/{webhook_id}webhooks:manage

Update an endpoint

Change the URL, events, description, or pause it with enabled: false.

Path parameters

webhook_iduuidrequired
The endpoint's id.

Body

urlstring
A public https:// URL.
eventsstring[]
Replaces the event list.
descriptionstring | null
Up to 120 characters.
enabledboolean
Pause or resume deliveries.

Returns The updated webhook_endpoint.

Request
curl -X PATCH "https://deewan.io/api/v1/webhooks/$WEBHOOK_ID" \
  -H "Authorization: Bearer $DEEWAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":false}'
Response
{
  "object": "webhook_endpoint",
  "id": "3c9e…",
  "url": "https://example.com/hooks/deewan",
  "description": null,
  "events": [
    "room.started"
  ],
  "enabled": false,
  "created_at": "2026-09-17T09:00:00.000Z"
}
DELETE/webhooks/{webhook_id}webhooks:manage

Delete an endpoint

Stops deliveries and deletes the endpoint.

Path parameters

webhook_iduuidrequired
The endpoint's id.

Returns The deleted endpoint with deleted: true.

Request
curl -X DELETE "https://deewan.io/api/v1/webhooks/$WEBHOOK_ID" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "webhook_endpoint",
  "id": "3c9e…",
  "deleted": true
}
POST/webhooks/{webhook_id}/testwebhooks:manage

Send a test event

Delivers a signed webhook.test event now and reports your endpoint's response.

Path parameters

webhook_iduuidrequired
The endpoint's id.

Returns { object: "webhook_test", ok, status }

Request
curl -X POST "https://deewan.io/api/v1/webhooks/$WEBHOOK_ID/test" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "webhook_test",
  "ok": true,
  "status": 200
}
GET/webhooks/{webhook_id}/deliverieswebhooks:manage

List deliveries

The 50 most recent delivery attempts, with outcome and your endpoint's status code.

Path parameters

webhook_iduuidrequired
The endpoint's id.

Returns A list of webhook_delivery objects.

Request
curl -X GET "https://deewan.io/api/v1/webhooks/$WEBHOOK_ID/deliveries" \
  -H "Authorization: Bearer $DEEWAN_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "object": "webhook_delivery",
      "id": "77aa…",
      "event_id": "evt_…",
      "event_type": "room.started",
      "status": "succeeded",
      "attempts": 1,
      "response_code": 200,
      "error": null,
      "created_at": "2026-09-17T09:20:00.000Z"
    }
  ],
  "has_more": false
}