PHPackages                             opencoreemr/oce-module-sinch-fax - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. opencoreemr/oce-module-sinch-fax

ActiveOpenemr-module[Utility &amp; Helpers](/categories/utility)

opencoreemr/oce-module-sinch-fax
================================

OpenEMR Sinch Fax integration module for secure fax sending and receiving, by OpenCoreEMR Inc

0.6.1(3mo ago)04.0k↑391.5%[18 issues](https://github.com/openCoreEMR/oce-module-sinch-fax/issues)[2 PRs](https://github.com/openCoreEMR/oce-module-sinch-fax/pulls)GPL-3.0-or-laterPHPPHP &gt;=8.2CI passing

Since Nov 18Pushed 1w agoCompare

[ Source](https://github.com/openCoreEMR/oce-module-sinch-fax)[ Packagist](https://packagist.org/packages/opencoreemr/oce-module-sinch-fax)[ Docs](https://opencoreemr.com)[ RSS](/packages/opencoreemr-oce-module-sinch-fax/feed)WikiDiscussions main Synced 3w ago

READMEChangelog (10)Dependencies (15)Versions (32)Used By (0)

OpenEMR Sinch Fax Module
========================

[](#openemr-sinch-fax-module)

A secure fax integration module for OpenEMR using the Sinch Fax API.

Features
--------

[](#features)

- **Send Faxes**: Send faxes to one or multiple recipients
- **Multiple File Formats**: Support for PDF, TIFF, PNG, JPEG, DOC, and DOCX
- **Security**: Encrypted storage of API credentials, secure file handling
- **Patient Integration**: Link faxes to patient records
- **Audit Trail**: Complete tracking of all fax activity

Requirements
------------

[](#requirements)

- OpenEMR 7.0.0 or later
- PHP 8.5 or later
- MySQL 5.7 or later / MariaDB 10.2 or later
- Sinch Fax account with API credentials

Installation
------------

[](#installation)

### Via Composer (Recommended)

[](#via-composer-recommended)

1. Navigate to your OpenEMR installation directory
2. Install the module via Composer:

    ```
    composer require opencoreemr/oce-module-sinch-fax
    ```
3. Log into OpenEMR as an administrator
4. Navigate to **Administration &gt; Modules &gt; Manage Modules**
5. Find "OpenCoreEMR Sinch Fax" in the list and click **Register**
6. Click **Install**
7. Click **Enable**

### Manual Installation

[](#manual-installation)

1. Download the latest release
2. Extract to `interface/modules/custom_modules/oce-module-sinch-fax` (relative to your OpenEMR root directory)
3. Follow steps 3-7 from the Composer installation

Configuration
-------------

[](#configuration)

The module supports three configuration modes with the following precedence (highest to lowest):

1. **Environment variables** — each `OCE_SINCH_FAX_*` variable overrides the corresponding setting
2. **YAML files** — for Kubernetes-style deployments with ConfigMap/Secret volumes
3. **Database (UI)** — the default; edit settings in **Administration &gt; Globals &gt; OpenCoreEMR Sinch Fax Module**

When file-based or environment configuration is active, the admin UI displays "Configuration Managed Externally" instead of editable fields.

### Configuration Settings

[](#configuration-settings)

#### General Settings (not sensitive)

[](#general-settings-not-sensitive)

SettingEnv VarDefaultDescriptionEnabled`OCE_SINCH_FAX_ENABLED``false`Enable the moduleProject ID`OCE_SINCH_FAX_PROJECT_ID`Sinch project ID (required)Service ID`OCE_SINCH_FAX_SERVICE_ID`Sinch service ID (optional, not required for fax)Auth Method`OCE_SINCH_FAX_AUTH_METHOD``basic`Authentication method (`basic`)Region`OCE_SINCH_FAX_REGION``global`API region (`global`, `use1`, `eu1`, `sae1`, `apse1`, `apse2`)File Storage Path`OCE_SINCH_FAX_FILE_STORAGE_PATH`Fax file storage directory (defaults to site documents)Default Retry Count`OCE_SINCH_FAX_DEFAULT_RETRY_COUNT``3`Number of send retriesWebhook Username`OCE_SINCH_FAX_WEBHOOK_USERNAME`HTTP Basic Auth username for incoming webhooksWebhook IP Allowlist`OCE_SINCH_FAX_WEBHOOK_IP_ALLOWLIST`Allowed IPs/CIDRs for webhooks (comma or newline-separated; empty allows all)#### Secrets (treat as sensitive)

[](#secrets-treat-as-sensitive)

SettingEnv VarDescriptionAPI Key`OCE_SINCH_FAX_API_KEY`Sinch API keyAPI Secret`OCE_SINCH_FAX_API_SECRET`Sinch API secretWebhook Password`OCE_SINCH_FAX_WEBHOOK_PASSWORD`HTTP Basic Auth password for incoming webhooks — should be a **bcrypt hash** (see below)In database mode, API Secret is encrypted at rest, and Webhook Password is automatically hashed on save. In file/environment modes, the deployment platform (e.g., Kubernetes Secrets) is responsible for protecting these values. **Webhook Password should be provided as a bcrypt hash** — the module will accept plaintext for development convenience, but plaintext passwords should never be used in production. Generate a hash with `htpasswd -nbBC 10 '' 'your-password' | cut -d: -f2` or any bcrypt tool.

### Mode 1: Database (Default)

[](#mode-1-database-default)

Navigate to **Administration &gt; Globals &gt; OpenCoreEMR Sinch Fax Module**, configure the settings, and save.

[![Configuration Settings](.docs/screenshots/configuration.png)](.docs/screenshots/configuration.png)

### Mode 2: YAML Files

[](#mode-2-yaml-files)

Mount YAML files at the conventional paths. The module auto-detects their presence — no activation flag needed.

PathPurposeK8s Source`/etc/oce/sinch-fax/config.yaml`General settingsConfigMap`/etc/oce/sinch-fax/secrets.yaml`SecretsSecretOverride paths with `OCE_SINCH_FAX_CONFIG_FILE` and `OCE_SINCH_FAX_SECRETS_FILE`.

**Example config.yaml:**

```
imports:
  - { resource: secrets.yaml }
enabled: true
project_id: "abc123"
region: global
default_retry_count: 3
auth_method: basic
webhook_username: "sinch"
```

**Example secrets.yaml:**

```
api_key: "your-api-key"
api_secret: "your-api-secret"
webhook_password: "$2y$10$..."  # bcrypt hash, not plaintext
```

Config files support Symfony-style `imports` for splitting across files (paths resolve relative to the importing file). Keys in the parent file override imported keys.

Even when using YAML files, any `OCE_SINCH_FAX_*` environment variable still takes precedence over the file value.

### Mode 3: Environment Variables Only

[](#mode-3-environment-variables-only)

Set `OCE_SINCH_FAX_ENV_CONFIG=1` to use pure environment variable configuration without YAML files. Then set each `OCE_SINCH_FAX_*` variable listed in the tables above.

Usage
-----

[](#usage)

### Accessing the Module

[](#accessing-the-module)

Once installed and configured, you can access the module from the **Modules** menu:

[![Module Menu](.docs/screenshots/module-menu.png)](.docs/screenshots/module-menu.png)

### Sending a Fax

[](#sending-a-fax)

The module supports the following file formats: **PDF, TIFF, PNG, JPEG, DOC, and DOCX**.

#### From Patient Documents (Recommended)

[](#from-patient-documents-recommended)

In real-world usage, you'll typically send faxes directly from a patient's document:

1. Navigate to a patient's **Documents** tab
2. Select the document you want to fax
3. Click the **Send Fax** button in the document viewer toolbar

[![Document Fax Button](.docs/screenshots/document-fax-button.png)](.docs/screenshots/document-fax-button.png)

4. In the Send Fax dialog, the document and patient are already pre-filled
5. Enter the recipient fax number in E.164 format (e.g., +12345678901)
6. Click **Send Fax**

[![Document Fax Dialog](.docs/screenshots/document-fax-dialog.png)](.docs/screenshots/document-fax-dialog.png)

#### From the Module Interface

[](#from-the-module-interface)

Alternatively, you can upload and send files directly:

1. Navigate to **Modules &gt; OpenCoreEMR Sinch Fax**
2. Click the **Send Fax** tab
3. Enter the recipient fax number(s)
4. Select or upload the file(s) to fax
5. Optionally link to a patient record
6. Click **Send Fax**

[![Send Fax Interface](.docs/screenshots/send-fax.png)](.docs/screenshots/send-fax.png)

Upon successful submission, you'll receive a fax ID that can be used to track the fax in progress.

> **Note:** The screenshots show demo data. Patient information displayed is for demonstration purposes only, and `+19898989898` is Sinch's demo fax number for testing.

### Receiving Faxes

[](#receiving-faxes)

Incoming faxes are automatically received via webhook and stored in the module:

1. Navigate to **Modules &gt; OpenCoreEMR Sinch Fax**
2. Click the **Fax List** tab to view all received faxes
3. Locate the received fax you want to assign to a patient
4. Click the **Move to Patient** button
5. Select the patient to associate the fax with

[![Fax List with Received Faxes](.docs/screenshots/fax-list-received.png)](.docs/screenshots/fax-list-received.png)

Once moved to a patient, the fax will:

- Appear in the patient's **Documents** tab under the **Received Faxes** category
- Remain visible in the Fax List but marked as **"Moved to Patient X"** in the Actions column
- Be managed like any other patient document in the patient's chart

[![Received Faxes in Patient Documents](.docs/screenshots/patient-documents-received-faxes.png)](.docs/screenshots/patient-documents-received-faxes.png)

### Viewing Faxes

[](#viewing-faxes)

1. Navigate to **Modules &gt; OpenCoreEMR Sinch Fax**
2. Click the **Fax List** tab to view all sent and received faxes
3. The list shows direction, fax ID, recipient/sender, status, pages, and timestamp

**Fax States:**

- **Unread** - New inbound faxes (highlighted with bold text)
- **Read** - Viewed faxes (outbound faxes default to read)
- **Archived** - Hidden from default view

**Filtering:**

- Filter by direction (Inbound/Outbound)
- Toggle "Show Archived" to include archived faxes

**Bulk Actions:**

- Select multiple faxes using checkboxes
- Mark as Read, Mark as Unread, or Archive in bulk

**Automatic Actions:**

- Faxes are automatically marked as read when downloaded/viewed
- Reconciliation runs on page load to detect any faxes missed by webhooks

[![Fax List](.docs/screenshots/fax-list.png)](.docs/screenshots/fax-list.png)

Security
--------

[](#security)

- **Credential protection**: In database mode, API Secret is encrypted at rest using OpenEMR's `CryptoGen`, and Webhook Password is stored as a bcrypt hash. In file/environment modes, protect secrets through your deployment platform (e.g., Kubernetes Secrets, sealed secrets, or vault injection).
- **Fax file storage**: Files are stored with restricted filesystem permissions.
- **Upload validation**: All uploaded files are validated before processing.
- **Webhook authentication**: Incoming webhooks are verified with HTTP Basic Auth and an optional IP allowlist (supports CIDR notation).
- **Audit trail**: All fax operations are logged for compliance.

Support
-------

[](#support)

- Email:
- Issues:

License
-------

[](#license)

GNU General Public License v3.0 or later

Credits
-------

[](#credits)

Developed by OpenCoreEMR Inc

###  Health Score

46

—

FairBetter than 92% of packages

Maintenance90

Actively maintained with recent releases

Popularity24

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 63.5% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~14 days

Total

8

Last Release

105d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/5e3711ec05d536a75786ee9918fef942a50379ca1c5e241a3755c097153a6e89?d=identicon)[michael@opencoreemr.com](/maintainers/michael@opencoreemr.com)

---

Top Contributors

[![kojiromike](https://avatars.githubusercontent.com/u/1566303?v=4)](https://github.com/kojiromike "kojiromike (80 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (33 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (9 commits)")[![oce-release-please[bot]](https://avatars.githubusercontent.com/u/206245971?v=4)](https://github.com/oce-release-please[bot] "oce-release-please[bot] (3 commits)")[![Copilot](https://avatars.githubusercontent.com/in/1143301?v=4)](https://github.com/Copilot "Copilot (1 commits)")

---

Tags

emrhealthcaremedicalopenemrsinchtelecommunicationsmodulehealthcarefaxsinchhipaaopenemr

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Rector

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/opencoreemr-oce-module-sinch-fax/health.svg)

```
[![Health](https://phpackages.com/badges/opencoreemr-oce-module-sinch-fax/health.svg)](https://phpackages.com/packages/opencoreemr-oce-module-sinch-fax)
```

###  Alternatives

[shopware/core

Shopware platform is the core for all Shopware ecommerce products.

585.4M519](/packages/shopware-core)[matomo/matomo

Matomo is the leading Free/Libre open analytics platform

21.6k38.2k](/packages/matomo-matomo)[drupal/core

Drupal is an open source content management platform powering millions of websites and applications.

19564.8M1.6k](/packages/drupal-core)[drupal/core-recommended

Locked core dependencies; require this project INSTEAD OF drupal/core.

6941.5M396](/packages/drupal-core-recommended)[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.5k5.8M712](/packages/sylius-sylius)[shopware/platform

The Shopware e-commerce core

3.4k1.5M3](/packages/shopware-platform)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
