API at a glanceSingle, batch, and balance endpoints share one API-key contract, with a consistent code / msg / data response envelope.

Quickstart

  1. 1.Create an API key in Settings.
  2. 2.Use GET /api/v1/balance to check the current balance before a batch.
  3. 3.POST one phone number to /api/v1/check, or up to 100 numbers to /api/v1/batch-check.
  4. 4.Read data.registered and the product-specific fields in the response.

Authentication

Use an API key created in Settings and send it with every request.

X-API-Key: sk_your_api_key
Keep your API key secret
Always call this endpoint from your server. Anyone holding the key can spend your balance.

Products and result fields

ws

WhatsApp Registration Check

Confirm whether a phone number is registered on WhatsApp.

01

Single check

curl -X POST "https://walookup.com/api/v1/check" \
  -H "X-API-Key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "service_type": "ws", "identifier": "+14155552671" }'
Registered
{
  "code": 0,
  "msg": "ok",
  "data": {
    "service_type": "ws",
    "identifier": "+14155552671",
    "registered": true
  }
}
Not registered
{
  "code": 0,
  "msg": "ok",
  "data": {
    "service_type": "ws",
    "identifier": "+14155550000",
    "registered": false
  }
}
registeredbooleanWhether the number is registered on WhatsApp.
02

Batch

Pricing: per number

Each number in the payload is billed independently. Maximum 100 numbers per request. Only successfully checked numbers consume balance. The request is rejected before processing if your balance cannot cover the full batch.

Submit up to 100 numbers in one request; results are returned in the same order.

curl -X POST "https://walookup.com/api/v1/batch-check" \
  -H "X-API-Key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "service_type": "ws", "identifiers": ["+14155552671", "+14155550000"] }'
{
  "code": 0,
  "msg": "ok",
  "data": {
    "service_type": "ws",
    "total": 2,
    "succeeded": 1,
    "failed": 1,
    "results": [
      {
        "identifier": "+14155552671",
        "exists": true,
        "registered": true
      },
      {
        "identifier": "+14155550000",
        "exists": false
      }
    ]
  }
}
existsbooleanWhether this number produced a result. false means it failed or couldn't be determined — a bad number, an undetermined result, or a momentary limit; when false, none of the fields below are present.
registeredbooleanWhether the number is registered. Present only when exists is true, with the same meaning as the single check.

Rate limits, concurrency, and retry behavior

Checks are synchronous. Use the returned code to decide whether to accept the result, slow down, or retry later.

  • 200 requests per minuteDashboard and API checks share one UTC fixed-minute window per user. For code 42900, Retry-After is the number of seconds until the next window.
  • 5 concurrent checksA user can run up to five checks at once (a batch request's numbers share this same budget). Code 42901 means all slots are occupied; submit again after an in-flight check finishes.
  • 429 is not chargedRate and concurrency limits reject the request before billing, create no check result, and deduct no balance. The caller may submit again after the relevant limit recovers.
  • Retry 503 laterA temporary service failure is not a registration result. Keep the input pending and retry later.

Error codes

40000Unsupported service type or conflicting request fields
40001Invalid JSON body
40002Invalid phone number
40100Missing or invalid API key
40200Insufficient balance
42200Upstream could not determine this number. No data is returned and the request is not charged
42900Rate limit exceeded
42901All concurrency slots are occupied; submit after an in-flight request finishes. The rejected request is not charged
50300Validation service maintenance

Ready to start integrating?

Ready to get started? Create a free account and get your API key in seconds.

Create a free account