The Amazon e-mail check answers whether an e-mail address is used for an Amazon customer account. It runs in real time and in bulk jobs, and returns registered: true, false or null (unknown) for each address, with the time we checked. Nothing is sent to the address, and no name, order history or profile is returned.
What does the Amazon e-mail check tell you?
It tells you whether Amazon has a customer account that signs in with this address. Amazon accounts can use either an e-mail address or a mobile number as their sign-in. This check covers the e-mail side. The Amazon number check covers phone numbers.
registered: true: an Amazon account is associated with the address.registered: false: a conclusive "no account".registered: null: no conclusive answer.statusandreasonexplain why, and you are not charged.
A "yes" shows that someone once completed Amazon's sign-up with this address. That is a small but real sign that the address is in active use. It says nothing about who holds the account.
Who uses it, and why?
- E-commerce and marketplace sign-ups. Online shops and marketplaces use it as one extra signal at registration or checkout, next to the mailbox check. A fabricated address rarely has an account at a large retailer. See OTP and sign-up fraud.
- Account security. When a customer changes the e-mail on an existing account, the check is one input into a risk score. See account security.
What do you get back?
| Field | Type | Meaning |
|---|---|---|
email, email_status | string, enum | Normalized address; valid, invalid_email, duplicate or suppressed |
checks["amazon.email"].registered | boolean or null | true account exists, false none, null unknown |
…status, …reason | enum, string | Outcome, and why an answer is not conclusive |
…confidence, …checked_at | enum, timestamp | How sure the answer is, and when it was obtained |
…cached, …billed | boolean | Cache hit, and whether it was charged |
How is it billed?
You pay per address with a conclusive answer. Real-time and bulk have separate prices, shown on pricing. You're not charged for inconclusive results (unknown, unsupported country, timeout, invalid, duplicate). Cache hits inside the freshness window are free. max_age: 0 forces a fresh, billed check.
What are the limits?
The check runs in real time (POST /v1/lookup, up to 100 numbers and e-mails) and in bulk (POST /v1/jobs, up to 50,000). Use the code amazon.email. The alias amazon means the phone-number check. A request can hold up to 20 checks. Requests that look like sequential number ranges or generated e-mail lists are rejected: 20 or more addresses in one request on one domain that differ only by digits or separators, or, with live keys, 50 or more of one such pattern per account per UTC day. The daily cap counts e-mails like numbers.
How do I use it responsibly?
Check addresses of your own customers and users, for fraud prevention and account protection. We never read mailboxes or send e-mail to the address, and the answer is only yes, no or unknown. Don't use the check to find out whether a particular person shops on Amazon, and don't use it to build marketing lists. The acceptable use policy forbids both. Anyone can object through the opt-out form.
Example request
curl https://api.mobilevalidate.com/v1/lookup \
-H "Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym" \
-H "Content-Type: application/json" \
-d '{"emails":["registered@test.mobilevalidate.com"],"checks":["amazon.email"]}'// npm install mobilevalidate · Node.js 20+ · save as check.mjs and run: node check.mjs
import { MobileValidate } from "mobilevalidate";
// Omit apiKey to read MOBILEVALIDATE_API_KEY from the environment.
const mv = new MobileValidate({ apiKey: "mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym" });
const { data, error } = await mv.lookup({
emails: ["registered@test.mobilevalidate.com"],
checks: ["amazon.email"],
});
if (error) console.error(error.code, error.message);
else console.dir(data.results, { depth: null });// Node.js 18+, Deno, Bun or the browser console (ES module: save as .mjs or use "type": "module").
const res = await fetch("https://api.mobilevalidate.com/v1/lookup", {
method: "POST",
headers: {
Authorization: "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym",
"Content-Type": "application/json",
},
body: JSON.stringify({
emails: ["registered@test.mobilevalidate.com"],
checks: ["amazon.email"],
}),
});
console.log(res.status, res.headers.get("x-request-id"));
console.dir(await res.json(), { depth: null });# pip install mobilevalidate-sdk
from mobilevalidate import MobileValidate
# Omit api_key to read MOBILEVALIDATE_API_KEY from the environment.
mv = MobileValidate(api_key="mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym")
result = mv.lookup(
emails=["registered@test.mobilevalidate.com"],
checks=["amazon.email"],
)
print(result)<?php
$ch = curl_init('https://api.mobilevalidate.com/v1/lookup');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'emails' => ['registered@test.mobilevalidate.com'],
'checks' => ['amazon.email'],
]),
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_RESPONSE_CODE), PHP_EOL, $response, PHP_EOL;package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{"emails":["registered@test.mobilevalidate.com"],"checks":["amazon.email"]}`)
req, err := http.NewRequest("POST", "https://api.mobilevalidate.com/v1/lookup", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}require "net/http"
require "json"
uri = URI("https://api.mobilevalidate.com/v1/lookup")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym"
req["Content-Type"] = "application/json"
req.body = JSON.generate({
"emails" => ["registered@test.mobilevalidate.com"],
"checks" => ["amazon.email"]
})
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
puts res.code, res.bodyRuns as pasted with the public sandbox key, which answers the test values only. In the SDKs, omit the key to use MOBILEVALIDATE_API_KEY.
Response (excerpt, test mode: the first item of results):
{
"kind": "email",
"input": "registered@test.mobilevalidate.com",
"email": "registered@test.mobilevalidate.com",
"email_status": "valid",
"e164": null,
"country": null,
"checks": {
"amazon.email": {
"service": "amazon.email",
"status": "completed",
"registered": true,
"attributes": null,
"confidence": "high",
"confidence_score": 0.99,
"checked_at": "2026-09-25T14:25:45.701Z",
"cached": false,
"age_seconds": 0,
"billed": false,
"reason": null,
"poll_after_ms": null
}
},
"test": true
}Try it now
Run it here with a test value: the console calls the live API from your browser with the public sandbox key and shows the real JSON and a plain-English verdict.
POST /v1/lookup
Public sandbox key · test values only · never billed
Pick a test value or press Run
Press Run or pick a test value above: the console sends a real request to the API with the public sandbox key and shows the answer here.
No response body.curl https://api.mobilevalidate.com/v1/lookup \
-H "Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym" \
-H "Content-Type: application/json" \
-d '{"emails":["registered@test.mobilevalidate.com"],"checks":["amazon.email"]}'Check your own addresses: 20 phone numbers and 10 e-mail addresses are checked for real, free, after sign-up. Start free
checks: ["amazon.email"] · Realtime lookup via POST /v1/lookup. Every example runs as pasted: it uses the public sandbox key, which answers the test values for free. In the SDKs, omit the key to use MOBILEVALIDATE_API_KEY.
curl https://api.mobilevalidate.com/v1/lookup \
-H "Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym" \
-H "Content-Type: application/json" \
-d '{"emails":["registered@test.mobilevalidate.com"],"checks":["amazon.email"]}'// npm install mobilevalidate · Node.js 20+ · save as check.mjs and run: node check.mjs
import { MobileValidate } from "mobilevalidate";
// Omit apiKey to read MOBILEVALIDATE_API_KEY from the environment.
const mv = new MobileValidate({ apiKey: "mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym" });
const { data, error } = await mv.lookup({
emails: ["registered@test.mobilevalidate.com"],
checks: ["amazon.email"],
});
if (error) console.error(error.code, error.message);
else console.dir(data.results, { depth: null });// Node.js 18+, Deno, Bun or the browser console (ES module: save as .mjs or use "type": "module").
const res = await fetch("https://api.mobilevalidate.com/v1/lookup", {
method: "POST",
headers: {
Authorization: "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym",
"Content-Type": "application/json",
},
body: JSON.stringify({
emails: ["registered@test.mobilevalidate.com"],
checks: ["amazon.email"],
}),
});
console.log(res.status, res.headers.get("x-request-id"));
console.dir(await res.json(), { depth: null });# pip install mobilevalidate-sdk
from mobilevalidate import MobileValidate
# Omit api_key to read MOBILEVALIDATE_API_KEY from the environment.
mv = MobileValidate(api_key="mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym")
result = mv.lookup(
emails=["registered@test.mobilevalidate.com"],
checks=["amazon.email"],
)
print(result)<?php
$ch = curl_init('https://api.mobilevalidate.com/v1/lookup');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'emails' => ['registered@test.mobilevalidate.com'],
'checks' => ['amazon.email'],
]),
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_RESPONSE_CODE), PHP_EOL, $response, PHP_EOL;package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{"emails":["registered@test.mobilevalidate.com"],"checks":["amazon.email"]}`)
req, err := http.NewRequest("POST", "https://api.mobilevalidate.com/v1/lookup", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}require "net/http"
require "json"
uri = URI("https://api.mobilevalidate.com/v1/lookup")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym"
req["Content-Type"] = "application/json"
req.body = JSON.generate({
"emails" => ["registered@test.mobilevalidate.com"],
"checks" => ["amazon.email"]
})
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
puts res.code, res.body// .mcp.json (Claude Code), ~/.cursor/mcp.json (Cursor) or .vscode/mcp.json ("servers" instead of "mcpServers")
{
"mcpServers": {
"mobilevalidate": {
"type": "http",
"url": "https://mcp.mobilevalidate.com/mcp",
"headers": { "Authorization": "Bearer ${MOBILEVALIDATE_API_KEY}" }
}
}
}
// Then ask your agent, e.g.:
// "Check registered@test.mobilevalidate.com with amazon.email" → tool: lookup_emailsThe hosted MCP server is live for customers with an agent key (mv_agent_…) or a test key. Or run it locally with npx -y @mobilevalidate/mcp.
Real test-mode result for this check
{
"service": "amazon.email",
"status": "completed",
"registered": true,
"attributes": null,
"confidence": "high",
"confidence_score": 0.99,
"checked_at": "2026-09-25T14:25:29.021Z",
"cached": false,
"age_seconds": 0,
"billed": false,
"reason": null,
"poll_after_ms": null
}What you get
Fields of checks["amazon.email"], generated from the public service catalog.
| Field | Type | Meaning |
|---|---|---|
| registered | boolean | null | true = found, false = not found, null = unknown (not charged). |
| status | enum | completed, pending, unknown, unsupported_country or failed. |
| checked_at | timestamp | When the answer was obtained. |
Frequently asked questions
Does the check reveal anything about the Amazon account?
No. It only answers whether an Amazon account is associated with the address: yes, no or unknown. No name, order history, address or profile is returned, and nothing is sent to the address.
Can I check phone numbers too?
Yes. Amazon accounts can also use a mobile number as their sign-in. Use the Amazon number check for phone numbers.
Is the check available in real time?
Yes. Send it with POST /v1/lookup using the code amazon.email. It also runs in bulk jobs.
What does an unknown answer cost?
Nothing. Unknown answers have registered set to null and are not charged.
Is there a free amazon account check by e-mail?
Yes, to try it on your own data: create a free account and check up to 10 e-mail addresses for real on the dashboard's Try it page, at no cost. Test mode with documented test values is free and unlimited. After that, a amazon account check by e-mail costs $0.001 per check in real time ($1.00 per 1,000) and $0.0008 in bulk jobs ($0.80 per 1,000), paid from prepaid credit. Unknown and other inconclusive results are always free.

