Wazo Authentication API (wazo-auth)

Authentication and authorisation service for the Wazo Platform. Issues and validates X-Auth-Token tokens (username/password, LDAP, SAML and external identity providers including Google, Microsoft and mobile push), and manages tenants, users, groups, sessions, refresh tokens, policies and fine-grained ACL access rules that every other Wazo service enforces.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/wazo-authentication-api-wazo-auth"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

wazo-auth-api-openapi.yml Raw ↑
swagger: '2.0'
info:
  version: '0.1'
  title: wazo-auth
  description: Wazo's authentication service
  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
x-xivo-port: 9497
x-xivo-name: auth
basePath: /0.1
schemes:
- http
consumes:
- application/json
produces:
- application/json
securityDefinitions:
  wazo_auth_basic:
    type: basic
  wazo_auth_token:
    type: apiKey
    name: X-Auth-Token
    in: header
parameters:
  direction:
    required: false
    name: direction
    in: query
    type: string
    enum:
    - asc
    - desc
    description: Sort list of items in 'asc' (ascending) or 'desc' (descending) order
  limit:
    name: limit
    in: query
    type: integer
    description: The limit defines the number of individual objects that are returned
    required: false
  offset:
    name: offset
    in: query
    type: integer
    description: The offset defines the offsets the start by the number specified
    default: 0
    required: false
  order:
    required: false
    name: order
    in: query
    type: string
    description: Name of the field to use for sorting the list of items returned.
  recurse:
    name: recurse
    in: query
    type: boolean
    description: Should the query include sub-tenants
    default: false
    required: false
  search:
    required: false
    name: search
    in: query
    type: string
    description: Search term for filtering a list of items. Only items with a field containing the search term will be returned.
  tenantuuid:
    name: Wazo-Tenant
    type: string
    in: header
    description: The tenant's UUID, defining the ownership of a given resource.
    required: false
  ConfigPatch:
    name: ConfigPatch
    in: body
    required: true
    description: See https://en.wikipedia.org/wiki/JSON_Patch.
    schema:
      type: array
      items:
        $ref: '#/definitions/ConfigPatchItem'
  email_uuid:
    name: email_uuid
    in: path
    type: string
    description: The UUID of the email
    required: true
  email_confirm_token:
    name: token
    in: query
    type: string
    description: The UUID of the token used to confirm the email address
    required: true
  auth_type:
    name: auth_type
    in: path
    type: string
    description: External auth type name
    required: true
  group_uuid:
    name: group_uuid
    in: path
    type: string
    description: The UUID of the group
    required: true
  search_uuid:
    name: uuid
    in: query
    type: string
    description: The UUID of the group
    required: false
  search_name:
    name: name
    in: query
    type: string
    description: The name of the group
    required: false
  search_user_uuid:
    name: user_uuid
    in: query
    type: string
    description: The UUID of the user
    required: false
  search_read_only:
    name: read_only
    in: query
    type: string
    description: Is the group managed by the system?
    required: false
  search_policy_uuid:
    name: policy_uuid
    in: query
    type: string
    description: The UUID of the policy that the group must have.
  search_policy_slug:
    name: policy_slug
    in: query
    type: string
    description: The slug of the policy that the group must have.
  idp_type:
    name: idp_type
    in: path
    type: string
    description: The type of IDP
    required: true
  policy_uuid:
    name: policy_uuid
    in: path
    type: string
    description: The UUID or slug of the policy. The slug is unique within a tenant, hence the tenant must be specified.
    required: true
  access:
    name: access
    in: path
    type: string
    description: The access to add
    required: true
  session_uuid:
    name: session_uuid
    in: path
    type: string
    description: The UUID of the session
    required: true
  tenant_uuid:
    name: tenant_uuid
    in: path
    type: string
    description: The UUID of the tenant
    required: true
  parent_tenant_uuid:
    name: parent_tenant_uuid
    in: path
    type: string
    description: The UUID of the new parent tenant
    required: true
  scope:
    name: scope
    in: query
    type: string
    description: The required ACL
    required: false
  tenant:
    name: tenant
    in: query
    type: string
    description: A tenant UUID to check against
    required: false
  token:
    name: token
    in: path
    type: string
    description: The token to query
    required: true
  wazo_session_type:
    name: Wazo-Session-Type
    in: header
    type: string
    description: The session type
    required: false
    enum:
    - mobile
    - desktop
  user_uuid_or_me:
    name: user_uuid_or_me
    in: path
    type: string
    description: The UUID of the user or `me` to refer to the user doing the query
    required: true
  client_id:
    name: client_id
    in: path
    type: string
    description: The client_id of the refresh token to revoke
    required: true
  user_uuid:
    name: user_uuid
    in: path
    type: string
    description: The UUID of the user
    required: true
  has_policy_uuid:
    name: has_policy_uuid
    in: query
    type: string
    description: The UUID of the policy that the user must have. This includes indirect associations (user in group has policy).
  has_policy_slug:
    name: has_policy_slug
    in: query
    type: string
    description: The slug of the policy that the user must have. This includes indirect associations (user in group has policy).
