Amazon Scraper API vs Proxy: Choose a Product Data Source
Compare seller APIs, licensed Amazon product data and proxy page checks by record, access scope and reuse rights.
Read guideTest JP egress separately from ja-JP content, JPY pricing, postcode validation, and checkout eligibility.

Quick answer: Choose a Japan residential route when the target test requires JP egress and the supplier documents its network class. Verify the exit in the same browser used for the target, then record Japanese language, JPY amount, tax display, postcode validation, and checkout result separately.
Audience: Proxy buyers and developers comparing a permitted market or delivery test. The examples use Python and Playwright; they do not teach general Python syntax.
Prerequisites:
http://host:port, https://host:port, or socks5://host:port form and a test account with a request or traffic limit. Set PROXY_SERVER. Playwright documents proxy username/password settings for HTTP(S) proxies, and Chromium supports no SOCKS5 authentication methods. Use socks5:// only when the supplier permits unauthenticated access; set PROXY_USER and PROXY_PASSWORD separately only for HTTP(S) proxy authentication. Load any credentials from an approved secret manager or environment binding. Playwright documents HTTP proxy authentication; Chromium documents unauthenticated SOCKS5 support.https://httpbin.org/ip through the selected route and to access the intended target.TARGET_URL on an HTTP or HTTPS page, TARGET_EXPECTED_STATUS set to its expected integer response status, and TARGET_BODY_MARKER set to non-sensitive visible text that should appear in that page. Provide all three through the environment; do not embed credentials in the target URL.Install the pinned Python package and its matching Chromium build in the active environment:
python -m pip install playwright==1.58.0
python -m playwright install chromium
Japan uses JP in ISO 3166 country codes and JPY as defined by ISO 4217 currency codes. Use ja-JP and Asia/Tokyo from the IANA time-zone database only when those browser settings belong in the test fixture; neither setting verifies where the proxy exits.
The best Japanese proxy for a city-targeted landing-page test may differ from the best one for a multi-page delivery check. Compare the exact quoted products using the same authorized target sample.
| Ask each supplier | What makes an offer suitable |
|---|---|
| Does this account currently include JP and the required city? | Tokyo city access when the campaign requires it; country access can suffice when Osaka delivery is selected on the site |
| What is the residential definition and sourcing? | Documented network class matching the job, not just a residential label |
| What session duration and replacement rules apply? | Continuity through product, cart and destination steps where required |
| What happens if the city has no matching peer? | A distinguishable no-match response or a fallback the test explicitly allows |
| Does the target accept the result? | Required Japanese page, JPY amount and delivery/account outcome in the same session |
| What terms and charges apply? | Permitted workload, traffic unit, retries, minimum spend and expiry compared per accepted record |
In a hypothetical shortlist, an offer with Tokyo selection but mandatory rotation on every request fits independent campaign observations better than a cart journey requiring one route. A JP offer with documented session continuity may fit that cart journey without a city premium. Neither option earns preference until its target results meet the declared requirements.
Use JP as the ISO 3166 country field and JPY as the ISO 4217 currency field. Use ja-JP when the workflow requires Japanese browser language and Asia/Tokyo as the IANA timezone identifier. Record those inputs alongside the observed values so a later reviewer can see whether the browser context, network path and page result agree.
Japan Post defines Japanese postal codes as seven digits, with a hyphen between the third and fourth digits. Its international addressing guidance also places postal code and country in the address record. For a permitted commerce test, use an authorized Japanese address and record the exact postal-code validation outcome.
Consider two hypothetical purchase requirements. A Tokyo campaign QA job on an owned site needs a Tokyo or agreed metro exit, the approved Japanese campaign headline and landing-page ID with ja-JP and Asia/Tokyo. A global Japanese-language homepage fails if it loses the campaign. An Osaka delivery check instead fixes SKU, seller and an authorized Osaka destination and follows product to cart: accept only the required destination eligibility, JPY offer and tax display. A syntactically valid postcode alone cannot pass that checkout. City routing is worth buying for the first job; it is optional for the second unless the site behavior under test depends on egress city.
| Requirement | Example Japan fixture | Pass condition |
|---|---|---|
| Country exit | requested_country=JP |
A dated lookup reports JP, with source and uncertainty retained |
| City or prefecture | requested_city=Tokyo or the job's required prefecture |
The observed city rule meets the predeclared tolerance |
| Browser context | locale=ja-JP, timezone=Asia/Tokyo |
The browser uses the intended language and clock inputs |
| Delivery | Authorized Japanese address with a seven-digit postcode | The target accepts the selected destination and keeps the result |
| Offer record | currency=JPY, amount, tax display, final URL |
Values are copied from the target; no amount is supplied by the guide |
Tax treatment depends on the target's product category and can change. On 2026-09-15, the National Tax Agency opened an information page describing a draft two-year food tax-rate reduction; the page says the details apply if a bill is passed and enacted. This is not a statement of an enacted or general current rate. Record the rate and amount displayed by the target at test time; do not add a rate based on the IP location or infer the checkout total from a proxy response.
The sample checks the IP echo and then opens the authorized target in the same browser context. It accepts the target only when the final navigation status matches TARGET_EXPECTED_STATUS and visible body text contains TARGET_BODY_MARKER. Neither check proves country egress, residential classification, or a localized offer.
Warning: Each run makes a top-level request to httpbin and navigates to TARGET_URL. The target page may also trigger redirects and subresource requests, so total requests and traffic can exceed those two top-level checks; the supplier may bill according to its own documented units and receives the destinations. Start with a provider sandbox and an owned staging target when available. Without a sandbox, treat the run as a production test: use an authorized target, a low-limit test account, and a preset spend cap.
If an authenticated http:// proxy uses HTTP Basic, credentials travel without TLS protection; RFC 7617 recommends an external secure layer such as TLS. Use the provider's TLS-to-proxy endpoint when available. The proxy and target schemes are separate: an http:// target has no TLS, while an https:// target protects browser-to-target traffic inside the tunnel after setup. Neither upgrades an http:// browser-to-proxy hop or protects Basic credentials sent before the tunnel.
Keep credentials in environment bindings, never in either URL, source files, screenshots, or shared logs. If routing or usage differs from the quote, close the browser, stop the session or revoke its test credentials using the supplier's documented controls, and inspect usage before another request.
import asyncio
import json
import os
from urllib.parse import urlsplit
from playwright.async_api import async_playwright
# Configuration comes from the approved environment binding; never print these values.
PROXY_SERVER = os.getenv("PROXY_SERVER")
PROXY_USER = os.getenv("PROXY_USER")
PROXY_PASSWORD = os.getenv("PROXY_PASSWORD")
TARGET_URL = os.getenv("TARGET_URL")
TARGET_EXPECTED_STATUS = os.getenv("TARGET_EXPECTED_STATUS")
TARGET_BODY_MARKER = os.getenv("TARGET_BODY_MARKER")
NAVIGATION_TIMEOUT_MS = 20000
BODY_MARKER_TIMEOUT_MS = 10000
LOCALE = "ja-JP"
TIMEZONE = "Asia/Tokyo"
async def main():
if bool(PROXY_USER) != bool(PROXY_PASSWORD):
raise ValueError("Provide both proxy credentials or neither")
try:
proxy_parts = urlsplit(PROXY_SERVER or "")
proxy_port = proxy_parts.port
except ValueError as error:
raise ValueError("Set PROXY_SERVER to a documented host:port endpoint without credentials") from error
if (
proxy_parts.scheme not in {"http", "https", "socks5"}
or not proxy_parts.hostname
or not proxy_port
or proxy_parts.username is not None
or proxy_parts.password is not None
):
raise ValueError("Set PROXY_SERVER to a documented HTTP(S) or SOCKS5 endpoint without credentials")
if proxy_parts.scheme == "socks5" and (PROXY_USER or PROXY_PASSWORD):
raise ValueError("Use SOCKS5 without proxy credentials; this example supports credentials only for HTTP(S) proxies")
try:
target_parts = urlsplit(TARGET_URL or "")
except ValueError as error:
raise ValueError("Set TARGET_URL to a permitted HTTP(S) page without embedded credentials") from error
if (
target_parts.scheme not in {"http", "https"}
or not target_parts.hostname
or target_parts.username is not None
or target_parts.password is not None
):
raise ValueError("Set TARGET_URL to a permitted HTTP(S) page without embedded credentials")
try:
expected_status = int(TARGET_EXPECTED_STATUS or "")
except ValueError as error:
raise ValueError("Set TARGET_EXPECTED_STATUS to the expected integer status code") from error
if not 100 <= expected_status <= 599:
raise ValueError("Set TARGET_EXPECTED_STATUS to an HTTP status from 100 through 599")
if not TARGET_BODY_MARKER or not TARGET_BODY_MARKER.strip():
raise ValueError("Set TARGET_BODY_MARKER to non-sensitive visible text expected on the target page")
proxy = {"server": PROXY_SERVER}
if PROXY_USER:
proxy.update(username=PROXY_USER, password=PROXY_PASSWORD)
async with async_playwright() as playwright:
browser = await playwright.chromium.launch()
try:
context = await browser.new_context(
proxy=proxy, locale=LOCALE, timezone_id=TIMEZONE
)
try:
page = await context.new_page()
echo_response = await page.goto(
"https://httpbin.org/ip",
wait_until="domcontentloaded",
timeout=NAVIGATION_TIMEOUT_MS,
)
if echo_response is None or echo_response.status != 200:
raise RuntimeError("IP echo request failed")
echo_payload = json.loads(await page.locator("body").inner_text(timeout=BODY_MARKER_TIMEOUT_MS))
origin = echo_payload.get("origin")
if not isinstance(origin, str) or not origin:
raise RuntimeError("IP echo did not return an address")
target_response = await page.goto(
TARGET_URL,
wait_until="domcontentloaded",
timeout=NAVIGATION_TIMEOUT_MS,
)
if target_response is None or target_response.status != expected_status:
raise RuntimeError("Target response did not match TARGET_EXPECTED_STATUS")
marker = page.get_by_text(TARGET_BODY_MARKER, exact=False).first
await marker.wait_for(state="visible", timeout=BODY_MARKER_TIMEOUT_MS)
body_text = await page.locator("body").inner_text(
timeout=BODY_MARKER_TIMEOUT_MS
)
if TARGET_BODY_MARKER not in body_text:
raise RuntimeError("Target body did not contain TARGET_BODY_MARKER")
print({
"observed_exit": origin,
"target_status": target_response.status,
"body_marker_found": True,
"locale": LOCALE,
"timezone": TIMEZONE,
})
finally:
await context.close()
finally:
await browser.close()
asyncio.run(main())
Illustrative expected output (the address is redacted; the values are not a country or target measurement):
{'observed_exit': '<redacted public IP>', 'target_status': 200, 'body_marker_found': True, 'locale': 'ja-JP', 'timezone': 'Asia/Tokyo'}
Save the example as japan-probe.py and run it after loading the environment values:
python japan-probe.py
Set PROXY_SERVER, TARGET_URL, TARGET_EXPECTED_STATUS, and TARGET_BODY_MARKER in the approved environment; set both proxy credentials only if required. Playwright's page navigation and locator wait use bounded timeouts here: 20,000 ms per navigation and 10,000 ms for visible marker text. The script opens the target in the same configured context after the IP echo, then closes the context. A timeout or status/marker mismatch fails the check. These response checks do not establish country or city egress, a residential network, a delivery address, or a purchasable offer. Compare the returned IP with a dated lookup and verify country-specific business fields in an authorized target workflow. Redact the IP and target details before sharing logs.
Keep PROXY_SERVER and optional credentials outside source control and terminal transcripts. Compare the returned address with a named, dated geolocation or ASN service. MaxMind's documentation explains why city-level IP results should retain an accuracy radius or equivalent uncertainty. ja-JP and Asia/Tokyo make a controlled browser context; they cannot turn a non-Japanese exit into a Japanese one.
The code checks the configured target page response in the same context as the IP echo. For an offer decision, compare observed JP egress, page language, delivery address, JPY amount, tax display, and checkout eligibility against the fixture.
An IP lookup that returns JP while the page remains in English with USD pricing and a US delivery address is not a Japanese offer. A Japanese page showing JPY can still reject the destination or require an account region. A redirect to login, a blocked target, or a missing tax line is a result category to preserve, not a reason to retry until the record looks local.
| Symptom | Check | Next action |
|---|---|---|
| Proxy returns an authentication error | The endpoint or credential format may not match the quoted product | If the response is 407, confirm the server and separate credentials with the supplier’s official setup guide; do not copy username formats from another provider |
| A seven-digit postcode is rejected | Formatting alone does not establish a valid destination or account | Check the authorized address against Japan Post's current lookup, then record the target's validation result |
| JPY appears but checkout fails | Currency is only one offer field | Keep the rejection, tax display, and delivery eligibility as separate results; do not infer a final payable amount |
| The city lookup falls outside the declared tolerance | IP location is approximate | Preserve the lookup source and uncertainty, then reject or reclassify the route against the predeclared rule |
Residential, datacenter, and mobile are separate network choices. Use residential when the Japanese target or acceptance rule requires an end-user network class and the supplier documents its sourcing. Use datacenter when a server-side route is acceptable for the workload. Treat mobile as a separate product with its own inventory and terms; a Japanese residential route does not establish mobile identity. The residential versus datacenter guide and mobile and ISP guide describe the comparison.
Decide whether the same exit must survive the Japanese page sequence. A sticky session keeps the network variable stable while the test records language, postcode and tax fields. A rotating session changes the exit and may change the page response or account state, so record the session policy with every observation. Use the rotation and sticky-session guide when comparing providers.
Set a budget from the actual job: requests, bytes, retries, accepted records and any minimum or expiry condition. A JPY price on the target is only one output field; the route earns its place when it produces the required localized result with an acceptable failure and rework cost. The residential buying guide and cost-per-successful-request guide provide the accounting frame.
Scale your workflows with the tools you already use. Rotating or sticky sessions up to 72 hours.
Compare seller APIs, licensed Amazon product data and proxy page checks by record, access scope and reuse rights.
Read guideChoose the right anti-detect browser proxy guide, map the shared verification steps, and keep account access separate from the network route.
Read guideOur picks for market research: ProxyLane for small, intermittent projects, plus options for regional tracking, monthly collection and managed extraction.
Read guide