{
  "info": {
    "version": "1.0.0",
    "description": "Seven products on one platform: TeleCall, TeleMeet, TeleDemo, TeleVoip, TeleChat,\nTeleDesk and TeleAssistant. Each has its own path prefix, so a URL says which\nproduct it belongs to and a key scoped to one cannot wander into another.\n\nAuthenticate with `Authorization: Bearer <key>`. Every route requires a scope, reads\nincluded: a key scoped to meetings cannot read the call history even though both\nbelong to the same tenant.\n\nWrite operations accept an `Idempotency-Key` header. Repeating a request with the\nsame key returns the first response rather than doing the work twice.\n",
    "title": "Telenaas API"
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "A stable machine-readable code."
          },
          "message": {
            "type": "string",
            "description": "What went wrong, in words."
          }
        }
      }
    },
    "securitySchemes": {
      "infraToken": {
        "in": "header",
        "name": "x-telenaas-token",
        "type": "apiKey",
        "description": "Shared token for our own telephony infrastructure. Not for customers."
      },
      "bearerAuth": {
        "scheme": "bearer",
        "type": "http",
        "description": "A Telenaas API key."
      }
    }
  },
  "paths": {
    "/api/v1/emergency/route/{number}": {
      "get": {
        "description": "Where an emergency call from this number goes, and with what address.",
        "parameters": [
          {
            "in": "path",
            "name": "number",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Emergency routing",
        "tags": [
          "Switch"
        ],
        "operationId": "get_emergency_route",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "infrastructure token",
        "security": [
          {
            "infraToken": []
          }
        ]
      }
    },
    "/api/v1/telechat/attachments/{id}": {
      "get": {
        "description": "A short-lived download link for a file message: the provider's own when it can sign one, ours otherwise.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Fetch a file",
        "tags": [
          "TeleChat"
        ],
        "operationId": "get_attachment",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "chat:read"
      }
    },
    "/api/v1/teleassistant/assistants": {
      "get": {
        "description": "The assistants in this tenant and the numbers they answer.",
        "parameters": [],
        "summary": "List assistants",
        "tags": [
          "TeleAssistant"
        ],
        "operationId": "get_list_assistants",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "assistant:read"
      },
      "post": {
        "description": "A greeting, business hours, and what to do outside them: take a message, offer a menu, forward, or hand over to an AI agent.",
        "parameters": [],
        "summary": "Create an assistant",
        "tags": [
          "TeleAssistant"
        ],
        "operationId": "post_create_assistant",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "assistant:manage",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/assistants/plan/{number}": {
      "get": {
        "description": "Infrastructure token. What the assistant in front of this number wants done with an incoming call: the greeting, the action, the forward or the menu. 404 with `no_assistant` means ring it normally.",
        "parameters": [
          {
            "in": "path",
            "name": "number",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "An assistant's plan for a dialled number",
        "tags": [
          "Platform"
        ],
        "operationId": "get_assistant_plan",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "infrastructure token"
      }
    },
    "/api/v1/realtime/rooms/{room}": {
      "get": {
        "description": "Opens the room for one of this tenant's meetings on the media plane and returns the router's RTP capabilities — the first step of the mediasoup handshake. `room` is the meeting id; a meeting belonging to another tenant answers 404 exactly as a made-up id does. Signalling continues over the media socket. If no media plane is configured this answers 200 with `sfu: false`, so a caller can fall back to mesh instead of waiting.",
        "parameters": [
          {
            "in": "path",
            "name": "room",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Open an SFU room",
        "tags": [
          "Platform"
        ],
        "operationId": "get_room",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "meeting:manage"
      }
    },
    "/api/v1/realtime/ice": {
      "get": {
        "description": "STUN, plus a TURN credential minted for this request and valid for an hour. Fetch these per session rather than caching them: WebRTC that works in an office and fails on a phone is almost always a missing relay, and a stale credential fails the same way.",
        "parameters": [],
        "summary": "ICE servers",
        "tags": [
          "Platform"
        ],
        "operationId": "get_ice",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "meeting:read"
      }
    },
    "/api/v1/telemeet/meetings": {
      "get": {
        "description": "Meetings for this tenant, most recent first.",
        "parameters": [],
        "summary": "List meetings",
        "tags": [
          "TeleMeet"
        ],
        "operationId": "get_list_meetings",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "meeting:read"
      },
      "post": {
        "description": "Room size is capped by the tenant's plan. Asking for more is refused rather than quietly reduced.",
        "parameters": [],
        "summary": "Create a meeting",
        "tags": [
          "TeleMeet"
        ],
        "operationId": "post_create_meeting",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "meeting:manage",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/televoip/numbers/{id}/assign": {
      "post": {
        "description": "Give a number to a person in this tenant, or to a TeleAssistant so that it answers instead.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Assign a number",
        "tags": [
          "TeleVoip"
        ],
        "operationId": "post_assign_number",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "number:assign",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/webhooks": {
      "get": {
        "description": "Where we send events.",
        "parameters": [],
        "summary": "List webhook endpoints",
        "tags": [
          "Platform"
        ],
        "operationId": "get_list_webhooks",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "developer:read"
      },
      "post": {
        "description": "Returns the signing secret once. The timestamp is inside the signature, so a captured delivery cannot be replayed later.",
        "parameters": [],
        "summary": "Add a webhook endpoint",
        "tags": [
          "Platform"
        ],
        "operationId": "post_create_webhook",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "developer:manage",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/teleassistant/voicemails": {
      "get": {
        "description": "Who called, when, and the transcript. The audio is not here: like every recording, it is delivered to a device or to Burmeel Storage and never kept in our database.",
        "parameters": [],
        "summary": "List voicemails",
        "tags": [
          "TeleAssistant"
        ],
        "operationId": "get_list_voicemails",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "assistant:read"
      }
    },
    "/api/v1/telechat/widgets": {
      "get": {
        "description": "The website widgets this tenant has, with their public keys and allowed origins.",
        "parameters": [],
        "summary": "List chat widgets",
        "tags": [
          "TeleChat"
        ],
        "operationId": "get_list_widgets",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "chat:read"
      },
      "post": {
        "description": "Returns a public key for the `<script>` tag. The key is not a secret — `allowed_origins` is what keeps the widget to your own sites, and an empty list refuses every origin.",
        "parameters": [],
        "summary": "Create a chat widget",
        "tags": [
          "TeleChat"
        ],
        "operationId": "post_create_widget",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "chat:moderate",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/mcp": {
      "post": {
        "description": "A JSON-RPC dispatcher for agents. Tools are named for the product they belong to; each enforces its own permission, so an agent can never reach further than a REST client holding the same key.",
        "parameters": [],
        "summary": "Model Context Protocol",
        "tags": [
          "MCP"
        ],
        "operationId": "post_handle",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "any authenticated key",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/teleassistant/assistants/{id}": {
      "get": {
        "description": "One assistant, with its menu and its schedule.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Get an assistant",
        "tags": [
          "TeleAssistant"
        ],
        "operationId": "get_get_assistant",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "assistant:read"
      }
    },
    "/api/v1/audit": {
      "get": {
        "description": "Hash-chained, append-only, and readable here.",
        "parameters": [],
        "summary": "Audit ledger",
        "tags": [
          "Platform"
        ],
        "operationId": "get_audit",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "audit:read"
      }
    },
    "/api/v1/teledemo/demos/{id}/live": {
      "delete": {
        "description": "Closes the room. The recording, if there was one, still has to be claimed.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "End a demo",
        "tags": [
          "TeleDemo"
        ],
        "operationId": "delete_end_demo",
        "responses": {
          "200": {
            "description": "Done."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "demo:host"
      },
      "post": {
        "description": "Opens the room and tells everybody watching the directory that it has started.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Go live",
        "tags": [
          "TeleDemo"
        ],
        "operationId": "post_start_demo",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "demo:host",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/meetings/{id}/phone-legs/{participant_id}": {
      "delete": {
        "description": "Releases the media node's ports when the caller hangs up.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "participant_id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "End a telephone leg",
        "tags": [
          "Switch"
        ],
        "operationId": "delete_end_phone_leg",
        "responses": {
          "200": {
            "description": "Done."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "infrastructure token"
      }
    },
    "/api/v1/storage/verify": {
      "post": {
        "description": "Writes, reads back and deletes a probe object with the configured credentials.",
        "parameters": [],
        "summary": "Check the storage",
        "tags": [
          "Platform"
        ],
        "operationId": "post_verify_storage",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "tenant:manage",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/teledesk/knowledge": {
      "get": {
        "description": "Pass `audience=public` to get only articles that may be sent to a customer.",
        "parameters": [],
        "summary": "Search the knowledge base",
        "tags": [
          "TeleDesk"
        ],
        "operationId": "get_search_knowledge",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "helpdesk:read"
      }
    },
    "/api/v1/webhooks/deliveries": {
      "get": {
        "description": "So \"it never arrived\" has an answer.",
        "parameters": [],
        "summary": "Delivery history",
        "tags": [
          "Platform"
        ],
        "operationId": "get_webhook_deliveries",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "developer:read"
      }
    },
    "/api/v1/teledemo/demos/{id}": {
      "get": {
        "description": "One demo, with its audience count.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Get a demo",
        "tags": [
          "TeleDemo"
        ],
        "operationId": "get_get_demo",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "demo:read"
      }
    },
    "/api/v1/workflow-runs": {
      "get": {
        "description": "Every run, with the steps it took and the ones it was denied.",
        "parameters": [],
        "summary": "Automation history",
        "tags": [
          "Automation"
        ],
        "operationId": "get_workflow_runs",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "automation:read"
      }
    },
    "/api/v1/telechat/conversations/{id}/archive": {
      "get": {
        "description": "Days moved out of the hot window into the organisation's storage, newest first.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Archived days",
        "tags": [
          "TeleChat"
        ],
        "operationId": "get_archive_days",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "chat:read"
      }
    },
    "/api/v1/telechat/conversations": {
      "get": {
        "description": "Chat threads this key can see, including those started from a website widget.",
        "parameters": [],
        "summary": "List conversations",
        "tags": [
          "TeleChat"
        ],
        "operationId": "get_list_conversations",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "chat:read"
      }
    },
    "/api/v1/telechat/conversations/{id}/attachments": {
      "post": {
        "description": "Multipart `file`, or JSON `name` and base64 `data`. Stored in the organisation's own storage; the message carries only the name and a reference.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Send a file",
        "tags": [
          "TeleChat"
        ],
        "operationId": "post_create_attachment",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "chat:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/televoip/calls": {
      "get": {
        "description": "Telephone call history for this tenant.",
        "parameters": [],
        "summary": "List calls",
        "tags": [
          "TeleVoip"
        ],
        "operationId": "get_list_calls",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "voice:read"
      },
      "post": {
        "description": "An emergency number takes a different path: never billed, never rate-limited, and refused outright if there is no dispatchable location.",
        "parameters": [],
        "summary": "Place a call",
        "tags": [
          "TeleVoip"
        ],
        "operationId": "post_create_call",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "voice:call",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/telechat/conversations/direct": {
      "post": {
        "description": "Between the calling person and `user_id`; reuses the existing one.",
        "parameters": [],
        "summary": "Start a direct conversation",
        "tags": [
          "TeleChat"
        ],
        "operationId": "post_start_direct",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "chat:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/realtime/socket-token": {
      "post": {
        "description": "A two-minute token that opens the signalling socket at /media/socket in place of the API key, so the key never appears in a WebSocket URL, a proxy log or a browser history. Pass it as the `token` connect parameter.",
        "parameters": [],
        "summary": "Mint a socket token",
        "tags": [
          "Platform"
        ],
        "operationId": "post_socket_token",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "meeting:read",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/telemeet/meetings/{id}": {
      "get": {
        "description": "One meeting, with its join code and dial-in PIN.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Get a meeting",
        "tags": [
          "TeleMeet"
        ],
        "operationId": "get_get_meeting",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "meeting:read"
      },
      "delete": {
        "description": "Marks it cancelled. Anyone already in the room is not thrown out.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Cancel a meeting",
        "tags": [
          "TeleMeet"
        ],
        "operationId": "delete_cancel_meeting",
        "responses": {
          "200": {
            "description": "Done."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "meeting:manage"
      }
    },
    "/api/v1/teledesk/tickets/{id}": {
      "get": {
        "description": "With its messages. Internal notes are included only for a key holding helpdesk:respond.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Get a ticket",
        "tags": [
          "TeleDesk"
        ],
        "operationId": "get_get_ticket",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "helpdesk:read"
      }
    },
    "/api/v1/teledemo/requests": {
      "get": {
        "description": "People who asked for a demonstration and have not had one yet.",
        "parameters": [],
        "summary": "Demo requests",
        "tags": [
          "TeleDemo"
        ],
        "operationId": "get_demo_requests",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "demo:read"
      }
    },
    "/api/v1/storage": {
      "get": {
        "description": "The organisation's storage plane: Burmeel by default, or its own Amazon S3, Google Cloud Storage, Azure Blob or S3-compatible bucket. Never returns credentials.",
        "parameters": [],
        "summary": "Where files and history live",
        "tags": [
          "Platform"
        ],
        "operationId": "get_storage",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "tenant:read"
      },
      "put": {
        "description": "`provider` (burmeel, s3, gcs, azure), `bucket`, `endpoint`, `region`, `account`, `prefix`, `key_id`, `secret`. Credentials are encrypted under the organisation's own key and only replaced when supplied.",
        "parameters": [],
        "summary": "Choose the storage",
        "tags": [
          "Platform"
        ],
        "operationId": "put_set_storage",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "tenant:manage",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/teledesk/tickets/{id}/replies": {
      "post": {
        "description": "Set `internal` to true for a note to colleagues, which is not sent to the requester.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Reply to a ticket",
        "tags": [
          "TeleDesk"
        ],
        "operationId": "post_reply_to_ticket",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "helpdesk:respond",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/televoip/numbers": {
      "get": {
        "description": "Numbers this tenant holds.",
        "parameters": [],
        "summary": "List numbers",
        "tags": [
          "TeleVoip"
        ],
        "operationId": "get_list_numbers",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "number:read"
      }
    },
    "/api/v1/usage": {
      "get": {
        "description": "Metered usage for the current billing period.",
        "parameters": [],
        "summary": "Usage",
        "tags": [
          "Platform"
        ],
        "operationId": "get_usage",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "billing:read"
      }
    },
    "/api/v1/telechat/conversations/{id}/messages": {
      "get": {
        "description": "The hot window, newest last, decrypted for the caller. Older days are in the archive.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Read recent messages",
        "tags": [
          "TeleChat"
        ],
        "operationId": "get_list_messages",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "chat:read"
      },
      "post": {
        "description": "Posts into a conversation. Bodies are encrypted at rest per tenant.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Send a message",
        "tags": [
          "TeleChat"
        ],
        "operationId": "post_create_message",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "chat:write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/teledemo/demos/{id}/questions": {
      "get": {
        "description": "The audience's questions, most upvoted first, with the answers given.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Questions asked",
        "tags": [
          "TeleDemo"
        ],
        "operationId": "get_demo_questions",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "demo:read"
      }
    },
    "/api/v1/calls/events": {
      "post": {
        "description": "Infrastructure token. `started`, `answered` or `ended`, keyed on the switch's own call id. This is what turns a call into a record with a duration and a cost.",
        "parameters": [],
        "summary": "A call event from the switch",
        "tags": [
          "Platform"
        ],
        "operationId": "post_call_event",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "infrastructure token",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/telechat/conversations/{id}/archive/{day}": {
      "get": {
        "description": "The messages of one archived day, fetched from the organisation's storage and decrypted for the caller.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "day",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Read an archived day",
        "tags": [
          "TeleChat"
        ],
        "operationId": "get_archive_messages",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "chat:read"
      }
    },
    "/api/v1/teledemo/demos": {
      "get": {
        "description": "Scheduled, live and finished product demonstrations.",
        "parameters": [],
        "summary": "List demos",
        "tags": [
          "TeleDemo"
        ],
        "operationId": "get_list_demos",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "demo:read"
      },
      "post": {
        "description": "Creates the demo and its public page. Viewers join by slug and need no account; a demo is a broadcast with a question queue, not a meeting everybody talks in.",
        "parameters": [],
        "summary": "Schedule a demo",
        "tags": [
          "TeleDemo"
        ],
        "operationId": "post_create_demo",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "demo:host",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/meetings/by-pin/{pin}": {
      "get": {
        "description": "Used by the telephony switch. Authenticated with the infrastructure token, not an API key.",
        "parameters": [
          {
            "in": "path",
            "name": "pin",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Resolve a dial-in PIN",
        "tags": [
          "Switch"
        ],
        "operationId": "get_meeting_by_pin",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "infrastructure token",
        "security": [
          {
            "infraToken": []
          }
        ]
      }
    },
    "/api/v1/products": {
      "get": {
        "description": "The seven products, what each one is for, which tiers it has, and which of them this tenant's plan actually includes. Read this rather than hard-coding the list.",
        "parameters": [],
        "summary": "The product line",
        "tags": [
          "Platform"
        ],
        "operationId": "get_list_products",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "tenant:read"
      }
    },
    "/api/v1/teledesk/tickets": {
      "get": {
        "description": "Help desk tickets for this tenant.",
        "parameters": [],
        "summary": "List tickets",
        "tags": [
          "TeleDesk"
        ],
        "operationId": "get_list_tickets",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "helpdesk:read"
      },
      "post": {
        "description": "Routed to a queue by the same rules a ticket opened by a person would be.",
        "parameters": [],
        "summary": "Open a ticket",
        "tags": [
          "TeleDesk"
        ],
        "operationId": "post_create_ticket",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "helpdesk:respond",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/status": {
      "get": {
        "description": "What this key can reach, and whether the platform is healthy.",
        "parameters": [],
        "summary": "Platform status",
        "tags": [
          "Platform"
        ],
        "operationId": "get_status",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "tenant:read"
      }
    },
    "/api/v1/meetings/{id}/phone-legs": {
      "post": {
        "description": "Used by the conference bridge. Admits a caller and answers with the RTP addresses for their leg, or 202 when the host has not admitted them yet.",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "summary": "Join a meeting by telephone",
        "tags": [
          "Switch"
        ],
        "operationId": "post_meeting_phone_leg",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "infrastructure token",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/api/v1/workflows": {
      "get": {
        "description": "What runs on its own in this tenant.",
        "parameters": [],
        "summary": "List automations",
        "tags": [
          "Automation"
        ],
        "operationId": "get_list_workflows",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "automation:read"
      }
    },
    "/api/v1/telecall/calls": {
      "get": {
        "description": "In-app audio calls this key can see, most recent first.",
        "parameters": [],
        "summary": "List TeleCall calls",
        "tags": [
          "TeleCall"
        ],
        "operationId": "get_list_app_calls",
        "responses": {
          "200": {
            "description": "The requested resource."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "voice:read"
      },
      "post": {
        "description": "Rings another account over WebRTC. No number is dialled and no carrier is involved, so there is no per-minute charge; pass `to_user_id`. For a call to a telephone, use TeleVoip instead.",
        "parameters": [],
        "summary": "Place an in-app call",
        "tags": [
          "TeleCall"
        ],
        "operationId": "post_start_app_call",
        "responses": {
          "200": {
            "description": "Done."
          },
          "201": {
            "description": "Created."
          },
          "401": {
            "description": "No valid key was presented."
          },
          "403": {
            "description": "The key does not hold the required scope."
          }
        },
        "x-required-scope": "voice:call",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    }
  },
  "openapi": "3.1.0",
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "servers": [
    {
      "description": "This deployment",
      "url": "https://telenaas.com"
    }
  ]
}