openapi: 3.2.0 info: title: wazo-dird Personal API description: "Contacts and directories in Wazo are managed by the wazo-dird daemon. This service provides a public API that can be used to query the directories that are configured on a Wazo. \n\n\nA contact can contain various information such as a person's phone number, number, office number, department, office number, etc. The information displayed is selected via a profile. Directories can be aggregated using multiple data sources such as an LDAP server, a CSV file, another Wazo server, etc.\n\n\nPlease refer to [the documentation](https://wazo-platform.org/uc-doc) for further details.\n\n\nNote: The 0.1 API is currently in development. Major changes could still happen and new resources will be added over time." version: '0.1' license: name: GPL v3 url: http://www.gnu.org/licenses/gpl.txt 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: /0.1 security: - wazo_auth_token: [] tags: - name: personal paths: /directories/personal/{profile}: get: summary: List personal contacts with formatting description: '**Required ACL:** `dird.directories.personal.{profile}.read` Get the list of personal contacts formatted for the profile' operationId: list_personal_profile tags: - personal responses: '200': description: A list of contacts content: application/json: schema: $ref: '#/components/schemas/PhonebookContactList' '404': $ref: '#/components/responses/ProfileInvalid' '503': $ref: '#/components/responses/AnotherServiceUnavailable' parameters: - $ref: '#/components/parameters/tenantuuid' - $ref: '#/components/parameters/Profile' /personal: get: summary: List personal contacts operationId: list_personal description: '**Required ACL:** `dird.personal.read` CSV format is the same as `/import`, where headers of all contacts are mixed. The charset of the response is always `utf-8`. Errors are always formatted in JSON.' tags: - personal parameters: - name: format in: query required: false description: Format of the response body schema: type: string enum: - application/json - text/csv default: application/json - $ref: '#/components/parameters/order' - $ref: '#/components/parameters/direction' - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Offset' responses: '200': description: A list of personal contacts content: application/json: schema: properties: items: $ref: '#/components/schemas/PhonebookContactList' text/csv; charset=utf-8: schema: properties: items: $ref: '#/components/schemas/PhonebookContactList' '204': description: No contacts are available (CSV format only). '503': $ref: '#/components/responses/AnotherServiceUnavailable' post: summary: Create new personal contact description: '**Required ACL:** `dird.personal.create`' operationId: add_personal tags: - personal responses: '201': description: The new personal contact content: application/json: schema: $ref: '#/components/schemas/Contact' '409': $ref: '#/components/responses/DuplicateContact' '503': $ref: '#/components/responses/AnotherServiceUnavailable' requestBody: content: application/json: schema: $ref: '#/components/schemas/ContactBodySample' description: The attributes of the contact required: true delete: summary: Purge personal contacts description: '**Required ACL:** `dird.personal.delete`' operationId: purge_personal tags: - personal responses: '204': description: The personal contacts was purged. '503': $ref: '#/components/responses/AnotherServiceUnavailable' /personal/{contact_id}: get: summary: Get personal contact description: '**Required ACL:** `dird.personal.{contact_id}.read` Returns the details of the personal contact.' operationId: get_personal tags: - personal parameters: - $ref: '#/components/parameters/PersonalContactID' responses: '200': description: The personal contact attributes. content: application/json: schema: $ref: '#/components/schemas/Contact' '404': $ref: '#/components/responses/PersonalContactIDInvalid' '503': $ref: '#/components/responses/AnotherServiceUnavailable' put: summary: Edit personal contact description: '**Required ACL:** `dird.personal.{contact_id}.update` Replace personal contact''s attributes. Omitted attributes will be removed. Attribute `id` can not be changed.' operationId: edit_personal tags: - personal parameters: - $ref: '#/components/parameters/PersonalContactID' responses: '200': description: The personal contact was edited. content: application/json: schema: $ref: '#/components/schemas/Contact' '404': $ref: '#/components/responses/PersonalContactIDInvalid' '409': $ref: '#/components/responses/DuplicateContact' '503': $ref: '#/components/responses/AnotherServiceUnavailable' requestBody: content: application/json: schema: $ref: '#/components/schemas/ContactBodySample' description: The new attributes of the contact required: true delete: summary: Remove personal contact description: '**Required ACL:** `dird.personal.{contact_id}.delete`' operationId: remove_personal tags: - personal parameters: - $ref: '#/components/parameters/PersonalContactID' responses: '204': description: The personal contact was removed. '404': $ref: '#/components/responses/PersonalContactIDInvalid' '503': $ref: '#/components/responses/AnotherServiceUnavailable' /personal/import: post: summary: Import multiple personal contacts at once description: '**Required ACL:** `dird.personal.import.create`' operationId: import_personal tags: - personal responses: '201': description: At least one contact has been created. content: application/json: schema: $ref: '#/components/schemas/ContactImportResponse' '400': description: Input could not be decoded, and no contacts were created. content: application/json: schema: $ref: '#/components/schemas/LegacyError' '503': $ref: '#/components/responses/AnotherServiceUnavailable' requestBody: content: text/csv; charset=utf-8: schema: type: string text/csv; charset=iso8859-15: schema: type: string text/csv; charset=cp1252: schema: type: string description: 'The attributes of the contacts in CSV format. * The encoding must be set in the Content-Type header, via the `charset=` option. * Field delimiter: `,`. * Quoting character: `"`. * Line delimiter: `\r\n`.' required: true components: schemas: LegacyError: title: LegacyError description: Error message for the client properties: timestamp: description: Time at which the error occured type: array items: type: number format: timestamp reason: description: Human readable explanation of the error type: array items: type: string status_code: description: HTTP status code type: integer Contact: properties: column_values: items: type: string type: array relations: $ref: '#/components/schemas/Relation' source: type: string backend: type: string description: Backend type PhonebookContact: properties: id: type: string readOnly: true firstname: type: string lastname: type: string additionalProperties: type: string PhonebookContactList: type: array items: $ref: '#/components/schemas/PhonebookContact' ContactImportResponse: properties: created: type: array items: type: object failed: type: array items: $ref: '#/components/schemas/ContactImportFailure' ContactImportFailure: properties: line: type: integer errors: type: array items: type: string ContactBodySample: description: Those are only example attributes. The API accepts any arbitrary attributes. properties: firstname: type: string lastname: type: string Relation: properties: xivo_id: type: string user_id: type: string user_uuid: type: string endpoint_id: type: string agent_id: type: string source_entry_id: type: string responses: AnotherServiceUnavailable: description: Another service is unavailable (e.g. wazo-auth, postgresql, ...) content: application/json: schema: $ref: '#/components/schemas/LegacyError' ProfileInvalid: description: The profile does not exist content: application/json: schema: $ref: '#/components/schemas/LegacyError' DuplicateContact: description: This contact already exists content: application/json: schema: $ref: '#/components/schemas/LegacyError' PersonalContactIDInvalid: description: The personal contact does not exist content: application/json: schema: $ref: '#/components/schemas/LegacyError' parameters: tenantuuid: name: Wazo-Tenant in: header description: The tenant's UUID, defining the ownership of a given resource. required: false schema: type: string Offset: name: offset in: query description: The offset defines the number of items of the collection to skip required: false schema: type: integer default: 0 Profile: name: profile in: path description: The profile defines the list of directories to query and how the results are displayed. The profile is the context name of the user who started the contact lookup, e.g. `default`. More precisely, it is the name of the "Direct directory" defined in the web interface. required: true schema: type: string PersonalContactID: name: contact_id in: path required: true description: The ID of the personal contact. schema: type: string order: required: false name: order in: query description: Name of the field to use for sorting the list of items returned. schema: type: string Limit: name: limit in: query description: The limit defines the number of individual objects that are returned required: false schema: type: integer 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 securitySchemes: wazo_auth_token: type: apiKey name: X-Auth-Token in: header x-xivo-port: 9489 x-xivo-name: dird x-apievangelist-source: harvested_from: https://github.com/wazo-platform/wazo-dird assembly: base plugin api.yml deep-merged with all plugin api.yml fragments, reproducing what the running service serves at /api/dird/0.1/api/api.yml (see wazo_dird/plugins/api/http.py — xivo.chain_map.ChainMap) spec_version: Swagger 2.0 (as published by Wazo) harvested: '2026-08-17'