definitions:
  APIError:
    type: object
    properties:
      timestamp:
        type: number
      message:
        type: string
      resource:
        type: string
      details:
        type: object
  Error:
    type: object
    properties:
      reason:
        type: array
        items:
          type: string
      timestamp:
        type: array
        items:
          type: string
      status_code:
        type: integer
  GoogleGetResult:
    type: object
    properties:
      access_token:
        type: string
        description: Google token
      scope:
        type: string
        description: Scope permissions given to the `access token`
      token_expiration:
        type: integer
        description: Token expiration
    required:
    - access_token
    - scope
    - token_expiration
  GooglePost:
    type: object
    properties:
      scope:
        description: Scope permissions requested
        type: array
        items:
          type: string
        default:
        - https://www.googleapis.com/auth/userinfo.profile
        - https://www.googleapis.com/auth/contacts
  GooglePostResult:
    type: object
    required:
    - verification_url
    properties:
      verification_url:
        type: string
        description: The URL to confirm the authorization
  MicrosoftGetResult:
    type: object
    properties:
      access_token:
        type: string
        description: Microsoft token
      scope:
        type: string
        description: Scope permissions given to the `access token`
      token_expiration:
        type: integer
        description: Token expiration
    required:
    - access_token
    - scope
    - token_expiration
  MicrosoftPost:
    type: object
    properties:
      scope:
        description: Scope permissions requested
        type: array
        items:
          type: string
        default:
        - offline_access
        - Contacts.Read
  MicrosoftPostResult:
    type: object
    required:
    - verification_url
    properties:
      verification_url:
        type: string
        description: The URL to confirm the authorization
  MobileData:
    type: object
    properties:
      token:
        type: string
        description: FCM token
      apns_token:
        type: string
        description: APNs VoIP device token. This field is deprecated and will be removed in a later version.
      apns_notification_token:
        type: string
        description: APNs text alert notification device token.
      apns_voip_token:
        type: string
        description: APNs VoIP device token.
      apns_call_topic:
        type: string
        description: APNs topic for VoIP call notifications (e.g. com.example.app.voip). When set, overrides the server-wide
          mobile_apns_call_topic configuration.
      apns_default_topic:
        type: string
        description: APNs topic for non-call notifications such as messages, voicemails, and missed calls (e.g. com.example.app).
          When set, overrides the server-wide mobile_apns_default_topic configuration.
  BackendList:
    type: object
    properties:
      data:
        type: array
        items:
          type: string
  ConfigPatchItem:
    properties:
      op:
        type: string
        description: 'Patch operation. Supported operations: `replace`.'
      path:
        type: string
        description: 'JSON path to operate on. Supported paths: `/debug`.'
      value:
        type: object
        description: The new value for the operation. Type of value is dependent of `path`
  ExternalAuthList:
    type: object
    properties:
      total:
        type: integer
        description: The number of external auth.
      filtered:
        type: integer
        description: The number of external auth matching the searched term.
      items:
        type: array
        items:
          $ref: '#/definitions/ExternalAuth'
        description: A paginated list of external auth
    required:
    - filtered
    - total
    - items
  ExternalAuth:
    type: object
    properties:
      type:
        type: string
        description: The external auth type name
      enabled:
        type: boolean
      data:
        type: object
      plugin_info:
        type: object
  ExternalAuthUser:
    type: object
    properties:
      uuid:
        type: string
        format: uuid
  ExternalAuthUserList:
    type: object
    properties:
      total:
        type: integer
        description: The number of connected external auth users.
        example: 3
      filtered:
        type: integer
        description: The number of external auth matching the searched term.
        example: 3
      items:
        type: array
        items:
          $ref: '#/definitions/ExternalAuthUser'
        description: A paginated list of connected external auth users
        example:
        - user_uuid: 210ef281-4201-4f95-952f-5f8d5211e085
        - user_uuid: 28e6f253-a19d-458d-8b52-2ba6feb788bc
        - user_uuid: e72fe53d-3981-4c51-a488-e06ca94fcbb1
    required:
    - filtered
    - total
    - items
  ExternalConfig:
    type: object
    properties:
      client_id:
        description: 'Client ID for the given authentication type.

          Required only for `google` and `microsoft` authentication types.

          '
        type: string
        example: a-client-id
      client_secret:
        description: 'Client secret for the given authentication type.

          Required only for `google` and `microsoft` authentication types.

          '
        type: string
        example: a-client-secret
      ios_apn_certificate:
        description: Public certificate to use for Apple Push Notification Service
        type: string
      ios_apn_private:
        description: Private key to use for Apple Push Notification Service
        type: boolean
      use_sandbox:
        description: Whether to use sandbox for Apple Push Notification Service
        type: boolean
      fcm_sender_id:
        description: The sender ID to use for Firebase Cloud Messaging
        type: string
      fcm_api_key:
        description: (deprecated) The API key to use for Firebase Cloud Messaging (legacy)
        type: string
      fcm_service_account_info:
        description: 'The service account info file to use for Firebase Cloud Messaging (v1). The

          content must be a JSON-encoded string.

          '
        type: string
  GetGroupsResult:
    type: object
    properties:
      total:
        type: integer
        description: The number of groups.
      filtered:
        type: integer
        description: The number of groups matching the searched term.
      items:
        type: array
        items:
          $ref: '#/definitions/GroupResult'
        description: A paginated list of groups
    required:
    - filtered
    - total
    - items
  Group:
    type: object
    properties:
      name:
        type: string
      slug:
        type: string
        default: <name>
    required:
    - name
  GroupPut:
    type: object
    properties:
      name:
        type: string
    required:
    - name
  GroupResult:
    type: object
    properties:
      uuid:
        type: string
      name:
        type: string
      slug:
        type: string
      tenant_uuid:
        type: string
      system_managed:
        type: boolean
        description: '*Deprecated* Please use `read_only`'
      read_only:
        type: boolean
  IDPList:
    type: object
    properties:
      total:
        type: integer
        description: The number of identity provider types
      filtered:
        type: integer
        description: The number of identity provider types matching the searched term
      items:
        type: array
        items:
          $ref: '#/definitions/IDP'
        description: A paginated list of authentication methods
  IDPUsers:
    properties:
      users:
        items:
          $ref: '#/definitions/IDPUser'
        type: array
    required:
    - users
  IDPUser:
    properties:
      uuid:
        type: string
    required:
    - uuid
  IDP:
    type: object
    properties:
      type:
        type: string
        description: The type of identity provider
  LDAPBackendConfig:
    type: object
    required:
    - host
    - port
    - user_base_dn
    - user_login_attribute
    - user_email_attribute
    properties:
      tenant_uuid:
        type: string
        readOnly: true
      host:
        type: string
        description: 'The host or IP address of the LDAP server.

          '
      port:
        type: integer
        description: The port on which to connect to the LDAP server.
        example: 389
      protocol_version:
        type: integer
        minimum: 2
        maximum: 3
        description: LDAP protocol version to use
        default: 3
      protocol_security:
        type: string
        description: The layer of security to use for the connection.
        enum:
        - ''
        - tls
        - ldaps
        default: ''
      bind_dn:
        type: string
        description: 'The DN to use to bind the `wazo-auth` service to the LDAP server. If

          unspecified, `wazo-auth` will not bind with a service user but only with the

          final user account. For this to work though, your users will need to have the

          right to read their own information, particularly their email address.

          '
        example: CN=wazo-auth,DC=wazo-platform,DC=org
      user_base_dn:
        type: string
        description: The base DN in which users are located
        example: OU=people,DC=wazo-platform,DC=org
      user_login_attribute:
        type: string
        description: 'The attribute that identifies users. It will be prepended to the

          `user_base_dn`.

          '
        example: uid
      user_email_attribute:
        type: string
        description: The attribute of the email address in the LDAP schema.
        example: mail
      search_filters:
        type: string
        description: 'Filters for finding a user DN given a service bind is used.

          Available variables are `username`, `user_login_attribute` and

          `user_email_attribute`. These variables come from the fields of the

          same name from the API.

          '
        example: '{user_login_attribute}={username}'
  LDAPBackendConfigEdit:
    allOf:
    - $ref: '#/definitions/LDAPBackendConfig'
    - type: object
      properties:
        bind_password:
          type: string
          description: 'The password to use to bind the `wazo-auth` service to the LDAP server.

            '
  PostPasswordReset:
    type: object
    properties:
      password:
        type: string
        description: The desired password
    required:
    - password
  Policy:
    type: object
    properties:
      name:
        type: string
      slug:
        type: string
        description: A unique, human readable identifier for this policy
      description:
        type: string
      acl:
        type: array
        items:
          type: string
      shared:
        type: boolean
        description: 'Should be shared to sub-tenants or not. Cannot be changed after creation


          When shared is `true`, then all tenants below this policy''s tenant

          will see it as their own policy with the attribute `read_only: true`.


          Using `shared` attribute will add uniqueness constraints for the slug

          among all policies'' sub-tenants.

          '
    required:
    - name
  PolicyResult:
    type: object
    allOf:
    - $ref: '#/definitions/Policy'
    - properties:
        uuid:
          type: string
        read_only:
          type: boolean
  GetPoliciesResult:
    type: object
    properties:
      total:
        type: integer
        description: The number of policies matching the searched term
      items:
        type: array
        items:
          $ref: '#/definitions/PolicyResult'
        description: A paginated list of policies
    required:
    - total
    - items
  SAMLIdpResponse:
    properties:
      SAMLResponse:
        description: Encoded SAML XML response
        type: string
      RelayState:
        description: Relay state parameter
        type: string
    required:
    - SAMLResponse
    - RelayState
    type: object
  SAMLSSOResponse:
    type: object
    properties:
      location:
        description: 'The URL that the client should open to complete the authentication

          request

          '
        type: string
      saml_session_id:
        type: string
        description: 'The saml_session_id needs to be used to create a wazo-auth token

          once the SAML authentication has been completed successfully

          '
  SAMLLoginContext:
    properties:
      redirect_url:
        description: Where to redirect the browser once the login succeeded
        type: string
      domain:
        description: The domain name of the tenant
        type: string
    required:
    - redirect_url
    - domain
    type: object
  SAMLLogoutRequest:
    type: object
    properties:
      location:
        description: 'The URL that the client should open to complete the logout.

          '
        type: string
  SAMLBackendConfig:
    properties:
      domain_uuid:
        type: string
        description: The UUID of the domain to use for the SAML backend.
      entity_id:
        type: string
        description: The name of the SAML Entity Id
      acs_url:
        type: string
        description: The SAML ACS URL
        format: uri
    required:
    - domain_uuid
    - entity_id
    - acs_url
    type: object
  SAMLAcsUrlTemplate:
    properties:
      acs_url:
        type: string
        description: The SAML ACS URL
        format: uri
    required:
    - acs_url
    type: object
  GetSessionsResult:
    type: object
    properties:
      total:
        type: integer
        description: The number of sessions.
      filtered:
        type: integer
        description: The number of sessions matching the searched term.
      items:
        type: array
        items:
          $ref: '#/definitions/SessionResult'
        description: A paginated list of sessions
    required:
    - filtered
    - total
    - items
  SessionResult:
    type: object
    properties:
      uuid:
        type: string
      user_uuid:
        type: string
      tenant_uuid:
        type: string
      mobile:
        type: boolean
  TenantPostResponse:
    type: object
    properties:
      name:
        type: string
      uuid:
        type: string
      parent_uuid:
        type: string
  TenantList:
    type: object
    properties:
      total:
        type: integer
        description: The number of tenants
      filtered:
        type: integer
        description: The number of tenants matching the searched term
      items:
        type: array
        items:
          $ref: '#/definitions/TenantResult'
        description: A paginated list of tenants
  TenantBase:
    type: object
    properties:
      name:
        type: string
        description: The tenant's name
      contact:
        type: string
        description: The contact user's UUID
      phone:
        type: string
        description: The tenant's contact phone number
      domain_names:
        type: array
        description: A list containing human readeable unique domain names, associated with a specific tenant
        uniqueItems: true
        items:
          type: string
      address:
        $ref: '#/definitions/TenantAddress'
      default_authentication_method:
        type: string
        description: 'The `default_authentication_method` defines the authentication method that

          is going to be used for users using the `authentication_method` `default`.

          '
        default: native
        enum:
        - native
        - saml
        - ldap
  TenantResult:
    type: object
    allOf:
    - $ref: '#/definitions/TenantBase'
    - properties:
        uuid:
          type: string
        slug:
          type: string
          description: A unique, human readeable identifier for this tenant
  TenantCreate:
    type: object
    allOf:
    - $ref: '#/definitions/TenantBase'
    - properties:
        uuid:
          type: string
          description: The tenant's UUID
        slug:
          type: string
          description: A unique, human readeable identifier for this tenant. This field cannot be modified and will be auto-generated
            if missing.
  TenantEdit:
    type: object
    allOf:
    - $ref: '#/definitions/TenantBase'
  TenantAddress:
    type: object
    properties:
      line_1:
        type: string
        description: The first line of the address
      line_2:
        type: string
        description: The second line of the address
      city:
        type: string
      state:
        type: string
      country:
        type: string
      zip_code:
        type: string
  TenantDomainsList:
    type: object
    properties:
      total:
        type: integer
        description: The number of domains
      items:
        type: array
        items:
          type: object
          properties:
            name:
              type: string
            uuid:
              type: string
        description: A non-paginated list of domains
  RefreshToken:
    type: object
    properties:
      client_id:
        type: string
        description: The `client_id` that was used to create this refresh token
      created_at:
        type: string
        description: The time at which this token was created
      mobile:
        type: boolean
        description: Indicate if that refresh token was created with a mobile session type
      user_uuid:
        type: string
        description: The UUID of the user which created this refresh token
      tenant_uuid:
        type: string
        description: The tenant UUID of the user which created this refresh token
      metadata:
        type: object
        description: the persistent metadata tied to this refresh token
  RefreshTokenList:
    type: object
    properties:
      total:
        type: integer
        description: The number of refresh tokens for that user
      filtered:
        type: integer
        description: The number of refresh token matching the searched terms
      items:
        type: array
        items:
          $ref: '#/definitions/RefreshToken'
        description: A paginated list of refresh tokens
  ScopeCheckRequest:
    type: object
    properties:
      tenant_uuid:
        type: string
        format: uuid
        description: If provided, also checks the token against this tenant
      scopes:
        type: array
        description: Scopes to check against
        items:
          type: string
    required:
    - scopes
  Token:
    type: object
    properties:
      data:
        type: object
        properties:
          metadata:
            type: object
            description: Information owned by wazo-auth about this user
          token:
            type: string
          expires_at:
            type: string
          utc_expires_at:
            type: string
          issued_at:
            type: string
          utc_issued_at:
            type: string
          auth_id:
            type: string
            description: The unique identifier retrieved from the backend
          xivo_user_uuid:
            type: string
            description: 'The UUID of the matching wazo-confd user if there is one. This

              field can be null.


              This field should NOT be used anymore, the "pbx_user_uuid" in the

              metadata field is the prefered method to access this information.

              '
          xivo_uuid:
            type: string
          acl:
            type: array
            items:
              type: string
            description: The list of allowed accesses for this token
          session_uuid:
            type: string
  ScopeList:
    type: object
    properties:
      scopes:
        type: array
        description: the scopes and their check result
        items:
          type: object
          description: 'JSON object with scopes as keys and boolean values whether the token is valid for the given scope,
            e.g. `{"confd.groups.create": true}`'
  AdminUserEmailList:
    type: object
    properties:
      emails:
        type: array
        items:
          type: object
          properties:
            address:
              type: string
            main:
              type: boolean
            confirmed:
              type: boolean
          required:
          - addresses
          - main
  UserEmailList:
    type: object
    properties:
      emails:
        type: array
        items:
          type: object
          properties:
            address:
              type: string
            main:
              type: boolean
          required:
          - addresses
          - main
  UserRegister:
    type: object
    properties:
      username:
        type: string
        description: The username that will identify that new username
      password:
        type: string
        description: The password of the newly created username
      firstname:
        type: string
        description: The user's firstname
      lastname:
        type: string
        description: The user's lastname
      email_address:
        type: string
        description: The main email address of the new username
    required:
    - username
    - password
    - email_address
  PasswordChange:
    type: object
    properties:
      old_password:
        type: string
        description: The old password
      new_password:
        type: string
        description: The desired password
    required:
    - old_password
    - new_password
  UserBase:
    type: object
    properties:
      username:
        type: string
        description: The username that will identify that new username
      firstname:
        type: string
        description: The user's firstname
      lastname:
        type: string
        description: The user's lastname
      enabled:
        type: boolean
      purpose:
        type: string
        default: user
        enum:
        - user
        - internal
        - external_api
      authentication_method:
        type: string
        default: default
        description: The authentication method allowed for this user. Using "default" will use the tenant's default_authentication_method
          value for this user.
        enum:
        - default
        - native
        - ldap
        - saml
  UserCreate:
    allOf:
    - $ref: '#/definitions/UserBase'
    - type: object
      properties:
        uuid:
          type: string
          description: The user's UUID
        password:
          type: string
          description: The password of the newly created username
        email_address:
          type: string
          description: The main email address of the new username
  UserEdit:
    allOf:
    - $ref: '#/definitions/UserBase'
  UserEmail:
    type: object
    properties:
      address:
        type: string
      main:
        type: boolean
      confirmed:
        type: boolean
  UserList:
    type: object
    properties:
      total:
        type: integer
        description: The number of users
      filtered:
        type: integer
        description: The number of users matching the searched term
      items:
        type: array
        items:
          $ref: '#/definitions/UserResult'
        description: A paginated list of users
  UserPostResponse:
    type: object
    properties:
      username:
        type: string
      emails:
        type: array
        items:
          $ref: '#/definitions/UserEmail'
      uuid:
        type: string
      purpose:
        type: string
        enum:
        - user
        - internal
        - external_api
      authentication_method:
        type: string
        default: default
        description: The authentication method allowed for this user. Using "default" will use the tenant's default_authentication_method
          value for this user.
        enum:
        - default
        - native
        - ldap
        - saml
  UserResult:
    type: object
    properties:
      uuid:
        type: string
      username:
        type: string
      firstname:
        type: string
      lastname:
        type: string
      purpose:
        type: string
        enum:
        - user
        - internal
        - external_api
      tenant_uuid:
        type: string
      emails:
        type: array
        items:
          $ref: '#/definitions/UserEmail'
      enabled:
        type: boolean
