Know who’s calling,
before you answer.
Look up any phone number in the world. Get carrier, location, line type, and crowd-sourced spam reports — in milliseconds.
Everything in one lookup
Complete number intelligence.
Every piece of data you need to decide whether to answer — surfaced instantly, with no friction.
Spam score
Crowd-sourced 0–100 trust signal built from verified community reports.
Carrier & line
Network operator and line type — mobile, fixed, VoIP, toll-free — identified precisely.
Country & region
ISO code, country name, and sub-region — geolocated from Google’s libphonenumber.
Community tips
Real people sharing what they know — who owns it, what they asked for, whether it rings.
Number formats
E.164, international, and national notation — all three, always.
Timezones
Every timezone region the number could belong to — listed and ready to check.
How it works
Three steps to know any number.
Paste a number
Any format, any country — international or local. CallTracer normalizes it for you.
Instant analysis
Carrier, location, line type, timezone, and community signals — cross-referenced in milliseconds.
Decide
Review the verdict and what real callers have reported. Know before you answer.
One endpoint. Zero friction.
A single REST endpoint. No API key, no sign-up — just GET and go. Rate limited to 10 requests / minute per IP.
/api/lookup/{number}
{
"number": "+12125551234",
"international": "+1 212-555-1234",
"national": "(212) 555-1234",
"country_code": 1,
"country_iso": "US",
"country": "United States",
"number_type": "Fixed Line",
"carrier": null,
"location": "New York, NY",
"timezones": ["America/New_York"],
"is_valid": true,
"reports": {
"total": 3,
"spam_score": 67,
"last_reported_at": "2026-03-10T08:22:00Z"
}
}
Error codes
Invalid number
Number could not be parsed or validated.
Rate limit exceeded
More than 10 requests per minute from this IP.
# Basic lookup
curl https://calltracer.io/api/lookup/12125551234
# Pretty-print with jq
curl https://calltracer.io/api/lookup/12125551234 | jq .
# Extract just the spam score
curl -s https://calltracer.io/api/lookup/12125551234 \
| jq '.reports.spam_score'
// Fetch API — browser or Node 18+
const number = '12125551234';
const res = await fetch(
`https://calltracer.io/api/lookup/${number}`
);
if (!res.ok) throw new Error('Request failed');
const data = await res.json();
console.log(data.international); // "+1 212-555-1234"
console.log(data.reports.spam_score); // 67
import requests
number = '12125551234'
url = f'https://calltracer.io/api/lookup/{number}'
resp = requests.get(url)
resp.raise_for_status()
data = resp.json()
print(data['international']) # +1 212-555-1234
print(data['country']) # United States
print(data['reports']['spam_score']) # 67
// With Guzzle
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://calltracer.io']);
$resp = $client->get('/api/lookup/12125551234');
$data = json_decode($resp->getBody(), true);
echo $data['international']; // +1 212-555-1234
echo $data['reports']['spam_score']; // 67
// Without Guzzle
$data = json_decode(file_get_contents(
'https://calltracer.io/api/lookup/12125551234'
), true);
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type Result struct {
International string `json:"international"`
Country string `json:"country"`
Reports struct {
SpamScore int `json:"spam_score"`
} `json:"reports"`
}
func main() {
resp, _ := http.Get(
"https://calltracer.io/api/lookup/12125551234",
)
defer resp.Body.Close()
var r Result
json.NewDecoder(resp.Body).Decode(&r)
fmt.Println(r.International, r.Reports.SpamScore)
}
Stop wondering who called.
Enter a number. Get every detail instantly. No account. No catch.