Syncs Zoom Phone users (grouped by department) into First Orion INFORM as Business Units, Programs, and registered phone numbers — enabling branded caller ID for outbound calls.
- Fetches all Zoom Phone users and their assigned numbers
- Groups users by department to build a desired First Orion state
- Diffs against the current FO state (Business Units, Programs, phone numbers)
- Creates/deletes Business Units, Programs, and number registrations to converge
go install github.com/CampusTech/zp2fo@latestOr build from source:
git clone https://github.com/CampusTech/zp2fo
cd zp2fo
go build -o zp2fo .Create a Server-to-Server OAuth app in the Zoom Marketplace:
- Scopes required:
phone:read:list_users,phone:read:list_numbers - Note the Account ID, Client ID, and Client Secret
Obtain from your First Orion account:
- API Key and Secret Key for authentication
- Business ID of your pre-existing FO Business entity
cp config.yaml.example ~/.zp2fo.yaml
$EDITOR ~/.zp2fo.yamlOr set credentials via environment variables (see Configuration below).
# Preview changes without writing anything
zp2fo sync --dry-run
# Apply
zp2fo syncSyncs Zoom Phone departments and numbers to First Orion.
zp2fo sync [flags]| Flag | Description |
|---|---|
--dry-run |
Print planned changes without writing to First Orion |
--debug |
Enable HTTP trace logging |
--limit N |
Limit sync to the first N users with phone numbers |
--phone-number E.164 |
Limit sync to the single user owning this number |
Lists all First Orion display name assets and their approval status (APPROVED, PENDING, REJECTED). Use this to find approved display_name_content_id values for your config.
zp2fo cleanupLinks Zoom phone numbers to First Orion branded calling programs via the Zoom CP API. Requires a short-lived JWT from an authenticated browser session at us01cp.zoom.us.
zp2fo link-branded --jwt <token> [--phone-number E.164]Prints a First Orion access token — useful for testing API calls with curl.
zp2fo tokenConfig is loaded from ~/.zp2fo.yaml by default. Override with --config path. All credential fields can be set via environment variable instead of the config file.
| Config key | Env var | Description |
|---|---|---|
zoom.account_id |
ZOOM_ACCOUNT_ID |
Zoom Server-to-Server OAuth account ID |
zoom.client_id |
ZOOM_CLIENT_ID |
Zoom OAuth client ID |
zoom.client_secret |
ZOOM_CLIENT_SECRET |
Zoom OAuth client secret |
first_orion.api_key |
FIRST_ORION_API_KEY |
First Orion API key |
first_orion.secret_key |
FIRST_ORION_SECRET_KEY |
First Orion secret key |
first_orion.business_id |
FIRST_ORION_BUSINESS_ID |
First Orion Business ID |
first_orion.brand_name |
FIRST_ORION_BRAND_NAME |
Brand name prefix for caller IDs |
first_orion.fallback_department |
FIRST_ORION_FALLBACK_DEPARTMENT |
Department for users with no Zoom department set |
See config.yaml.example for the full set of options including per-department overrides.
Logos and display name assets must be pre-approved by First Orion before use:
- Upload an SVG via the FO portal and wait for
APPROVEDstatus - Run
zp2fo cleanupto list assets and find thecontentId - Set
first_orion.image_content_id(global) or per-department in config
MIT