Developers
API reference.
The fields to send, the answers to expect, and how to handle an interrupted lookup.
Authentication
Send your API key in the Authorization header. Make requests from your server and keep the key private.
Authorization: Bearer YOUR_API_KEYCreate and manage keys in API keys & usage. For account setup and a first request, see the quickstart.
Request fields
POST https://quietpass.com/v1/phone/lookup
Send one phone number and select the checks to run. The same endpoint handles free and paid checks.
{
"phone": "07400 123456",
"defaultCountry": "GB",
"checks": [
"basic_line_type",
"current_carrier",
"whatsapp",
"telegram"
],
"currency": "GBP",
"maxSpend": "0.05"
}| Field | Required | What to send |
|---|---|---|
phone | Yes | The number to check. Use an international number starting with + or 00, or a local number with defaultCountry. Spaces, parentheses, and hyphens are accepted. |
defaultCountry | For local numbers | A two-letter country code, such as GB or US. |
checks | Yes | An array of check names from the list below. Use an empty array for formatting and validation only. |
currency | No | GBP, USD, or EUR. If supplied, it must match your workspace currency. |
maxSpend | No | A spending limit in your workspace currency, such as "0.05". Omit it to use your accepted package prices. Decimal strings preserve the exact value; up to six decimal places are accepted. |
Include Content-Type: application/json and a unique Idempotency-Key header. Reuse that key for retries of the same lookup; a new key starts a new lookup.
Checks
| Check name | Package | What it tells you |
|---|---|---|
basic_line_type | Free | Number type, such as mobile or landline. Formatting and validation are included in every lookup. |
enhanced_line_type | Phone services | More detailed number type. |
current_carrier | Phone services | The network currently serving the number. |
mnp | Phone services | Whether the number has moved between networks. |
live_status | Phone services | Whether the number is reachable on the network. |
sms | Phone services | SMS enablement for US and Canadian landline and internet-based numbers. |
whatsapp | Messaging apps | Whether a WhatsApp account is linked to the number. |
telegram | Messaging apps | Whether a Telegram account is linked to the number. |
Mobile numbers include free SMS support inferred from number type. The sms check above is a separate enablement check. Check coverage for your country and network.
Optional: get a price before running the lookup
Send the same request JSON to POST /v1/phone/quote. This returns a quote without running the lookup or using credit.
Read quote.id, quote.currency, quote.maxSpend, and unavailableChecks. Quotes last five minutes. Execute a quote with POST /v1/phone/execute, an Idempotency-Key, and:
{
"quoteId": "11111111-1111-4111-8111-111111111111",
"maxSpend": "0.05"
}The execution limit must cover the quoted price. Keep the same quote ID and key when retrying.
Response fields
A completed lookup returns the result and its actual charge. This excerpt shows a masked number:
{
"requestId": "11111111-1111-4111-8111-111111111111",
"number": {
"e164": "+44740012••••",
"country": "GB",
"valid": true,
"type": "mobile",
"carrier": "Example network"
},
"contact": {
"sms": {
"supported": true,
"assumed": true,
"basis": "mobile_line_type"
},
"whatsapp": {
"registered": true
},
"telegram": {
"registered": false
}
},
"billing": {
"amount": "0.05",
"currency": "GBP"
}
}| Field | Meaning |
|---|---|
number | Formatted number, country, validation, and requested number or network details. |
contact.sms | SMS support. assumed:true identifies an answer inferred from mobile number type. |
contact.whatsapp.registered | Whether a WhatsApp account was found. |
contact.telegram.registered | Whether a Telegram account was found. |
network.reachable | Network reachability, when live_status is requested. |
billing.amount | The actual charge as a decimal string, such as "0.05". |
billing.currency | The currency of the charge. |
requestId | The identifier QuietPass returns for tracking and support. |
Reading the answers
| Value | Meaning |
|---|---|
true | Yes. For inferred SMS support, assumed:true explains how the answer was obtained. |
false | A definite no, such as no account found. This is a successful answer. |
null | No definite answer. A nearby reason field explains why. |
| Field omitted | That information was not requested. Free SMS inference is included automatically. |
number.valid checks the number’s format against numbering rules. It does not confirm ownership or that the number is in use. SMS support, app registration, and network reachability do not guarantee delivery.
Where number-type sources differ, detailed type takes priority over basic numbering information. Conflicting detailed answers remain null with conflicting_data. Unknown number fields use typeReason, carrierReason, or portedReason; other unknown fields include reason.
Details and timestamps
Add ?includeDetails=true to a lookup or saved-result request to include the evidence behind each answer.
GET /v1/phone/lookup?includeDetails=trueThe additional details object contains individual observations and timestamps, the rules used to combine them, and any conflicts. retrievedAt is when information was retrieved; observedAt is when it was observed. A missing observation time stays null.
You can request details from a saved result without running another lookup or using more credit. This option applies to result endpoints, including quote execution. Leave it off quote, wallet, and coverage requests.
Recover an interrupted lookup
Read GET /v1/phone/lookup with the original Idempotency-Key. If you started with a quote, read GET /v1/phone/results/{quoteId}.
| State | What to do |
|---|---|
not_started | Retry the original request with the same key. A quoted lookup also needs its original quote ID, spending limit, and a valid quote. |
pending | Read the status again later. Do not submit a replacement lookup. |
settled | Use the saved result and its reported charge. |
expired | The result is no longer available. A new lookup needs a new key and can incur a new charge. |
Results are retained for 24 hours. Reusing a key returns the original lookup rather than buying it again; changing its number, checks, currency, or spending limit returns a conflict. An unresolved lookup is never a zero-cost result.
A direct lookup not yet recorded can return 404 DIRECT_LOOKUP_NOT_FOUND; retry with the original input and key. The starter files save this identity and check the original status when run again.
Billing
Each selected package is charged once per number when at least one requested check gives a definite answer. A definite “no” counts. If none of its requested checks can answer, that package costs zero.
maxSpend limits the charge; billing.amount reports what you actually paid. The maximum is held while a lookup runs, and unused credit is released when it settles. Currency values are local prices, with no automatic conversion between workspaces.
Coverage
Coverage requests are public and do not require an API key. Filter by a two-letter country code.
GET https://quietpass.com/api/coverage?country=GBThis returns the coverage catalog without checking a phone number. Explore countries and networks.
Errors
| Status | Meaning |
|---|---|
400 | Invalid request fields, number, checks, or response options. |
401 | Missing, expired, or invalid API key. |
402 | Not enough available credit. |
403 | Account setup, access, or current terms acceptance is required. Browser requests are also rejected. |
404 | No saved lookup was found for that key or quote ID. |
409 | A conflicting key, changed price, expired quote, or lookup awaiting reconciliation. Read the error code and recover the original lookup if needed. |
429 | A request, account, or service limit has been reached. |
503 | The service is temporarily unavailable. If execution may have started, recover the original lookup before retrying. |
Errors include error.code and a request ID. After a timeout or unresolved execution, recover the original status before starting another lookup.
Starter files
The JavaScript, Python, and Postman starters use the same request JSON as the API. Download the files and read setup instructions, or connect an existing tool.
Need a hand?
Contact us with your request ID and what you expected. Keep API keys and customer data out of support messages.