openapi: 3.2.0 info: title: wazo-call-logd Cdr API description: Consult call logs from a REST API version: 1.0.0 contact: name: Wazo Dev Team url: https://wazo-platform.org/ email: dev@wazo.community x-logo: url: https://wazo-platform.org/images/logo-black.svg backgroundColor: '#FAFAFA' altText: Wazo Logo servers: - url: /1.0 security: - wazo_auth_token: [] tags: - name: cdr paths: /cdr: get: summary: List CDR description: '**Required ACL:** `call-logd.cdr.read` This endpoint allow to use `?token={token_uuid}` and `?tenant={tenant_uuid}` query string to bypass headers ' tags: - cdr parameters: - $ref: '#/components/parameters/tenantuuid' - $ref: '#/components/parameters/from' - $ref: '#/components/parameters/until' - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/order' - $ref: '#/components/parameters/direction' - $ref: '#/components/parameters/search' - $ref: '#/components/parameters/call_direction' - $ref: '#/components/parameters/number' - $ref: '#/components/parameters/tags' - $ref: '#/components/parameters/user_uuid' - $ref: '#/components/parameters/from_id' - $ref: '#/components/parameters/recurse' - $ref: '#/components/parameters/distinct' - $ref: '#/components/parameters/recorded' - $ref: '#/components/parameters/format' - $ref: '#/components/parameters/conversation_id' - $ref: '#/components/parameters/call_status' - $ref: '#/components/parameters/requested_internal_extension' - $ref: '#/components/parameters/requested_internal_context' responses: '200': description: List CDR content: application/json: schema: $ref: '#/components/schemas/CDRList' text/csv; charset=utf-8: schema: $ref: '#/components/schemas/CDRList' '400': $ref: '#/components/responses/InvalidRequest' /cdr/recordings/media: delete: summary: Delete multiple CDRs recording media description: '**Required ACL:** `call-logd.cdr.recordings.media.delete`' tags: - cdr responses: '204': description: The CDRs recording media were deleted successfully '404': $ref: '#/components/responses/NotFoundError' requestBody: content: application/json: schema: type: object properties: cdr_ids: type: array items: type: integer description: The CDR IDs list from which to delete recording media required: true /cdr/recordings/media/export: post: summary: Create an export for the recording media of multiple CDRs description: '**Required ACL:** `call-logd.cdr.recordings.media.export.create` This endpoint creates a new export and returns its UUID. ' tags: - cdr parameters: - $ref: '#/components/parameters/from' - $ref: '#/components/parameters/until' - $ref: '#/components/parameters/search' - $ref: '#/components/parameters/call_direction' - $ref: '#/components/parameters/number' - $ref: '#/components/parameters/tags' - $ref: '#/components/parameters/user_uuid' - $ref: '#/components/parameters/from_id' - $ref: '#/components/parameters/recurse' - $ref: '#/components/parameters/tenantuuid' - $ref: '#/components/parameters/email' responses: '202': description: Creation of multiple recording media export started content: application/json: schema: type: object properties: export_uuid: type: string '404': $ref: '#/components/responses/NotFoundError' requestBody: content: application/json: schema: type: object properties: cdr_ids: type: array items: type: string description: The CDR IDs list from which to create an export /cdr/{cdr_id}: get: summary: Get a CDR by ID description: '**Required ACL:** `call-logd.cdr.{cdr_id}.read`' tags: - cdr parameters: - $ref: '#/components/parameters/cdr_id' responses: '200': description: Get a CDR by ID content: application/json: schema: $ref: '#/components/schemas/CDR' text/csv; charset=utf-8: schema: $ref: '#/components/schemas/CDR' '404': $ref: '#/components/responses/NotFoundError' /cdr/{cdr_id}/recordings/{recording_uuid}/media: get: summary: Get a recording media description: '**Required ACL:** `call-logd.cdr.{cdr_id}.recordings.{recording_uuid}.media.read` This endpoint allow to use `?token={token_uuid}` and `?tenant={tenant_uuid}` query string to bypass headers ' tags: - cdr parameters: - $ref: '#/components/parameters/cdr_id' - $ref: '#/components/parameters/recording_uuid' - name: Range description: 'Header requesting a chunk of media to be streamed (e.g: bytes=0-1023 to request the first 1024 bytes) ' required: false in: header schema: type: string pattern: ^bytes=[0-9]+-[0-9]*$ responses: '200': description: Get a recording media '206': description: Partial chunk (stream) of a recording media (specified by Range header) '404': $ref: '#/components/responses/NotFoundError' '416': description: The requested Range is not satisfiable by the server (invalid value) delete: summary: Delete a recording media description: '**Required ACL:** `call-logd.cdr.{cdr_id}.recordings.{recording_uuid}.media.delete`' tags: - cdr parameters: - $ref: '#/components/parameters/cdr_id' - $ref: '#/components/parameters/recording_uuid' responses: '204': description: The recording was deleted successfully '404': $ref: '#/components/responses/NotFoundError' /users/{user_uuid}/cdr: get: summary: List CDR of the given user description: '**Required ACL:** `call-logd.users.{user_uuid}.cdr.read` This endpoint allow to use `?token={token_uuid}` and `?tenant={tenant_uuid}` query string to bypass headers ' tags: - cdr parameters: - name: user_uuid description: UUID of the given user required: true in: path schema: type: string - $ref: '#/components/parameters/from' - $ref: '#/components/parameters/until' - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/order' - $ref: '#/components/parameters/direction' - $ref: '#/components/parameters/search' - $ref: '#/components/parameters/call_direction' - $ref: '#/components/parameters/number' - $ref: '#/components/parameters/from_id' - $ref: '#/components/parameters/distinct' - $ref: '#/components/parameters/recorded' - $ref: '#/components/parameters/format' - $ref: '#/components/parameters/conversation_id' - $ref: '#/components/parameters/call_status' - $ref: '#/components/parameters/requested_internal_extension' - $ref: '#/components/parameters/requested_internal_context' responses: '200': description: List CDR content: application/json: schema: $ref: '#/components/schemas/CDRList' text/csv; charset=utf-8: schema: $ref: '#/components/schemas/CDRList' '400': $ref: '#/components/responses/InvalidRequest' /users/me/cdr: get: summary: List CDR of the authenticated user description: '**Required ACL:** `call-logd.users.me.cdr.read` This endpoint allow to use `?token={token_uuid}` and `?tenant={tenant_uuid}` query string to bypass headers ' tags: - cdr parameters: - $ref: '#/components/parameters/from' - $ref: '#/components/parameters/until' - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/order' - $ref: '#/components/parameters/direction' - $ref: '#/components/parameters/search' - $ref: '#/components/parameters/call_direction' - $ref: '#/components/parameters/number' - $ref: '#/components/parameters/from_id' - $ref: '#/components/parameters/user_uuid' - $ref: '#/components/parameters/distinct' - $ref: '#/components/parameters/recorded' - $ref: '#/components/parameters/format' - $ref: '#/components/parameters/conversation_id' - $ref: '#/components/parameters/call_status' - $ref: '#/components/parameters/requested_internal_extension' - $ref: '#/components/parameters/requested_internal_context' responses: '200': description: List CDR content: application/json: schema: $ref: '#/components/schemas/CDRList' text/csv; charset=utf-8: schema: $ref: '#/components/schemas/CDRList' '400': $ref: '#/components/responses/InvalidRequest' /users/me/cdr/{cdr_id}/recordings/{recording_uuid}/media: get: summary: Get a recording media from a user description: '**Required ACL:** `call-logd.users.me.cdr.{cdr_id}.recordings.{recording_uuid}.media.read` ' tags: - cdr parameters: - $ref: '#/components/parameters/cdr_id' - $ref: '#/components/parameters/recording_uuid' - name: Range description: 'Header requesting a chunk of media to be streamed (e.g: bytes=0-1023 to request the first 1024 bytes) ' required: false in: header schema: type: string pattern: ^bytes=[0-9]+-[0-9]*$ responses: '200': description: Get a recording media '206': description: Partial chunk (stream) of a recording media (specified by Range header) '404': $ref: '#/components/responses/NotFoundError' '416': description: The requested Range is not satisfiable by the server (invalid value) components: responses: NotFoundError: description: The resource requested was not found on the server content: application/json: schema: $ref: '#/components/schemas/Error' InvalidRequest: description: Invalid request content: application/json: schema: $ref: '#/components/schemas/Error' parameters: call_status: name: call_status description: Filter by call statuses (comma-separated status strings). Defaults to non-blocked calls. required: false in: query schema: type: string enum: - answered - blocked - voicemail - unknown conversation_id: name: conversation_id description: Filter by conversation identifier required: false in: query schema: type: string tenantuuid: name: Wazo-Tenant in: header description: The tenant's UUID, defining the ownership of a given resource. required: false schema: type: string tags: required: false name: tags in: query description: Filter by tags. Each tag MUST be separated by a coma (,). Many tag will perform a logical AND. schema: type: array items: type: string requested_internal_extension: name: requested_internal_extension description: Filter by requested_internal_extension required: false in: query schema: type: string until: name: until description: Ignore CDR starting at or after the given date. Format is ISO-8601. in: query required: false schema: type: string format: date-time offset: required: false name: offset in: query description: Number of items to skip over in the list. Useful for pagination. schema: type: integer order: required: false name: order in: query description: 'Name of the field to use for sorting the list of items returned. Unsupported values: ``end``.' schema: type: string enum: - created_at - message_id from_id: name: from_id description: Ignore CDR created before the given CDR ID. in: query required: false schema: type: integer requested_internal_context: name: requested_internal_context description: Filter by requested_internal_context required: false in: query schema: type: string recorded: name: recorded description: Filter by recorded status. required: false in: query schema: type: boolean user_uuid: required: false name: user_uuid in: query description: Filter by user_uuid. Many uuid can be specified. Each uuid MUST be separated by a comma (,). Many uuid will perform a logical OR. schema: type: array items: type: string direction: required: false name: direction in: query description: Sort list of items in 'asc' (ascending) or 'desc' (descending) order schema: type: string enum: - asc - desc recurse: name: recurse in: query description: Should the query include sub-tenants required: false schema: type: boolean default: false from: name: from description: Ignore CDR starting before the given date. Format is ISO-8601. in: query required: false schema: type: string format: date-time cdr_id: name: cdr_id description: ID of the CDR required: true in: path schema: type: integer recording_uuid: name: recording_uuid description: UUID of the recording required: true in: path schema: type: string number: required: false name: number in: query description: Filter by source_extension and destination_extension. A wildcard (underscore) can be used at the start and/or the end of the number. schema: type: string search: required: false name: search in: query description: Filter list of items schema: type: string distinct: required: false name: distinct in: query description: Will only return one result for the selected field schema: type: string enum: - peer_exten email: name: email description: E-mail address in: query schema: type: string format: name: format description: Overrides the Content-Type header. This is used to be able to have a downloadable link. Allowed values are "csv" and "json" in: query required: false schema: type: string enum: - csv - json limit: required: false name: limit in: query description: Maximum number of items to return in the list. Default to 1000 if not specified. schema: type: integer call_direction: required: false name: call_direction in: query description: Filter list of items schema: type: string enum: - internal - inbound - outbound schemas: Recording: type: object properties: uuid: type: string start_time: type: string format: date-time end_time: type: string format: date-time deleted: type: boolean filename: type: string CDRList: type: object properties: items: type: array items: $ref: '#/components/schemas/CDR' total: type: integer filtered: type: integer call_status: type: string enum: - answered - blocked - voicemail - unknown CDR: type: object properties: id: type: integer start: type: string format: date-time answer: type: string format: date-time end: type: string format: date-time source_name: type: string source_extension: type: string source_internal_extension: type: string description: the internal extension of the line that placed the call source_internal_context: type: string source_internal_name: type: string source_internal_tenant_uuid: type: string source_user_uuid: type: string source_tenant_uuid: type: string source_line_id: type: integer requested_name: type: string description: name of the intended recipient as dialed requested_extension: type: string description: extension dialed by the caller requested_context: type: string description: dialplan context of the dialed extension requested_tenant_uuid: type: string requested_internal_extension: type: string description: internal extension of the first line to ring requested_internal_context: type: string description: internal context of the first line to ring requested_internal_tenant_uuid: type: string requested_user_uuid: type: string destination_details: type: object description: Contains the `type` of the called destination; which can be either `user`, `conference`, `meeting`, `group`, `voicemail` or `unknown` by default. Also contains useful information about the destination (`id` and `name`). A call that was redirected to a voicemail and not answered reports `type` `voicemail`, even when the call was originally placed to a user; the user remains available in `destination_user_uuid`. destination_name: type: string description: name of the party that answered the call destination_extension: type: string description: extension of the party that answered the call destination_internal_extension: type: string description: internal extension of the line that answered the call, or the first line to ring if unanswered destination_internal_context: type: string description: internal context of the line that answered the call, or the first line to ring if unanswered destination_internal_tenant_uuid: type: string destination_user_uuid: type: string destination_tenant_uuid: type: string destination_line_id: type: integer duration: type: integer description: Duration of the call, in seconds. answered: type: boolean call_direction: type: string enum: - inbound - internal - outbound conversation_id: type: string tags: type: array items: type: string recordings: type: array items: $ref: '#/components/schemas/Recording' call_status: $ref: '#/components/schemas/call_status' Error: title: Error description: Error message for the client properties: message: description: Human readable explanation of the error type: string error_id: description: Identifier of the type of error. It is more precise than the HTTP status code. type: string details: description: Additional information about the error. The keys are specific to each error. type: object timestamp: description: Time when the error occured type: number format: timestamp securitySchemes: wazo_auth_token: type: apiKey name: X-Auth-Token in: header x-xivo-port: 9298 x-xivo-name: call-logs x-apievangelist-source: harvested_from: https://github.com/wazo-platform/wazo-call-logd assembly: base plugin api.yml deep-merged with all plugin api.yml fragments, reproducing what the running service serves at /api/call-logd/1.0/api/api.yml (see wazo_call_logd/plugins/api/http.py — xivo.chain_map.ChainMap) spec_version: Swagger 2.0 (as published by Wazo) harvested: '2026-08-17'