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'