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
| Model | Lines | Phone connection | Data output | Captures |
|---|---|---|---|---|
| Whozz Calling? Basic — Ethernet Link (EL) | 2, 4, or 8 | Analog, parallel tap (Line Duplicator) | Ethernet RJ-45 — UDP/3520 broadcast | Inbound Caller ID |
| Whozz Calling? Basic — Serial | 2, 4, or 8 | Analog, parallel tap (Line Duplicator) | Serial DB9 RS-232 to a COM port | Inbound Caller ID |
| Whozz Calling? Deluxe | 2, 4, or 8 | Analog, in-line (signal passes through the unit) | Ethernet (UDP/3520) or DB9 RS-232 — same record | Inbound and outbound calls + call duration (full call accounting) |
| Vertex VoIP Caller ID | Sized to the site's SIP setup | VoIP / SIP — network bridge (no analog line needed) | Ethernet management port (UDP) — optional serial out | Caller 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