---
title: Integrations
summary: 'A configured connection between your PBX and an external service: Microsoft 365 for user sync, Odoo for ERP-side SIP provisioning, Teams via SBC for Direct Routing, AI voice agents, badge systems.'
section: features
tags:
  - crud
  - telephony
  - integrations
  - external-services
updated: '2026-08-24'
related_forms:
  - microsoft_365_integration
  - odoo_integration
  - microsoft_teams_integration
  - profile_guesser_integration
  - famulor_integration
  - ai_realtime_integration
  - dsk_integration
  - tapi_integration
  - salary_lu_integration
---

> An **integration** is a configured connection between your PBX and an external service. It is mostly infrastructural plumbing and rarely affects inbound callers directly.

## Overview

This page covers **PBX-level** integrations only. Partner organizations have a separate,
unrelated Odoo CRM feature in the partner portal, which is not configured here and does not
appear in the table below.

Each integration has a **type** that sets which fields it needs and what it does. The type is chosen at creation and cannot be changed afterwards, so to switch you delete and recreate. Most types can be added more than once to connect to several instances, but TAPI, Famulor, and AI Realtime are limited to one per tenant. Each type links to its own guide below.

| Type | Connects to | Primary use |
|---|---|---|
| [**Microsoft 365**](microsoft_365_integration.md) | Microsoft Entra ID + Graph | Sync users (via SCIM) and contacts both directions. |
| [**Odoo**](odoo_integration.md) | Odoo ERP instance | Push PBX SIP credentials into Odoo's VoIP module. Not the same as partner-level Odoo CRM. |
| [**Microsoft Teams**](microsoft_teams_integration.md) | Teams via SBC (Direct Routing) | Let Teams users place/receive calls through your PBX. |
| [**Profile Guesser**](profile_guesser_integration.md) | External caller-lookup API | Surface incoming-caller name and company on the answering phone. |
| [**Famulor**](famulor_integration.md) | Famulor AI voice agent API | Powers [Famulor agents](famulor_agents.md). |
| [**AI realtime**](ai_realtime_integration.md) | OpenAI realtime voice API | Powers [Smart assistants](smart_assistants.md). |
| [**DSK**](dsk_integration.md) | DSK badge-reader / time-attendance | Sync employee badge events into [Tempus](../tempus/). |
| [**TAPI**](tapi_integration.md) | TAPI desktop CTI bridge | Click-to-dial with Windows TAPI applications. |
| [**Salary.lu**](salary_lu_integration.md) | Salary.lu HR system | Push Tempus time records to Salary.lu for payroll. |

## See also

- [Events](events.md) - where integration sync outcomes are logged.
- [Users](users.md) - the main entity provisioned via M365 integrations.
- [Smart assistants](smart_assistants.md), [Famulor agents](famulor_agents.md) - features that depend on AI integrations.
- [PBX settings](pbxes.md) - the tenant that owns each integration.

```yaml fields
type:
  label: Type
  tab: General
  hint: 'The type of external service to connect with. Cannot be changed after creation.'
is_active:
  label: 'Is active'
  tab: General
  hint: 'Controls whether this integration is active. For Microsoft integrations, admin consent must be granted first.'
microsoft_users_sync:
  label: 'Fetch Microsoft users to Cockpit'
  tab: 'Microsoft 365'
  hint: 'When turned on, users from Microsoft Entra are fetched and synchronized into the PBX as user accounts.'
  when: 'Type is Microsoft'
microsoft_contacts_sync:
  label: 'Push contacts to Microsoft'
  tab: 'Microsoft 365'
  hint: 'When turned on, PBX users with the "show in address book" flag are pushed to Microsoft as contacts for each user.'
  when: 'Type is Microsoft'
microsoft_user_contact_sync:
  label: 'Fetch contacts from Microsoft'
  tab: 'Microsoft 365'
  hint: 'When turned on, contacts from Microsoft are fetched into the PBX to represent each user.'
  when: 'Type is Microsoft'
serverUrl:
  label: 'Odoo URL'
  tab: Odoo
  hint: 'The URL of your Odoo instance (e.g. `https://mycompany.odoo.com`).'
  when: 'Type is Odoo'
dbName:
  label: 'Odoo database'
  tab: Odoo
  hint: 'The name of the Odoo database to connect to.'
  when: 'Type is Odoo'
login:
  label: 'Odoo username'
  tab: Odoo
  hint: 'The Odoo username used for API access.'
  when: 'Type is Odoo'
