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_KEY

Create 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"
}
Lookup request
FieldRequiredWhat to send
phoneYesThe number to check. Use an international number starting with + or 00, or a local number with defaultCountry. Spaces, parentheses, and hyphens are accepted.
defaultCountryFor local numbersA two-letter country code, such as GB or US.
checksYesAn array of check names from the list below. Use an empty array for formatting and validation only.
currencyNoGBP, USD, or EUR. If supplied, it must match your workspace currency.
maxSpendNoA 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

Choose individual checks within each package
Check namePackageWhat it tells you
basic_line_typeFreeNumber type, such as mobile or landline. Formatting and validation are included in every lookup.
enhanced_line_typePhone servicesMore detailed number type.
current_carrierPhone servicesThe network currently serving the number.
mnpPhone servicesWhether the number has moved between networks.
live_statusPhone servicesWhether the number is reachable on the network.
smsPhone servicesSMS enablement for US and Canadian landline and internet-based numbers.
whatsappMessaging appsWhether a WhatsApp account is linked to the number.
telegramMessaging appsWhether 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"
  }
}
Result fields
FieldMeaning
numberFormatted number, country, validation, and requested number or network details.
contact.smsSMS support. assumed:true identifies an answer inferred from mobile number type.
contact.whatsapp.registeredWhether a WhatsApp account was found.
contact.telegram.registeredWhether a Telegram account was found.
network.reachableNetwork reachability, when live_status is requested.
billing.amountThe actual charge as a decimal string, such as "0.05".
billing.currencyThe currency of the charge.
requestIdThe identifier QuietPass returns for tracking and support.

Reading the answers

Positive, negative, and unknown results
ValueMeaning
trueYes. For inferred SMS support, assumed:true explains how the answer was obtained.
falseA definite no, such as no account found. This is a successful answer.
nullNo definite answer. A nearby reason field explains why.
Field omittedThat 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=true

The 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}.

Saved lookup states
StateWhat to do
not_startedRetry the original request with the same key. A quoted lookup also needs its original quote ID, spending limit, and a valid quote.
pendingRead the status again later. Do not submit a replacement lookup.
settledUse the saved result and its reported charge.
expiredThe 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.

See package prices, trial credit, and top-ups.

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=GB

This returns the coverage catalog without checking a phone number. Explore countries and networks.

Errors

HTTP responses
StatusMeaning
400Invalid request fields, number, checks, or response options.
401Missing, expired, or invalid API key.
402Not enough available credit.
403Account setup, access, or current terms acceptance is required. Browser requests are also rejected.
404No saved lookup was found for that key or quote ID.
409A conflicting key, changed price, expired quote, or lookup awaiting reconciliation. Read the error code and recover the original lookup if needed.
429A request, account, or service limit has been reached.
503The 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.