API documentation
Programmatic access to every check available in the web panel.
Quick start
Every request must carry an API key in the X-API-Key header.
Create and revoke keys from
your API keys page. A key is shown once at
creation and stored only as a hash, so keep a copy somewhere safe.
curl -X POST http://checkers.send99.com/api/v1/check \
-H "X-API-Key: oc_your_key_here" \
-H "Content-Type: application/json" \
-d '{"service_type":"ws","identifier":"+14155552671"}'
Base URL: http://checkers.send99.com/api/v1
Find a service
Every enabled service with its identifier type, price, and a link to an example response. Click a service type to jump to its shape.
| Type | Name | Identifier | Response extras | Price |
|---|---|---|---|---|
| Phone number | ||||
| ws | phone | — | $0.0080 | |
| ws_avatar | phone | avatar, avatar_url | $0.0160 | |
| ws_business | phone | business | $0.0160 | |
| telegram | phone | — | $0.0120 | |
| viber | phone | — | $0.0120 | |
| zalo | phone | — | $0.0120 | |
| phone | — | $0.0080 | ||
| phone | — | $0.0060 | ||
| threads | phone | — | $0.0080 | |
| phone | — | $0.0080 | ||
| vk | phone | — | $0.0100 | |
| amazon | phone | — | $0.0100 | |
| apple | phone | — | $0.0100 | |
| microsoft | phone | — | $0.0060 | |
| shopee | phone | — | $0.0100 | |
| band | phone | — | $0.0100 | |
| goto | phone | — | $0.0120 | |
| hh | phone | — | $0.0100 | |
| indiatimes | phone | — | $0.0100 | |
| carrier | phone | carrier, number_type, country_code, region, city | $0.0040 | |
| Email address | ||||
| amazon_email | — | $0.0100 | ||
| facebook_email | — | $0.0100 | ||
| instagram_email | — | $0.0080 | ||
| apple_email | — | $0.0100 | ||
| spotify_email | — | $0.0100 | ||
| gmail_avatar | — | $0.0060 | ||
| yandex_avatar | — | $0.0060 | ||
| mailru_avatar | — | $0.0060 | ||
| yahoo | — | $0.0060 | ||
| outlook | — | $0.0060 | ||
| Phone or email | ||||
| netflix | both | — | $0.0120 | |
No service matches that filter.
Run a check
POST /api/v1/check
Request body
| Field | Required | Description |
|---|---|---|
| service_type | Yes | One of the service types listed above. |
| identifier | Yes | Phone number in E.164 format, or an email address. |
| default_country | No | ISO-2 country code used to interpret national-format numbers. |
Response — core fields (every service)
| Field | Type | Description |
|---|---|---|
| id | string | Check UUID. Use it to retrieve the result later. |
| service | string | The service_type that was checked. |
| identifier | string | The normalised identifier that was checked. |
| identifier_type | string | phone or email. |
| status | string | completed — result determined, credit charged; refunded — provider could not determine a result, credit refunded; failed — lookup error, credit refunded (reported with success: false); running/pending — still settling, re-fetch in a moment. |
| registered | bool|null | Whether the identifier is registered. null when the result could not be determined (and you were not charged). |
| charged_usd | number | Amount charged for this check. 0 unless status is completed. |
| billed | bool | true when credit was charged. |
| checked_at | string | When the check completed (ISO 8601). Present on every service. |
Idempotency
Send an Idempotency-Key header to make a retry safe. A
repeated request with the same key returns the original result instead
of charging again.
Response shapes by service
All services return the core fields. Some services add extra fields on top — the exact set depends on the service.
Core response
Same response format for all of these services:
ws, telegram, viber, zalo, facebook, instagram, threads, twitter, vk, amazon, apple, microsoft, shopee, band, goto, hh, indiatimes, netflix, amazon_email, facebook_email, instagram_email, apple_email, spotify_email
{
"success": true,
"data": {
"id": "3f2a8c1e5b7d9f0a2c4e6b8d",
"service": "ws",
"identifier": "+14155552671",
"identifier_type": "phone",
"status": "completed",
"registered": true,
"charged_usd": 0.008,
"billed": true,
"checked_at": "2026-01-01T12:00:00.000Z"
}
}
WhatsApp avatar
Applies to:
ws_avatar
{
"success": true,
"data": {
"id": "3f2a8c1e5b7d9f0a2c4e6b8d",
"service": "ws_avatar",
"identifier": "+14155552671",
"identifier_type": "phone",
"status": "completed",
"registered": true,
"avatar": true,
"avatar_url": "https://pps.whatsapp.net/v/t61.24294-10/461253982_884839163784403557_n.jpg",
"charged_usd": 0.016,
"billed": true,
"checked_at": "2026-01-01T12:00:00.000Z"
}
}
avatar_url is a direct link to the profile photo —
load it in an <img> tag to display the image.
It is an empty string when the account has no photo; use
avatar to tell the two cases apart.
WhatsApp business
Applies to:
ws_business
{
"success": true,
"data": {
"id": "3f2a8c1e5b7d9f0a2c4e6b8d",
"service": "ws_business",
"identifier": "+14155552671",
"identifier_type": "phone",
"status": "completed",
"registered": true,
"business": true,
"charged_usd": 0.016,
"billed": true,
"checked_at": "2026-01-01T12:00:00.000Z"
}
}
Carrier lookup
Applies to:
carrier
{
"success": true,
"data": {
"id": "3f2a8c1e5b7d9f0a2c4e6b8d",
"service": "carrier",
"identifier": "+14155552671",
"identifier_type": "phone",
"status": "completed",
"registered": true,
"carrier": "Vivo",
"number_type": "Mobile",
"country_code": "BR",
"region": "Sao Paulo",
"city": "Sao Paulo",
"charged_usd": 0.004,
"billed": true,
"checked_at": "2026-01-01T12:00:00.000Z"
}
}
For this service registered means the number has an
active carrier allocation. city may be empty
depending on the country's numbering data.
Undocumented email services
Applies to:
gmail_avatar, yandex_avatar, mailru_avatar, yahoo, outlook
{
"success": true,
"data": {
"id": "3f2a8c1e5b7d9f0a2c4e6b8d",
"service": "gmail_avatar",
"identifier": "name@example.com",
"identifier_type": "email",
"status": "completed",
"registered": true,
"charged_usd": 0.006,
"billed": true,
"checked_at": "2026-01-01T12:00:00.000Z"
}
}
These services have no published schema. Any additional field the
provider returns is passed through as-is — for the
*_avatar services this is typically
avatar and avatar_url (a direct image
link, empty string when there is none). Parse defensively and
treat unknown fields as optional.
Other endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/balance | Your current credit balance. |
| GET | /api/v1/services | Enabled services and their prices. |
| GET | /api/v1/check/:id | Retrieve a previous check. |
| GET | /api/v1/batches/:id | Bulk job status and progress. |
| GET | /api/v1/batches/:id/results | Paginated bulk results. |
Errors
Errors return success: false with a human-readable message.
| Status | Meaning |
|---|---|
| 400 | Malformed request or unknown service type. |
| 401 | Missing or invalid API key. |
| 402 | Insufficient credit balance. |
| 403 | Account suspended. |
| 429 | Rate limit exceeded. |
A lookup that runs but cannot be resolved returns HTTP 200 with
success: false — the request was valid, and your credit is
refunded automatically.