apiKey:
  label: 'Odoo API key'
  tab: Odoo
  hint: 'The API key generated in Odoo under your user settings. Do not use your password.'
  when: 'Type is Odoo'
sync_sip_configurations_to_odoo_voip:
  label: 'Sync SIP connection configurations to Odoo for all users?'
  tab: Odoo
  hint: 'When turned on, installs or updates the Odoo VoIP module and pushes SIP connection settings to Odoo for all PBX users.'
  when: 'Type is Odoo'
odoo_voip_websocket:
  label: 'Provider WebSocket'
  tab: Odoo
  hint: 'Read-only. The WebSocket URL generated automatically for the Odoo VoIP module.'
  when: 'Type is Odoo'
odoo_pbx_dns:
  label: 'Provider PBX server IP'
  tab: Odoo
  hint: 'Read-only. The PBX server IP address, derived from the server configuration.'
  when: 'Type is Odoo'
profile_guesser_url:
  label: 'Profile Guesser URL'
  tab: 'Profile Guesser'
  hint: 'The URL of the Profile Guesser API endpoint. Must be a POST endpoint that accepts a JSON payload with a phone_numbers array.'
  when: 'Type is Profile Guesser'
profile_guesser_access_token:
  label: 'Profile Guesser API key'
  tab: 'Profile Guesser'
  hint: 'The authentication token sent with each API request to the Profile Guesser endpoint.'
  when: 'Type is Profile Guesser'
teams_sbc_host:
  label: 'Teams SBC host'
  tab: 'Microsoft Teams'
  hint: 'The hostname or IP address of your Session Border Controller (SBC) for Teams Direct Routing.'
  when: 'Type is Microsoft Teams Direct Routing'
teams_sbc_port:
  label: 'Teams SBC port'
  tab: 'Microsoft Teams'
  hint: 'The SIP port on the SBC. Default is 5060. Valid range: 1 to 65535.'
  when: 'Type is Microsoft Teams Direct Routing'
famulor_strategy:
  label: 'API key strategy'
  tab: Famulor
  hint: 'Selects which Famulor account to use. Mixvoip uses the shared key. Customer uses the key you enter below.'
  when: 'Type is Famulor (AI Integration)'
famulor_api_key:
  label: 'Famulor API key'
  tab: Famulor
  hint: 'Required only when the strategy is set to Customer. Paste the API key from the Famulor dashboard.'
  when: 'API key strategy is Customer'
dsk_base_url:
  label: 'DSK base URL'
  tab: DSK
  hint: 'The base URL of your DSK instance, with no trailing slash (for example, `https://dsk.example.com`).'
  when: 'Type is DSK (Time & Attendance)'
dsk_api_user:
  label: 'DSK API user'
  tab: DSK
  hint: 'The username used to authenticate with the DSK API.'
  when: 'Type is DSK (Time & Attendance)'
dsk_api_password:
  label: 'DSK API password'
  tab: DSK
  hint: 'The password used to authenticate with the DSK API.'
  when: 'Type is DSK (Time & Attendance)'
dsk_bearer_token:
  label: 'DSK bearer token'
  tab: DSK
  hint: 'Read-only. Issued automatically by DSK when you save and refreshed as needed.'
  when: 'Type is DSK (Time & Attendance)'
base_url:
  label: 'Base URL'
  tab: Salary.lu
  hint: 'The base URL of the Salary.lu API endpoint.'
  when: 'Type is Salary.lu'
username:
  label: Username
  tab: Salary.lu
  hint: 'The username used to authenticate with Salary.lu.'
  when: 'Type is Salary.lu'
enable_custom_rules:
  label: 'Enable custom rules'
  tab: Salary.lu
  hint: 'When turned on, lets you define custom rules that add extra fields to each Salary.lu request.'
  when: 'Type is Salary.lu'
name:
  label: Name
  hint: 'A name to identify this integration in lists and logs.'
api_key:
  hint: 'The key value. Use it as the Bearer token when calling the API. Treat it like a password.'
api_key_scopes:
  label: Scopes
  hint: 'The API abilities this key is limited to. Grant only what the integration needs.'
api_key_expires_at:
  label: 'Expiration date'
  hint: 'When this key stops working. Leave empty for a key that never expires.'
rate_limit:
  hint: 'The maximum number of API requests per minute allowed for this key (set by your plan).'
last_used_at:
  hint: 'When this key was last used to call the API. Read-only.'
created_at:
  hint: 'When this key was created. Read-only.'
```
