📄 Device Output Format — Data String Reference

CallerID Device Output Format - CallerID.com

Print / Save PDF

CallerID Device Output Format

Technical Specification for Data Parsing

Document Version: 1.0

Last Updated: January 2025

Applies To: All Whozz Calling Devices

1. Overview

CallerID.com devices (Whozz Calling series) output call data in two distinct formats: Standard and Detailed. The Standard format provides complete call records with caller information, while the Detailed format provides real-time ring and hook events.

Supported Devices: Whozz Calling? Basic (2, 4, 8 line analog)

Whozz Calling? Deluxe (2, 4, 8 line analog with CNAM)

Whozz Calling? POS (2, 4, 8 line with serial output)

Vertex (2, 4, 8 line VoIP/SIP)

2. Standard Format

The Standard format contains complete call data including caller ID (CNAM), duration, and call direction.

Regular Expression Pattern

(\d\d) ([IO]) ([ESB]) (\d{4}) ([GB]) (.)(\d) (\d\d/\d\d \d\d:\d\d [AP]M) (.{15})(.*)

Example Output

01 I S 0000 G 1 01/05 10:45 AM 770-555-1234 JOHN SMITH

Field Breakdown

Position Field Name Length Values Description

1 Line 2 digits 01-24 Phone line number (important for multi-line routing)

2 I/O 1 char I, O I = Inbound call, O = Outbound call

3 Status 1 char S, E, B S = Start of call, E = End of call, B = Both (complete record)

4 Duration 4 digits 0000-9999 Call duration in seconds (0000 for start records)

5 Checksum 1 char G, B G = Good checksum, B = Bad checksum

6 Ring Type 1 char (varies) Distinctive ring pattern indicator

7 Rings 1 digit 0-9 Number of rings before answer/disconnect

8 Timestamp 14 chars MM/DD HH:MM AM/PM Date and time of call event

9 Phone 15 chars (padded) Phone number, right-padded with spaces (supports 15-digit international)

10 Name Variable (text) Caller name (CNAM) from carrier lookup

3. Detailed Format

The Detailed format provides real-time events for ring detection and hook state changes. Used for applications requiring immediate notification.

Regular Expression Pattern

(\d\d) ([NFR]) {13}(\d\d/\d\d \d\d:\d\d:\d\d)

Example Output

01 N 01/05 10:45:30

Field Breakdown

Position Field Name Length Values Description

1 Line 2 digits 01-24 Phone line number

2 Type 1 char N, F, R N = New call (off-hook), F = Forward/transfer, R = Ring event

3 Timestamp 17 chars MM/DD HH:MM:SS Date and time with seconds precision

4. Technical Notes

Important: The phone number field is exactly 15 characters wide to support international E.164 format numbers. Shorter numbers are right-padded with spaces.

Phone Number Formats

Format Example (Raw) Description

US Local (10 digit) 770-555-1234 Standard US number with 3 trailing spaces

US with Country (11 digit) 1-770-555-1234 US number with country code, 1 trailing space

International (15 digit) +44207946012345 Full E.164 international number, no padding

Blocked/Private P Private/blocked caller ID

Out of Area O Caller ID not available

Line Number Range

2-Line Units: Lines 01-02

4-Line Units: Lines 01-04

8-Line Units: Lines 01-08

Multi-Unit Stacks: Lines 01-24 (3 x 8-line units)

Status Field Usage

S (Start): Sent when call begins (phone answered or ringing detected)

E (End): Sent when call terminates (includes final duration)

B (Both): Complete record for short calls (contains all data in single record)

5. Sample Code (Python)

# CallerID data format parser # Matches Standard or Detailed format

import re

