Skip to content
Movement and connection, without a device in hand

CDR & IPDR Analysis

Call Detail Records and Internet Protocol Detail Records reveal where a subscriber's device was, who it communicated with, and what internet sessions it carried — read correctly, and with clear-eyed limits.

CDR + IPDR
Record types
Sector, not point
Location unit
IMEI ↔ IMSI
Key link

What are CDR and IPDR?

A Call Detail Record (CDR) is a telecom operator's log of voice and SMS activity: calling and called party numbers, device and SIM identifiers (IMEI/IMSI), call type, duration, timestamp, and the cell tower that served the call — recorded as first and last cell ID, along with LAC/TAC and any roaming flag.

An Internet Protocol Detail Record (IPDR) instead logs data-session activity: the subscriber's private IP address, the NAT-translated public IP and port, destination ports, data volume transferred, and session start/end times. Because most operators use Carrier-Grade NAT, resolving an IPDR entry back to an individual subscriber usually requires the operator's NAT/port-translation session logs as well.

Together, CDR and IPDR let investigators build movement timelines, map communication networks, and correlate a specific internet session to a specific subscriber — always as a probabilistic, evidence-based reconstruction, never a GPS-precise pinpoint.

CDR

Who called whom, when, and which tower sector served the call.

IPDR

Which internet sessions a subscriber's connection carried, and how much data.

NAT Logs

The missing link that resolves a shared public IP back to one subscriber.

Step-by-Step Methodology

The sequence a careful examiner follows, in order.

  1. 1

    Obtain records through proper legal process

    Submit a court order, subpoena, or statutory law-enforcement request to the carrier's legal/compliance liaison unit, specifying the exact number/IMSI and date range needed — and request NAT session logs alongside any IPDR request.

  2. 2

    Normalize the record schema

    Different operators use different field names, time zones, and LAC/cell-ID numbering conventions — map every export into one common schema before analysis begins.

  3. 3

    Build the tower-handover sequence

    Sort CDR entries chronologically for the target IMSI/MSISDN and join each cell ID against the carrier's cell-site database to obtain tower coordinates and sector azimuth.

  4. 4

    Model coverage as directional sectors

    Plot each serving cell as an azimuth-bounded sector cone rather than a point radius, and use the overlap of consecutive sectors to bound a probable location corridor.

  5. 5

    Resolve IPDR sessions to a subscriber

    Join IPDR public-IP/port/timestamp entries against the operator's NAT session logs to recover the originating private IP, then cross-reference DHCP/session-authentication logs to attribute it to a specific subscriber connection.

  6. 6

    Run co-location and common-contact analysis

    Compare tower-handover histories and contact lists across multiple subjects of interest to surface overlapping locations or shared associates.

  7. 7

    Flag SIM swaps and device changes

    Track the IMEI–IMSI pairing across the full record set; an unexpected pairing change signals a SIM swap or device change worth independent investigation.

Tools Comparison

Sortable — click any column header.

DescriptionLink
Python (pandas)CDR/IPDR AnalysisCross-platformFreeThe standard toolkit for cleaning, joining, and analyzing large CDR/IPDR dumps beyond what spreadsheets can comfortably handle.
QGISCDR/IPDR AnalysisWindows / Linux / macOSOpen-SourceOpen-source GIS platform used to plot cell tower sector cones, azimuth overlap, and movement timelines on a map.
Microsoft Excel / Power QueryCDR/IPDR AnalysisWindows / macOSCommercialWidely used for cleaning, pivoting, and cross-referencing moderate-sized CDR/IPDR exports in casework.

Commands & Code

Copy-ready snippets used in real workflows.

cdr-tower-sequence.pypython
import pandas as pd

cdr = pd.read_csv("carrier_a_cdr.csv", parse_dates=["timestamp"])
target = cdr[cdr["imsi"] == "404-45-1234567890123"].sort_values("timestamp")

towers = pd.read_csv("cell_site_db.csv")  # cell_id, lat, lon, azimuth, beamwidth
merged = target.merge(towers, left_on="last_cell_id", right_on="cell_id", how="left")

merged[["timestamp", "b_party", "last_cell_id", "lat", "lon", "azimuth"]].to_csv(
    "subject_tower_sequence.csv", index=False
)
Always join on the carrier's own cell-site database — cell IDs are not globally unique across operators.
ipdr-nat-resolution.pypython
import pandas as pd

ipdr = pd.read_csv("ipdr_export.csv", parse_dates=["session_start", "session_end"])
nat_logs = pd.read_csv("nat_session_logs.csv", parse_dates=["timestamp"])

resolved = ipdr.merge(
    nat_logs,
    left_on=["public_ip", "public_port"],
    right_on=["translated_ip", "translated_port"],
    how="inner",
)

# resolved now includes the internal/private IP tied to the flagged public session
resolved[["session_start", "public_ip", "public_port", "private_ip", "subscriber_id"]]

Sample Records

Illustrative dummy data showing record structure — not real subscriber data.

Sample Call Detail Record (CDR) — Illustrative Dummy Data

Structure only. All numbers, IMEIs, and identifiers below are fictional.

A-PartyB-PartyIMEIIMSICall TypeDurationDate/TimeFirst Cell IDLast Cell IDLACRoaming
98765000019876500099356789012345670404451234567890Voice00:04:122025-03-11 09:14:0224501245071102N
98765000019876511122356789012345670404451234567890SMS-2025-03-11 09:41:5524507245071102N
98765000019876533344356789012345670404451234567890Voice00:12:472025-03-11 10:02:3124507245191103N
98765000019876500099356789012345670404451234567890Voice00:00:382025-03-11 18:55:0924601246011109Y

Sample Internet Protocol Detail Record (IPDR) — Illustrative Dummy Data

Structure only. IP addresses are RFC 5737 documentation ranges, not real allocations.

Private IPPublic IP (NAT)Src PortDst PortDest IPData Up (MB)Data Down (MB)Session StartSession End
10.42.6.113203.0.113.4451422443198.51.100.202.418.72025-03-11 09:10:002025-03-11 09:38:12
10.42.6.113203.0.113.4451890443198.51.100.770.63.12025-03-11 10:05:442025-03-11 10:11:02
10.42.6.113203.0.113.445201180198.51.100.90.10.42025-03-11 10:12:152025-03-11 10:12:47