Spaw vs Telnyx Number Lookup
Telnyx Number Lookup is a per-query number API sold beside Telnyx's carrier services, priced separately for local routing number (portability and carrier), MCC/MNC, and CNAM caller name.
The table uses Telnyx Number Lookup's public pricing and documentation pages as checked on 2026-09-27, and Spaw's own pricing page. A row those pages carry no value for is marked "not on the pages read" rather than guessed at, and that is a statement about the reading and not about what Telnyx Number Lookup publishes.
| spaw | telnyx number lookup | |
|---|---|---|
| Pricing model | Pay-as-you-go credit packs whose credits never expire, or optional plans, billed monthly or yearly, that deposit the same credits every month for less and roll unused plan credits over up to three months' allowance; both through Stripe Checkout | Per query, priced per lookup type, with "$0 platform fee"; pay as you go gets "Automatic tier discounts as usage crosses thresholds", committed plans start at $500 a month, and inbound CNAM is $0.40 per number per month |
| Free tier | 100 free credits every month, no card required | An outbound CNAM listing at no charge; the pages read list no free query allowance |
| Price per 1,000 at about 10k | $7.80 (Growth pack: 5,000 credits for $39), or $5.80 on the Growth monthly plan (5,000 credits for $29 a month) | $1.50 per 1,000 for a local routing number query ($0.0015 a query), $2.50 for MCC/MNC ($0.0025) and $3.00 for CNAM ($0.003) |
| Price per 1,000 at about 100k | $4.49 (Volume pack: 100,000 credits for $449), or $3.49 on the Volume monthly plan (100,000 credits for $349 a month) | No tier rate is published: the page mentions "Automatic tier discounts as usage crosses thresholds", and its worked example prices 1,000,000 queries at $1,500 on the base rate, "before volume tiers" |
| Numbers the vendor could not settle billed | A valid number costs 1 credit whatever its flags say. The live carrier-network check (hlr: true) is not enabled on the service: hlr_checked answers false and nothing extra is charged. | not on the pages read |
| Invalid numbers billed | No: invalid numbers are free, including a number in a block the regulator lists as unassigned, and so are repeats within 7 days | not on the pages read |
| Line type source | The numbering plan metadata everywhere except the North American plan, where mobiles and landlines share blocks and the plan can only say fixed_line_or_mobile; there the regulator's block holder settles it — a wireless carrier's block is mobile, a virtual-number wholesaler's is voip. line_type_source names which of the two answered. | Not named. The product page lists line type ("Mobile, landline, or VoIP") among the fields a lookup returns from "Live telecom databases, including HLR lookup"; the pricing page says portability and carrier come from "the network's own data" and CNAM from the registry. |
| Numbering plan coverage | libphonenumber metadata for every region it carries, plus the regulators' own allocation tables, each named in the answer with the date of the copy it read. Complete tables, where a geographic number in a block the table leaves out answers unassigned_block: NANPA for the United States (with Puerto Rico, the U.S. Virgin Islands, Guam, American Samoa and the Northern Mariana Islands), the CNAC for Canada, ARCEP for France (with Guadeloupe, St. Barthélemy, St. Martin, Martinique, French Guiana, Réunion, Mayotte and St. Pierre & Miquelon), ACM for the Netherlands and the CRT (formerly the IFT) for Mexico. Partial tables, answered only from the ranges they list (a range listed as free, spare or held in reserve answers unassigned_block), so block_status answers null for a number outside them: Ofcom for the United Kingdom (with Guernsey, Jersey and the Isle of Man), ACMA for Australia, the NAD for New Zealand, UKE for Poland and MIMIT for Italy. Re-synced weekly, NANPA daily; /status lists each table's age. Outside those regions, block_status and is_virtual answer null rather than a guess. | The docs say "any phone number worldwide", with caller name (CNAM) for US numbers; the pages read name no numbering plan or regulator table. |
| Live network check | Reserved behind hlr: true: 4 credits on top of the base credit, only where the network answers, reported in its own reachable, ported, current_carrier and roaming fields. The live carrier-network check (hlr: true) is not enabled on the service: hlr_checked answers false and nothing extra is charged. | Described but not priced on its own: the product page says "HLR lookup confirms the live carrier for mobile numbers" and whether a mobile number is active on the network; the pricing page lists LRN, MCC/MNC and CNAM rows and no HLR row. |
| Ported numbers | None from the tables, and the docs say so: carrier and line_type describe the block the number was allocated in, never a later port. Only a live carrier-network check can say who serves a number today. | Sold as the product: the local routing number identifies "the serving switch", and ported status "reflects the actual serving carrier today, not the original carrier", which a numbering plan or an allocation table cannot answer |
| SMS pumping controls | Flags in the risk score, and an SMS policy that turns them into ok_to_send and blocked_by: a fraud and deliverability decision, not consent and not a do-not-call scrub. allowed_countries limits sending to the regions you serve; it is empty (any country) until you set it. range_burst (+40) flags a number once your account has looked up 5 distinct numbers in its 1,000-number range within 60 minutes, and numbers_per_client (+30) once one client address (the client_ip you send, or a browser visitor's own) has tried 5 within 60 minutes, unless Spaw's own IP data places it on a mobile carrier or a corporate proxy, or it is private or reserved. Both count only your own single and browser lookups, so a new account has no history. The range is a heuristic, and in North America a burst more likely means someone testing numbers against a form; the client count does not stop an attack rotated through residential proxies. disposable (+70) flags a number SMS-receiving websites publish and disposable_stale (+40) an old listing; disposable_range (+30) flags an unlisted number in a 1,000-number range holding 10 or more fresh listings. The lists are public and synced daily. The default policy blocks the fictional, disposable, reported_abuse, reported_abuse_widely and premium_rate signals and a risk_score above 60, so neither traffic signal blocks on its own. | No pumping score or price row on the pages read. The product page's FAQ says a lookup helps against SMS pumping by "identifying line type and carrier in real time", so a VoIP, recently ported or high-risk-carrier number can be blocked or challenged before sending; the pricing page mentions "fraud signals from the identity layer" without a row for them. |
| Bulk limit | 100,000 numbers per bulk job, with an HMAC-signed completion webhook | No limit stated; the FAQ says the API "supports bulk lookups for high-throughput use cases" across "databases of millions of numbers" |
| Batch API | 1,000 numbers per synchronous request, answered in input order | No batch size or endpoint named; the product page says the API "handles batch phone number validation" |
| Rate limit | 50 requests per second per key on the phone endpoints | Not stated for pay as you go; committed plans (from $500 a month) list "higher limits" and enterprise plans (from $5,000 a month) "unlimited rate limits" |
| Official SDKs | Python, Node.js, PHP | TypeScript / Node.js, Python, Go, Java, Ruby, PHP |
| Data retention | No history row and no log line carrying the number. What a lookup leaves is keyed and never holds the number: the 7-day marker that makes a repeat free (a second one when the account paid for a live check); for single and browser lookups, a truncated keyed hash of the number filed under keyed hashes of its range and client address for 60 minutes, and the account's lookups per country and hour as counts for 30 days; and a live check's answer, held for a day under a hash of the number. The number itself is kept only in the account's own outcome reports, phone suppression list and monitors. Bulk input lists and result files are deleted with the job after 30 days. | not on the pages read |
checked 2026-09-27 · sources: Telnyx Number Lookup pricing, Telnyx Number Lookup product page and FAQ, Telnyx Number Lookup API docs, Telnyx server-side SDKs
When Telnyx Number Lookup fits better
Teams that need to know who serves a number today, on numbers that have been ported, priced per dip from $0.0015 a query.
- A local routing number query is $0.0015 on the published rate card, before the volume tier discounts the page mentions
- Portability is the product rather than a side effect: an LRN query is priced and sold on its own
- No platform fee is charged for access
- The rate card is also published machine-readable, at GET /v2/public/pricing
When Spaw fits better
Developers who want the numbering plan and the regulators' own allocation tables read for them, the dataset behind every field named in the answer, and an SMS policy that turns the evidence into ok_to_send and blocked_by — a fraud and deliverability decision, not consent and not a do-not-call scrub. Every answer is made on the server: the opt-in live carrier-network check, the one call that would send a number to a partner, is not enabled on the service.
- Telnyx answers portability from carrier data; Spaw's carrier and line_type describe the original allocation and never a later port, and the docs say so
- Telnyx prices each dip separately; Spaw returns 49 fields, the risk score and its signals in one 1-credit answer
- Telnyx sells CNAM caller name for US numbers ($0.003 a query); Spaw returns no owner, subscriber or caller name by design and does no reverse lookup
- Spaw's answers come from local tables, and a lookup keeps no history, only keyed hashes and counts of your own traffic. The one call that would send a number off the server is the opt-in live check. The live carrier-network check (hlr: true) is not enabled on the service: hlr_checked answers false and nothing extra is charged.
- The Telnyx pages read list no free query allowance; every Spaw account gets 100 free credits a month with no card
Questions
Does Spaw charge for numbers it cannot settle?
Spaw bills per answer. A number the numbering plan and, where one is installed, the regulator's own table agree is assignable costs 1 credit whatever its flags say. An invalid number is free — including one in a block the regulator lists as unassigned — and so is a repeat of the same number within seven days. The live carrier-network check (hlr: true) is not enabled on the service: hlr_checked answers false and nothing extra is charged. Telnyx Number Lookup does not publish how it bills them.
Can I move a list of numbers from Telnyx Number Lookup to Spaw?
Yes. Upload the CSV in the dashboard or POST it to the bulk endpoint, up to 100,000 numbers a job; Spaw keeps your columns, adds the answer columns, and lets you download the whole file or only the valid, invalid, low, medium or high-risk rows. A country column gives each row its own region, so a mixed international list needs no splitting.
Is there a free tier?
Every Spaw account receives 100 free credits at the start of each month with no card on file, and unused free credits accumulate. Telnyx Number Lookup offers: An outbound CNAM listing at no charge; the pages read list no free query allowance.
Try Spaw on your own list
Free credits every month, no card. Upload a list, keep your columns, and download only the rows you want. See the pricing page for every rule, or the Telnyx Number Lookup alternatives.
Telnyx Number Lookup is a trademark of its owner. Spaw is not affiliated with it. Markdown version: /compare/telnyx-lookup.md