Viber Number Lookup API: Validate & Get Profile Data

Published August 23, 2026 Β· UpdatedOctober 9, 2026

Viber remains a dominant messaging app in Eastern Europe, Greece, the Philippines and parts of Asia, and for many audiences there it is the channel that actually gets read. If your outreach or data pipeline spans those regions, checking whether a number is on Viber, and enriching it with a name and photo, is genuinely valuable. A Viber number lookup API does that with a simple HTTP call per number.

This guide covers validating Viber registration, pulling profile data, fetching the avatar in a form you can embed, and handling the three-state result and the response envelope correctly.

Step 1: Get an API key

Sign up and copy an active key from your Dashboard. Free credits are included, so you can try every call below.

Step 2: Check registration

The check operation is the lightest call. It takes a phone number in international format and returns only the number and registered, with no profile or avatar payload. A leading + is optional because the API normalizes to digits.

curl "https://api.opendata-api.com/api/project/viber/check?key=YOUR_API_KEY&number=447700900123"

registered is three-state: true means registered, false means not registered, and null means undetermined. A null is transient, for example a timeout, and the message field explains it. Retry those later and never count them as "not on Viber".

One detail that differs from many APIs: the Viber replies are wrapped as {"code", "data"} and the HTTP status is always 200, with the outcome in code and data.registered. The platform wraps that reply once more, so in the raw JSON registered sits at data.data.registered. Checking raise_for_status() alone is not enough, so look inside the body; the Python helper below unwraps the layers for you.

Step 3: Fetch the profile

The user-info operation returns the registration status plus the account's public profile: the Viber display name (viberName), the internal identifiers memberId and viberId, a message and the lookup time as durationMs. It also returns serverStatus, an authoritative per-number result where 1 means registered and 3 means not registered.

curl "https://api.opendata-api.com/api/project/viber/user-info?key=YOUR_API_KEY&number=447700900123"

Use memberId or viberId as a stable key when you deduplicate records or link a Viber account to a CRM contact.

Step 4: Get the avatar

The get-avatar operation returns the profile photo in several ready-to-use forms:

  • signedUrl: a temporary image URL that works for a few hours and can be fetched from any client without authentication.
  • imageUrl: a stable link for retrieving the current image.
  • imageBase64 and dataUrl: the image inlined, convenient for dropping straight into an <img> tag.
  • hasImage: false means the account has no public photo or is not registered.

The response also echoes registered, viberName and imageLen, the image size in bytes.

curl "https://api.opendata-api.com/api/project/viber/get-avatar?key=YOUR_API_KEY&number=447700900123"

Because signedUrl expires, download the image once and store it yourself if you need it later. Do not save the URL.

A complete Python example

import requests

API_KEY = "YOUR_API_KEY"
BASE = "https://api.opendata-api.com/api/project/viber"


def get(operation, **params):
    params["key"] = API_KEY
    resp = requests.get(f"{BASE}/{operation}", params=params, timeout=30)
    resp.raise_for_status()
    body = resp.json()
    # The reply is wrapped as {"code": ..., "data": {...}}, and the platform wraps it once more
    while isinstance(body, dict) and "code" in body and isinstance(body.get("data"), (dict, list)):
        body = body["data"]
    return body


def viber_profile(number):
    status = get("check", number=number)
    registered = status.get("registered")
    if registered is None:
        return {"number": number, "registered": None, "retry": True, "reason": status.get("message")}
    if registered is False:
        return {"number": number, "registered": False}

    info = get("user-info", number=number)
    avatar = get("get-avatar", number=number)
    photo = None
    if avatar.get("hasImage") and avatar.get("signedUrl"):
        photo = requests.get(avatar["signedUrl"], timeout=30).content
    return {
        "number": number,
        "registered": True,
        "name": info.get("viberName"),
        "member_id": info.get("memberId"),
        "viber_id": info.get("viberId"),
        "photo_bytes": photo,
    }


print(viber_profile("447700900123"))

The function spends one cheap check per number and only asks for the profile and avatar when the number is registered. Undetermined results are returned with a retry flag, so your queue can try them again later.

Viber compared with the other lookups

QuestionWhere to look
Is the number on Viber, and who owns the profile name?Viber user-info
Same question for a privacy-first messengerSignal number lookup
Is the number on Telegram, and is there a public handle?Telegram number checker
Which channel should the next message use?Lead verification workflow

Viber is strongest where it is the local default. For a global list, run several channels and pick per contact instead of assuming one app.

Use cases

  • Regional campaigns: route messages to Viber where it dominates, such as Eastern Europe and Greece.
  • Lead enrichment: attach the Viber display name and photo to contacts in Viber-heavy markets.
  • Support tools: show the profile photo to agents before a conversation starts.
  • Channel selection: choose the right messaging channel per contact instead of guessing.
  • List cleaning: remove non-Viber numbers from Viber-specific sends.

Best practices

  • Normalize numbers. Use digits with the country code; a leading + is accepted.
  • Check first, enrich second. Run check for the whole list and call user-info and get-avatar only for registered numbers.
  • Treat null as retry. Re-queue undetermined results after a delay rather than discarding them.
  • Deduplicate and cache. Store results with a timestamp so you do not pay twice for the same lookup.
  • Do not hotlink avatars. Save the image itself, since signedUrl is temporary.
  • Stay compliant. Process only numbers you have a lawful basis to use, and respect Viber's terms and local privacy law.

FAQ

How do I check if a phone number is on Viber? Call the check operation with the number in international format. The result field registered is true, false or null. A null means the answer could not be determined at that moment, so retry later.

Why does the API always return HTTP 200 for Viber? The Viber replies are wrapped as {"code", "data"}, and the outcome is carried in code and data.registered rather than in the HTTP status. The platform wraps the reply once more, so registered sits at data.data.registered in the raw JSON. Always read the response body instead of relying on the status code alone.

What does serverStatus mean? It is an authoritative per-number result from user-info: 1 means the number is registered on Viber and 3 means it is not registered.

Can I get a Viber profile photo from a phone number? Yes, if the account has a public photo. The get-avatar operation returns hasImage, plus signedUrl, imageUrl and an inlined dataUrl. When hasImage is false, the account has no public photo or is not registered.

How long does the signedUrl last? It is a temporary link valid for a few hours. Download the image when you need it and store the file yourself rather than keeping the URL.

Try it

Test lookups on the Viber Number Validation page, or read the check, user-info and get-avatar references. See pricing for per-request costs.