openapi: 3.2.0 info: title: Teler API Reference Voice / Apps API summary: Programmable voice infrastructure for AI agents. description: 'The Teler API lets you place and control programmable voice calls, stream live audio to AI agents, and observe everything that happens on a call in real time.' contact: name: Teler support email: support@frejun.com version: 0.1.0 servers: - url: https://api.frejun.ai description: Production security: - ApiKeyAuth: [] tags: - name: Voice / Apps description: Voice apps are the configuration context for calls — they define webhook URLs, flows, and channel limits. Create and manage your voice apps here. paths: /api/v1/voice/apps: post: tags: - Voice / Apps summary: Create a voice app operationId: create_voice_app requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CallAppCreate' responses: '201': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CallAppResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ValidationErrorResponse' get: tags: - Voice / Apps summary: List voice apps operationId: list_voice_apps parameters: - name: search in: query required: false schema: anyOf: - type: string - type: 'null' title: Search - name: status in: query required: false schema: anyOf: - type: array items: $ref: '#/components/schemas/Status' - type: 'null' title: Status - name: limit in: query required: false schema: type: integer maximum: 100 minimum: 1 default: 50 title: Limit - name: cursor_after in: query required: false schema: anyOf: - type: string - type: 'null' title: Cursor After - name: cursor_before in: query required: false schema: anyOf: - type: string - type: 'null' title: Cursor Before responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CursorPage_CallAppResponse_' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ValidationErrorResponse' /api/v1/voice/apps/{voice_app_id}: get: tags: - Voice / Apps summary: Retrieve a voice app operationId: retrieve_voice_app parameters: - name: voice_app_id in: path required: true schema: type: string title: Voice App Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CallAppResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ValidationErrorResponse' patch: tags: - Voice / Apps summary: Update a voice app operationId: update_voice_app parameters: - name: voice_app_id in: path required: true schema: type: string title: Voice App Id requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CallAppUpdate' responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CallAppResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ValidationErrorResponse' delete: tags: - Voice / Apps summary: Delete a voice app operationId: delete_voice_app parameters: - name: voice_app_id in: path required: true schema: type: string title: Voice App Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/DefaultResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ValidationErrorResponse' /api/v1/voice/apps/{voice_app_id}/virtual-numbers: get: tags: - Voice / Apps summary: List virtual numbers for a voice app operationId: list_voice_app_virtual_numbers parameters: - name: voice_app_id in: path required: true schema: type: string title: Voice App Id - name: search in: query required: false schema: anyOf: - type: string - type: 'null' title: Search - name: location in: query required: false schema: anyOf: - type: array items: type: string - type: 'null' title: Location - name: limit in: query required: false schema: type: integer maximum: 50 minimum: 1 default: 10 title: Limit - name: cursor_after in: query required: false schema: anyOf: - type: string - type: 'null' title: Cursor After - name: cursor_before in: query required: false schema: anyOf: - type: string - type: 'null' title: Cursor Before responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CursorPage_VNListResponse_' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ValidationErrorResponse' components: schemas: ValidationFieldError: properties: loc: items: {} type: array title: Loc description: Path to the offending field, e.g. `["body", "to_number"]`. msg: type: string title: Msg description: Human-readable explanation of the problem. type: type: string title: Type description: Programmatic error type, e.g. `string_pattern_mismatch`. type: object required: - loc - msg - type title: ValidationFieldError description: One field-level problem within a `422` validation error. Status: type: string enum: - active - inactive title: Status DefaultResponse: properties: success: type: boolean title: Success message: type: string title: Message type: object required: - success - message title: DefaultResponse CallAppUpdate: properties: name: anyOf: - type: string minLength: 1 - type: 'null' title: Name flow_url: anyOf: - type: string maxLength: 2083 minLength: 1 format: uri - type: 'null' title: Flow Url webhook_url: anyOf: - type: string maxLength: 2083 minLength: 1 format: uri - type: 'null' title: Webhook Url fallback_url: anyOf: - type: string maxLength: 2083 minLength: 1 format: uri - type: 'null' title: Fallback Url status: anyOf: - $ref: '#/components/schemas/Status' - type: 'null' channel_limit: anyOf: - type: integer - type: 'null' title: Channel Limit secret_id: anyOf: - type: string - type: 'null' title: Secret Id webhook_api_version: anyOf: - type: string enum: - '2025-08-01' - '2026-06-01' - type: 'null' title: Webhook Api Version additionalProperties: false type: object title: CallAppUpdate CallAppCreate: properties: name: type: string minLength: 1 title: Name flow_url: type: string maxLength: 2083 minLength: 1 format: uri title: Flow Url webhook_url: type: string maxLength: 2083 minLength: 1 format: uri title: Webhook Url fallback_url: anyOf: - type: string maxLength: 2083 minLength: 1 format: uri - type: 'null' title: Fallback Url vn_ids: anyOf: - items: type: string type: array - type: 'null' title: Vn Ids secret_id: anyOf: - type: string - type: 'null' title: Secret Id webhook_api_version: anyOf: - type: string enum: - '2025-08-01' - '2026-06-01' - type: 'null' title: Webhook Api Version channel_limit: anyOf: - type: integer - type: 'null' title: Channel Limit additionalProperties: false type: object required: - name - flow_url - webhook_url title: CallAppCreate CallAppResponse: properties: name: type: string minLength: 1 title: Name flow_url: type: string maxLength: 2083 minLength: 1 format: uri title: Flow Url webhook_url: type: string maxLength: 2083 minLength: 1 format: uri title: Webhook Url fallback_url: anyOf: - type: string maxLength: 2083 minLength: 1 format: uri - type: 'null' title: Fallback Url id: type: string title: Id status: $ref: '#/components/schemas/Status' channel_limit: anyOf: - type: integer - type: 'null' title: Channel Limit vn_count: type: integer title: Vn Count default: 0 secret_id: anyOf: - type: string - type: 'null' title: Secret Id secret_name: anyOf: - type: string - type: 'null' title: Secret Name webhook_api_version: type: string enum: - '2025-08-01' - '2026-06-01' title: Webhook Api Version account_id: type: string title: Account Id type: object required: - name - flow_url - webhook_url - id - status - webhook_api_version - account_id title: CallAppResponse CallAppListResponse: properties: id: type: string title: Id name: type: string title: Name type: object required: - id - name title: CallAppListResponse LocationResponse: properties: id: type: string title: Id name: type: string title: Name region_code: type: string title: Region Code country_code: type: string title: Country Code country_name: anyOf: - type: string - type: 'null' title: Country Name type: object required: - id - name - region_code - country_code title: LocationResponse CursorPage_CallAppResponse_: properties: data: items: $ref: '#/components/schemas/CallAppResponse' type: array title: Data description: The page of results, newest first. next_cursor: anyOf: - type: string - type: 'null' title: Next Cursor description: Pass as `cursor_after` to fetch the next (older) page. `null` on the last page. previous_cursor: anyOf: - type: string - type: 'null' title: Previous Cursor description: Pass as `cursor_before` to fetch the previous (newer) page. `null` on the first page. has_more: type: boolean title: Has More description: Whether more results exist after this page. default: false type: object required: - data title: CursorPage[CallAppResponse] VNListResponse: properties: id: type: string title: Id account_id: type: string title: Account Id name: type: string title: Name number: type: string title: Number location: $ref: '#/components/schemas/LocationResponse' voice_app: anyOf: - $ref: '#/components/schemas/CallAppListResponse' - type: 'null' sip_trunk: anyOf: - $ref: '#/components/schemas/SipTrunkListResponse' - type: 'null' type: object required: - id - account_id - name - number - location - voice_app - sip_trunk title: VNListResponse SipTrunkListResponse: properties: id: type: string title: Id name: type: string title: Name type: object required: - id - name title: SipTrunkListResponse ValidationErrorResponse: properties: success: type: boolean title: Success description: Always `false`. default: false message: type: string title: Message description: Always `"Validation Error"` for this response. default: Validation Error errors: items: $ref: '#/components/schemas/ValidationFieldError' type: array title: Errors description: One entry per field that failed validation. type: object required: - errors title: ValidationErrorResponse description: Returned with `422` when the request fails schema validation. example: errors: - loc: - body - to_number msg: String should match pattern '^\+\d{7,15}$' type: string_pattern_mismatch message: Validation Error success: false CursorPage_VNListResponse_: properties: data: items: $ref: '#/components/schemas/VNListResponse' type: array title: Data description: The page of results, newest first. next_cursor: anyOf: - type: string - type: 'null' title: Next Cursor description: Pass as `cursor_after` to fetch the next (older) page. `null` on the last page. previous_cursor: anyOf: - type: string - type: 'null' title: Previous Cursor description: Pass as `cursor_before` to fetch the previous (newer) page. `null` on the first page. has_more: type: boolean title: Has More description: Whether more results exist after this page. default: false type: object required: - data title: CursorPage[VNListResponse] securitySchemes: ApiKeyAuth: type: apiKey in: header name: x-api-key description: Your secret account API key. Create one in the Teler dashboard.