Validate a phone number for list cleaning — line type, current carrier, portability, and DNC status.
Validate a single phone number against Trackly’s list cleaning pipeline. Returns current (post-port) carrier, line type (mobile / fixed line / VoIP), ported flag, and internal DNC membership — everything you need to decide whether the number is safe to include in an SMS campaign. Backed by carrier network (NPAC-sourced) data, not a static numbering-plan table. Results reflect the current state of the number, including recent ports.Documentation Index
Fetch the complete documentation index at: https://docs.tracklysms.com/llms.txt
Use this file to discover all available pages before exploring further.
cached: true, cost: 0) — pass force=true to bypass the cache and re-validate at $0.003 (rare; LRN data only changes on carrier porting). Lookups accrue throughout the month and are charged to your Stripe-on-file payment method on the 1st of the following month.
Your account must have an active payment method to use this endpoint. Requests from accounts with payment_failed or suspended billing status return 402 Payment Required.
+14155551234). Common US formats are normalized automatically (4155551234, (415) 555-1234).false. Must be a strict boolean — string "true" is rejected with invalid_force. LRN data only changes on carrier porting (rare), so cache hits are correct for the vast majority of repeat lookups.true if the phone number is valid per the carrier network.mobile, fixed line, voip, other, unknown. Note the literal value for landlines is "fixed line" with a space.Verizon Wireless, T-Mobile, Frontier). Derived from carrier_raw.CELLCO PARTNERSHIP DBA VERIZON). Useful for programmatic matching.true if the number has been ported away from the carrier that originally owned its NPA-NXX prefix.US).true if the number is on Trackly’s internal DNC list (populated nightly from the FTC Do Not Call Registry and state registries).ok — mobile, valid, not on DNC. Safe to send.unreachable — landline or VoIP. Cannot receive SMS reliably.risky — valid mobile but flagged on a DNC list.invalid — not a valid number per the carrier network.unknown — line type could not be determined.0 when served from cache.true if the result was served from Trackly’s per-account cache (no charge). Cache is permanent per (account, phone) once the number has been validated; pass force=true on the request to bypass.| Code | HTTP | Description |
|---|---|---|
missing_phone | 400 | phone field missing from request body |
invalid_phone | 400 | Phone could not be parsed into E.164 |
invalid_force | 400 | force is not a strict boolean (string "true" / int 1 are rejected) |
rate_limited | 429 | Account or upstream provider hit a rate limit; retry after a short backoff |
missing_api_key | 401 | No X-Api-Key header present |
invalid_api_key | 401 | API key revoked or unknown |
no_billing_config | 402 | Account has no billing configuration |
no_payment_method | 402 | No Stripe customer / card on file |
payment_failed | 402 | Most recent charge failed; update card to re-enable |
suspended | 402 | Account is suspended |
provider_error | 503 | Upstream lookup provider unavailable |
(account, phone) pair. Repeat validations return the same data with no charge (cached: true, cost: 0). Pass force=true to bypass the cache and refresh the stored result with a new LRN call (the existing record is overwritten, not deleted). Reasoning: LRN data only changes when a number is ported between carriers — a rare event — so persistent caching gives correct results for the vast majority of repeat lookups.
A short Redis layer (30 days) sits in front for read latency, but the underlying per-account record is what makes repeat lookups free indefinitely.