class CID: def __init__(self, inbound): # Define regex patterns self.standard_pattern = re.compile( r"(\d\d) ([IO]) ([ESB]) (\d{4}) ([GB]) (.)(\d) " r"(\d\d/\d\d \d\d:\d\d [AP]M) (.{15})(.*)" ) self.detailed_pattern = re.compile( r"(\d\d) ([NFR]) {13}\d\d/\d\d \d\d:\d\d:\d\d" ) # Try standard format first self.match = self.standard_pattern.search(inbound) if self.match: self.record_type = "Standard" self.line = int(self.match.group(1)) self.io = self.match.group(2) self.se = self.match.group(3) self.duration = int(self.match.group(4)) self.chksum = self.match.group(5) self.ring_type = self.match.group(6) self.rings = int(self.match.group(7)) self.time = self.match.group(8).strip() self.number = self.match.group(9).strip() self.name = self.match.group(10).strip() else: # Try detailed format self.match = self.detailed_pattern.search(inbound) if self.match: self.record_type = "Detailed" self.line = int(self.match.group(1)) self.type = self.match.group(2) else: self.record_type = None self.line = None

6. Integration Requirements

When integrating with CallerID.com devices, ensure your system can:

Parse both Standard and Detailed format records

Handle 15-character phone number fields with padding

Process international phone numbers (E.164 format)

Differentiate between inbound (I) and outbound (O) calls

Track call duration from Start/End record pairs

Handle special caller ID values (P=Private, O=Out of Area)

© 2025 CallerID.com. All rights reserved.

For technical support: Info@CallerID.com | 800-566-5678

© 2025 CallerID.com. All Rights Reserved.

Transport Independence and Current Device Family (added 09JUN26)

Document revision 1.1 — 09JUN26. The single most important fact for any integration: every current CallerID.com device emits the exact same plain-text Caller ID record, byte for byte. What changes from model to model is only how that record physically leaves the unit. There is no API to call, no keys, no polling, and no proprietary SDK — a listener just reads the fields straight out of the record.

Three transports, one record

  • Ethernet (UDP broadcast) — the record is pushed onto the LAN the instant a call event happens (fire-and-forget). Default source & destination port 3520 (configurable). A receiving app simply binds a UDP socket to port 3520 and listens — no authentication, session, or polling.
  • Serial (RS-232) — the byte-for-byte identical record out a DB9 port to a COM port on the receiving PC.
  • VoIP / SIP — the Vertex VoIP unit pulls the same record out of modern VoIP/SIP traffic and outputs it over its Ethernet management port (UDP) or serial.

Current device family

ModelLinesPhone connectionData outputCaptures
Whozz Calling? Basic — Ethernet Link (EL)2, 4, or 8Analog, parallel tap (Line Duplicator)Ethernet RJ-45 — UDP/3520 broadcastInbound Caller ID
Whozz Calling? Basic — Serial2, 4, or 8Analog, parallel tap (Line Duplicator)Serial DB9 RS-232 to a COM portInbound Caller ID
Whozz Calling? Deluxe2, 4, or 8Analog, in-line (signal passes through the unit)Ethernet (UDP/3520) or DB9 RS-232 — same recordInbound and outbound calls + call duration (full call accounting)
Vertex VoIP Caller IDSized to the site's SIP setupVoIP / SIP — network bridge (no analog line needed)Ethernet management port (UDP) — optional serial outCaller ID pulled from VoIP/SIP traffic

Ethernet packet framing (UDP/3520)

Each packet begins with a small fixed header identifying the unit, followed by an ASCII $ that marks the start of the Caller ID data stream:

^^ <unit_number> <serial_number> $ < ASCII Caller ID data stream >

21st-character parsing rule (critical): Do not "find the first $ and read from there" — the compressed unit/serial header can contain a stray $ byte. The robust method is to skip the fixed-length header and start reading the Caller ID data at the 21st character of the payload.

Third output format — Call Accounting

Beyond Standard and Detailed (above), a third drop-in ASCII format is available. All three carry the same information with small layout differences (Detail and Call-Accounting are simple toggles on Deluxe / full-featured units):

# 1) Standard (no prefix, MM/DD date)
01 I S 0000 G A2 03/26 10:45 AM 770-555-1234 JOHN SMITH

# 2) Detailed (leading $, 4-digit year MM/DD/YYYY, optional trailing checksum)
$01 I S 0000 G A2 03/26/2026 10:45 AM 770-555-1234 JOHN SMITH 1A2B

# 3) Call Accounting (MM/DD/YYYY date, HH:MM:SS time)
01 I S 0000 03/26/2026 10:45:30 AM 770-555-1234 JOHN SMITH