Spaw vs Abstract Phone Validation
Abstract Phone Validation is a phone API from Abstract sold as monthly request quotas on three data tiers, returning carrier, line type and location, with messaging from Standard up and registration and risk on Professional and the Free plan; the Professional example response also carries breach history.
The table uses Abstract Phone Validation'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 Abstract Phone Validation publishes.
| spaw | abstract phone validation | |
|---|---|---|
| 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 | Monthly request quotas on three plans that differ by the data returned: Starter (validation, location, carrier) from $19 a month for 5,000 requests to $199 for 150,000; Standard (adds messaging) from $19 for 3,000 to $199 for 100,000; Professional (adds registration and risk) from $19 for 2,000 to $199 for 50,000. Annual billing saves 10%; the pricing page quotes $3.40 per 1,000 requests at Starter's entry volume, billed annually |
| Free tier | 100 free credits every month, no card required | 100 requests a month with no card, on the full response including registration and risk |
| 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) | not on the pages read |
| 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) | not on the pages read |
| 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. | Each individual phone number you submit counts as a credit used. Credits are also counted per request, not per successful response |
| 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 | Yes: the documentation says a request for an invalid phone number "still counts as 1 credit" |
| 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 stated. The product page says Abstract uses "several databases of numbers" that it ingests and cross-references, with updates daily, weekly and monthly, without naming them; its changelog for 24 July 2026 mentions "recently published numbering plans from several African regulators". |
| 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. | "190+ countries" on the product page and "195+" in its FAQ, which lists them by name; no numbering plan or regulator table is named |
| 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. | The Phone Intelligence response carries phone_validation.line_status ("e.g. active, inactive") on every plan. The HLR Lookup page says status comes from "carrier data sources, including HLR and MNP (Mobile Number Portability) records" and applies "primarily to mobile numbers". No separate price is published for it. |
| 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. | The HLR Lookup page says a lookup "returns the current carrier, not the original one"; the API reference describes phone_carrier.name as "The carrier that the number is registered with". |
| 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. | An SMS pumping page recommends checking each number before the code is sent: reject VOIP and premium-rate lines and destinations you do not serve, and use the phone_risk flags (risk_level, is_disposable, is_abuse_detected, on the Free and Professional plans) with Abstract's IP data to catch bursts from data-center IPs and bots. No separate price is listed for it. |
| Bulk limit | 100,000 numbers per bulk job, with an HMAC-signed completion webhook | Bulk CSV upload on the paid plans; the documentation caps a file at 50,000 rows |
| Batch API | 1,000 numbers per synchronous request, answered in input order | not on the pages read |
| Rate limit | 50 requests per second per key on the phone endpoints | 3 requests a second at each monthly plan's entry volume, rising with the chosen volume to 50 at the largest monthly option (100 at the largest annual Standard and Professional options); the Free plan card also shows 3 a second, while the documentation's error table says free plans are "limited to 1 per second" |
| Official SDKs | Python, Node.js, PHP | not on the pages read |
| 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. | The SMS pumping page says the check "Runs in real time on every OTP request and stores nothing after" |
checked 2026-09-27 · sources: Abstract Phone Validation API page and plan table, Abstract API pricing, Abstract Phone Intelligence API documentation, Abstract Phone Validation API documentation, Abstract SMS pumping page, Abstract HLR Lookup page
When Abstract Phone Validation fits better
Teams already on Abstract's other APIs that want phone validation, and on the Professional plan registration, risk and breach fields, under a monthly quota.
- Plans differ by the fields each response carries: messaging from Standard up, and registration and risk on Professional and the Free plan; the Professional example response also carries breach history
- The Professional response includes phone_registration.name, the name registered to the number, and phone_breaches, the domains where the number appeared in a breach
- Every request counts against the quota, including one for an invalid number
- SOC 2 Type II and GDPR statements; a commercial license is listed under the Enterprise plan
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.
- Abstract's Professional and Free plans return the name registered to a number (phone_registration.name), and its Professional example response carries breach history; Spaw returns no owner, subscriber or caller name by design and does no reverse lookup
- Abstract counts every request against the quota, an invalid number included; Spaw bills 1 credit per valid number and answers an invalid number, and a repeat within 7 days, for free
- Abstract's disposable and abuse flags come with its Free and Professional plans; Spaw returns all 49 fields on every lookup, including is_disposable with, where the list gives one, the date the number was last seen on an SMS-receiving list, the risk score with its signals, and ok_to_send from your SMS policy, a fraud and deliverability decision rather than consent or a do-not-call scrub
- Abstract's pages do not name the databases behind its line type; on every valid answer Spaw's line_type_source says whether the numbering plan or, for a North American number, the block holder in the regulator's table settled it, and every answer's sources block names each dataset it consulted with its version or sync date
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. Abstract Phone Validation's pages say: Each individual phone number you submit counts as a credit used. Credits are also counted per request, not per successful response.
Can I move a list of numbers from Abstract Phone Validation 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. Abstract Phone Validation offers: 100 requests a month with no card, on the full response including registration and risk.
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 Abstract Phone Validation alternatives.
Abstract Phone Validation is a trademark of its owner. Spaw is not affiliated with it. Markdown version: /compare/abstract-phone.md