Snapchat Number Lookup API: Check Phone, Email & Username
Snapchat remains one of the largest messaging platforms among younger audiences, which makes it a useful channel for outreach, verification and enrichment. If your product works with phone numbers, emails or usernames, knowing whether a contact is on Snapchat, and resolving the public identity behind it, shapes which channel you pick and how you score a lead. A Snapchat number lookup API answers this over plain HTTP.
This guide covers the five operations: checking a phone, batch-checking a list, probing an email or username, resolving a full identity, and reading a public username profile. It includes runnable Python and the error handling you need for production lists.
Which operation do you need?
| Goal | Operation | Input |
|---|---|---|
| One phone, plus the identity on a hit | check-phone | number |
| A list of phones | check-phones-batch | numbers, up to 50, comma-separated |
| Is this email or username registered? | check-email-username | target |
| Registration plus identity for a phone, email or username | user-info | number or target |
| Public profile for a known handle | public-profile | username |
Step 1: Get an API key
Sign up and copy an active key from your Dashboard. Free credits are included for testing.
Step 2: Check a phone number
check-phone takes a number in international format (digits, with an optional leading +; the API normalizes it) and returns whether the number is registered on Snapchat. On a hit you also get the account's username, userId and displayName, so you do not need a second request to learn who the number belongs to.
curl "https://api.opendata-api.com/api/project/snapchat/check-phone?key=YOUR_API_KEY&number=8613800138000"
registered is three-state: true is registered, false is not registered, and null is undetermined, which is a transient condition. When you see null, read message and retry after a short backoff.
import time
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://api.opendata-api.com/api/project/snapchat"
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()
# A reply can be wrapped more than once as {"code": ..., "data": {...}}
while isinstance(body, dict) and "code" in body and isinstance(body.get("data"), (dict, list)):
body = body["data"]
return body
def check_phone(number, retries=2):
for attempt in range(retries + 1):
data = get("check-phone", number=number)
if data.get("registered") is not None:
return data
time.sleep(2 * (attempt + 1)) # undetermined: back off, then retry
return data
hit = check_phone("8613800138000")
print(hit.get("registered"), hit.get("username"), hit.get("displayName"))
Step 3: Batch-check a list
For list screening, check-phones-batch classifies up to 50 comma-separated numbers in one request and returns a per-number result. Each row carries its own three-state registered flag, so a transient failure on one number does not fail the whole batch, and hits include username, userId and displayName.
curl "https://api.opendata-api.com/api/project/snapchat/check-phones-batch?key=YOUR_API_KEY&numbers=8613800138000,8613900139000"
One request replaces up to 50, which cuts round-trips and makes screening much faster. Batch results are counted per number returned, so check pricing before you run a very large list. The script below splits a list into chunks of 50 and appends the raw response of every chunk to a file:
import json
def chunks(items, size=50):
for i in range(0, len(items), size):
yield items[i:i + size]
numbers = ["8613800138000", "8613900139000"] # your normalized list
with open("snapchat_batches.jsonl", "a") as out:
for batch in chunks(numbers):
data = get("check-phones-batch", numbers=",".join(batch))
out.write(json.dumps({"requested": batch, "result": data}) + "\n")
Storing the raw response keeps the script valid however you decide to parse the rows later. Afterward, collect the rows whose registered is null and send them in a later batch.
Step 4: Probe an email or username
check-email-username is the lightest existence probe. Pass a target: a username-shaped value such as teng_leo is resolved against the public profile surface, and an email address is checked through an account-recovery probe. The answer is exists, again three-state.
curl "https://api.opendata-api.com/api/project/snapchat/check-email-username?key=YOUR_API_KEY&target=teng_leo"
This is a good fit for sign-up forms, handle availability checks and CRM de-duplication. Use the email form deliberately. A positive email result may send a real recovery email to the address owner, so it is for single, intentional checks, never for spraying a list.
Step 5: Resolve a full identity
user-info accepts either number (a phone) or target (an email or username). If both are set, number wins, and a phone-shaped target is routed to the phone path. What comes back depends on the surface:
- a phone hit returns
username,userIdanddisplayName - a username hit returns
displayNameand a snapcode image URL - an email hit returns a masked recovery address
The response always carries a machine status (found, not_found, invalid or error) and a readable message. Branch on status rather than parsing the message:
info = get("user-info", number="8613800138000")
if info.get("status") == "found":
print("identity:", info)
elif info.get("status") in ("not_found", "invalid"):
print("no account, or a malformed input:", info.get("message"))
else:
print("retry later:", info.get("message"))
Step 6: Read a public username profile
public-profile resolves a username to its username, displayName and a snapcode image URL when the account exists. It needs no phone number and returns a clear registered flag plus a status of found, not_found or invalid. Use it to confirm that a handle is taken, enrich a known username with its display name, or fetch a scannable snapcode. The bio and the Bitmoji avatar are not exposed on this public surface.
curl "https://api.opendata-api.com/api/project/snapchat/public-profile?key=YOUR_API_KEY&username=teng_leo"
If you need Stories, Spotlight and Lens data rather than registration checks, read Snapchat profiles, Stories and Spotlight via API.
Use cases
- Channel routing: offer Snapchat as a contact channel only where it is available.
- Lead validation: confirm numbers or emails are on Snapchat before adding them to a campaign.
- Contact enrichment: attach a Snapchat username and userId to existing phone records.
- Anti-fraud and KYC: use registration status as a lightweight trust signal, never as the only one.
- List cleaning: batch-verify stored contacts and drop the ones that are not on Snapchat.
Best practices
- Normalize numbers to digits with the country code before checking, and reject what you cannot parse.
- Batch lists with
check-phones-batchinstead of looping overcheck-phone. - Validate before enriching. Run
check-phonefirst and calluser-infoonly on registered contacts. - Treat
nullas retry later, never as a definitive no. Back off between attempts. - Handle the email caveat. Keep email probes to deliberate single checks.
- Stay compliant. Process only contacts you have a lawful basis to use, and respect privacy expectations and the platform's terms.
Where it fits
A Snapchat hit is one signal among several. To compare it with other channels, see the guides for Signal, Viber and WhatsApp, and to combine them into one score and routing decision, follow the lead verification workflow. For very large WhatsApp lists the same chunk-and-resume pattern applies, as shown in bulk verification for WhatsApp numbers.
FAQ
What does registered=null mean?
It means the result is undetermined, which is a transient condition. Read message, wait a short time and retry. Do not treat it as "not registered".
How many numbers can I check in one request?
Up to 50 comma-separated numbers per check-phones-batch call. Each row has its own registered flag, so one failed row does not fail the batch.
Does an email check notify the account owner? It can. The email probe uses account recovery, so a positive result may send a real recovery email to the address owner. Use it for deliberate single checks, not for bulk lists.
What does the public profile include? The username, the display name and a snapcode image URL when the handle exists. The bio and the Bitmoji avatar are not exposed on that surface.
Which operation should I use for a phone number?
Use check-phone for one number, and check-phones-batch for a list. Call user-info only when you want the full identity for a contact that already passed the check.
Try it
Test lookups on the Snapchat Lookup page, or read the check-phone, check-phones-batch, check-email-username, user-info and public-profile references. See pricing for per-request costs.