paths:
  /users/{user_uuid}/external/google:
    get:
      summary: Get a Google token
      description: '**Required ACL**: `auth.users.{user_uuid}.external.google.read`'
      tags:
      - users
      - google
      parameters:
      - $ref: '#/parameters/user_uuid'
      responses:
        '200':
          description: The auth data
          schema:
            $ref: '#/definitions/GoogleGetResult'
        '401':
          description: Unauthorized
          schema:
            $ref: '#/definitions/APIError'
        '404':
          description: Not found
          schema:
            $ref: '#/definitions/APIError'
    post:
      summary: Ask for a verification URL and store code to get token
      description: '**Required ACL**: `auth.users.{user_uuid}.external.google.create`.


        More info on Google permissions: https://developers.google.com/identity/protocols/googlescopes"

        '
      tags:
      - users
      - google
      parameters:
      - $ref: '#/parameters/user_uuid'
      - name: body
        in: body
        schema:
          $ref: '#/definitions/GooglePost'
      responses:
        '201':
          description: Authentication url
          schema:
            $ref: '#/definitions/GooglePostResult'
        '400':
          description: Invalid body
          schema:
            $ref: '#/definitions/APIError'
    delete:
      summary: Delete a Google token
      description: '**Required ACL**: `auth.users.{user_uuid}.external.google.delete`'
      tags:
      - users
      - google
      parameters:
      - $ref: '#/parameters/user_uuid'
      responses:
        '204':
          description: External authentication deleted
        '401':
          description: Unauthorized
          schema:
            $ref: '#/definitions/APIError'
        '404':
          description: Not found
          schema:
            $ref: '#/definitions/APIError'
  /users/{user_uuid}/external/microsoft:
    get:
      summary: Get a Microsoft token
      description: '**Required ACL**: `auth.users.{user_uuid}.external.microsoft.read`'
      tags:
      - users
      - microsoft
      parameters:
      - $ref: '#/parameters/user_uuid'
      responses:
        '200':
          description: The auth data
          schema:
            $ref: '#/definitions/MicrosoftGetResult'
        '401':
          description: Unauthorized
          schema:
            $ref: '#/definitions/APIError'
        '404':
          description: Not fo

# --- truncated at 32 KB (105 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/wazo/refs/heads/main/openapi/wazo-auth-api-openapi.yml