Through the sales team on our 24/7 live chat
On this page 19 sections
Status: in development
The APIs below are designed and priced, and they are not open for calls yet. Use this page to plan an integration; ask sales for access and the go-live date. Every API runs on ProxyField's own pool, is billed on successful results only, and is paid from the same crypto balance as your proxies.
| API | Endpoint | Returns | One billable result | Price per 1,000 successful results |
|---|---|---|---|---|
| Google SERP API | POST /v1/google/search | one Google results page as JSON: organic results, ads, the AI Overview, People Also Ask, the local pack, featured snippet, knowledge panel, inline shopping, top stories, related searches | one results page | $1.20, from $0.80 |
| Google AI Mode API | POST /v1/google/ai-mode | the AI Mode answer as text, Markdown and blocks, with its cited sources | one answer | $1.50, from $1.00 |
| ChatGPT scraper API | POST /v1/chatgpt | the ChatGPT answer, its citations, the web searches it ran, product cards | one answer | $1.50, from $1.00 |
| Perplexity scraper API | POST /v1/perplexity | the Perplexity answer, its sources, the follow-up questions it suggests | one answer | $1.50, from $1.00 |
| Web Scraping API | POST /v1/scrape | any URL as HTML, Markdown, text, a JSON envelope or a screenshot; plain HTTP or JavaScript rendering | one page fetched | HTTP $0.50, from $0.20; JS rendering $2.00, from $1.00 |
| Amazon scraper API | POST /v1/amazon/product, POST /v1/amazon/search | a product page, or a search or category results page, parsed | one product page or one results page | $0.60, from $0.30 |
| Google Maps scraper API | POST /v1/google/maps | one page of Google Maps results, up to 20 places, parsed | one results page | $1.50, from $1.00 |
The lower price in each row is the volume price: it applies from 10,000 successful results in one purchase.
Authentication
Send your API key in the Authorization header of every request:
Authorization: Bearer <api_key>The header is the only place the key goes: the API takes no key in the query string, because URLs end up in logs. Your key is created in the ProxyField dashboard once sales opens access. A missing or unknown key returns 401 invalid_api_key, which is not billed.
Base URL and versions
All endpoints live under https://api.proxyfield.io/v1. A version only grows: new optional parameters, new response fields and new values of a field can appear within v1, so your code should ignore fields it does not know. Removing or renaming anything needs v2.
Requests
- Every endpoint takes
POSTwith a JSON body (Content-Type: application/json, UTF-8). - An unknown parameter returns
400 invalid_parameter, so a typo does not pass silently.nullmeans "use the default". - A parameter that only works with another one, such as
wait_forwithoutrender: true, returns400 unsupported_combination. - Two parameters work on every endpoint:
| Parameter | Type | Default | Allowed values | What it does |
|---|---|---|---|---|
timeout | integer | 120000 | 10000–180000 ms | How long we keep trying, retries included. When it runs out, the answer is 504 timeout, which is not billed |
tag | string | null | up to 255 characters | Your own label, returned in metadata.tag and in job callbacks |
Responses
Parsed endpoints return one JSON object with three parts: metadata, parameters (your request with the defaults filled in) and the API's own blocks.
metadata field | Meaning |
|---|---|
id | the request id, the same as the X-Request-Id header |
api | which API answered, such as google_search |
status | success (a result was delivered and billed) or no_result (AI APIs only: the engine showed no answer; not billed) |
billed | true if this response counts as one successful result |
cached | true if the result came from the 1-hour cache (Google search and Maps) |
created_at, processed_at | ISO 8601 times in UTC |
html_url | the raw HTML behind the parsed result, kept 48 hours and free to download |
tag | your tag, or null |
Field rules:
- Every field is always present. A block that is not on the page comes back as
nullor[], never missing. - Names are snake_case. Links are
url, every link has itsdomain, and every list item has a 1-basedposition. - AI answers share one citation shape:
citations[]of{position, title, url, domain, snippet}. Text blocks point to them withcitations: [1, 2].
Response headers, on every response including errors:
| Header | Meaning |
|---|---|
X-Request-Id | the request id |
X-Billed | true if this response counts as one successful result |
X-Cache | hit or miss (Google search and Maps) |
X-Concurrency-Limit, X-Concurrency-Remaining | the requests your account may run at once, and how many are free now |
X-Target-Status, X-Final-Url | Web Scraping API: the site's status code and the URL after redirects |
Retry-After | on 429 only |
Countries and locations
Every API accepts the proxy pool's 195+ countries.
- Google endpoints use Google's own names:
gl(country of the results, a two-letter code),hl(interface language),google_domain, andlocation(a canonical name such asAustin,Texas,United States). The request leaves from an IP in theglcountry. Find canonical names withGET /v1/google/locations?q=austin&gl=us&limit=20, which returnslocations[]of{canonical_name, name, type, country_code}and is not billed. - The other endpoints use
country, a two-letter code in lowercase. - A country the API does not accept returns
400 unsupported_country. Postal-code locations are not part of the first version.
Google SERP API: POST /v1/google/search
One request returns one Google results page, with the AI Overview, People Also Ask and the local pack parsed.
| Parameter | Type | Default | Allowed values | Notes |
|---|---|---|---|---|
q | string | required | 1–700 characters | The query; Google operators such as site: and quotes work |
gl | string | us | two-letter country code | Country of the results; the request leaves from an IP there |
hl | string | en | de, fr, en-gb, es-419 … | Interface language |
google_domain | string | google.com | any google.* domain | Results are localised by gl and hl, not by the domain |
location | string | null | a canonical country, region or city name | Not with uule |
uule | string | null | Google's encoded location | Not with location |
device | string | desktop | desktop, mobile | |
page | integer | 1 | 1–10 | About 10 organic results a page; each page is one billed result |
safe | string | off | active, off | SafeSearch |
output | string | json | json, html, markdown | html and markdown return the page itself, billed the same |
no_cache | boolean | false | Skip the 1-hour cache |
There is no num parameter: Google stopped serving 100 results on one page in September 2025, so a deeper rank check reads several pages, each one billed. When Google loads the AI Overview after the page, the API fetches it in the same request at no extra charge; ai_overview.status is present, absent or error. People Also Ask is returned as the page shows it, never expanded by clicking.
| Block | Fields |
|---|---|
search_information | query_displayed, total_results, spelling_correction |
ai_overview | status, text_blocks[] (type, text, items[], citations[]), citations[], markdown |
ads[] | position, block (top or bottom), title, url, displayed_url, domain, description |
organic_results[] | position (counted across pages), title, url, displayed_url, domain, snippet, date, sitelinks[] |
related_questions[] | People Also Ask: position, question, answer, source |
local_results | places[]: position, title, place_id, rating, reviews_count, price_level, category, address, phone, hours_summary, website, gps_coordinates |
featured_snippet | title, url, domain, snippet |
knowledge_graph | title, type, description, source, website, attributes |
shopping_results[] | position, title, price, extracted_price, currency, merchant, url, rating, reviews_count |
top_stories[] | position, title, url, source, date |
related_searches[] | position, query |
pagination | current_page, next_page |
# The request the Google SERP API takes (access through Contact sales)
curl https://api.proxyfield.io/v1/google/search \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{"q": "espresso machine", "gl": "us", "hl": "en", "location": "Austin,Texas,United States"}'{
"metadata": {"id": "req_7f3c9a1e52d84b0c", "api": "google_search", "status": "success", "billed": true, "cached": false, "html_url": "https://api.proxyfield.io/v1/requests/req_7f3c9a1e52d84b0c/html", "tag": null},
"ai_overview": {"status": "present", "markdown": "An espresso machine forces hot water through finely ground coffee at about 9 bar of pressure [1][2]. ...", "citations": [{"position": 1, "title": "Espresso machine", "url": "https://en.wikipedia.org/wiki/Espresso_machine", "domain": "en.wikipedia.org", "snippet": "An espresso machine brews coffee by forcing pressurized water near boiling point through a puck of ground coffee."}]},
"organic_results": [{"position": 1, "title": "Espresso machine - Wikipedia", "url": "https://en.wikipedia.org/wiki/Espresso_machine", "displayed_url": "en.wikipedia.org › wiki › Espresso_machine", "domain": "en.wikipedia.org", "snippet": "An espresso machine brews coffee by forcing pressurized water near boiling point through a puck of ground coffee and a filter.", "date": null, "sitelinks": []}],
"related_questions": [{"position": 1, "question": "What is the difference between espresso and coffee machines?", "answer": "Espresso machines use pressure to push water through finely ground coffee, while drip machines let water flow through coarser grounds by gravity.", "source": {"title": "Espresso vs drip coffee", "url": "https://www.example-coffee-guide.com/espresso-vs-drip", "domain": "www.example-coffee-guide.com"}}],
"pagination": {"current_page": 1, "next_page": 2}
}The example is shortened; a full response has every block of the table, null or [] where the page has none.
Google AI Mode API: POST /v1/google/ai-mode
One request is one prompt and returns one answer.
| Parameter | Type | Default | Allowed values | Notes |
|---|---|---|---|---|
q | string | required | 1–400 characters | The prompt |
gl | string | us | two-letter country code | |
hl | string | en | as on the SERP API | |
location | string | null | a canonical country, region or city name | |
device | string | desktop | desktop, mobile |
The response holds answer_text, answer_markdown (with [n] source markers), text_blocks[] (paragraphs, lists and tables) and citations[]. If Google shows no AI Mode answer, metadata.status is no_result, the answer fields are null and nothing is billed. Follow-up questions in the same conversation are not part of the first version. The AI Overview inside a normal results page comes from the Google SERP API.
ChatGPT scraper API: POST /v1/chatgpt
Each prompt is asked in a fresh conversation and returns that one answer.
| Parameter | Type | Default | Allowed values | Notes |
|---|---|---|---|---|
prompt | string | required | 1–4,000 characters | |
country | string | us | two-letter country code | The country the question is asked from |
web_search | boolean | true | Ask with web search on; web_search_used reports whether ChatGPT searched | |
include_html | boolean | false | Also return answer_html |
| Field | Meaning |
|---|---|
answer_text, answer_markdown, answer_html | the answer; answer_html only with include_html |
model | the model name if the page shows one, else null |
web_search_used | whether ChatGPT searched the web for this answer |
citations[] | the sources cited in the answer |
search_queries[] | the web searches ChatGPT ran for the answer, when shown, at no extra charge |
products[] | product cards: position, title, price, extracted_price, currency, rating, reviews_count, merchant, url |
# The request the ChatGPT scraper API takes (access through Contact sales)
curl https://api.proxyfield.io/v1/chatgpt \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{"prompt": "What are good lightweight trail running shoes for beginners?", "country": "us", "web_search": true}'{
"metadata": {"id": "req_c40e8b2a9f1d6377", "api": "chatgpt", "status": "success", "billed": true, "cached": false, "tag": "brand-monitor-us"},
"model": null,
"web_search_used": true,
"answer_markdown": "For beginners, look for a trail shoe with a **moderate drop**, a protective but flexible sole and **lugs of about 4 to 5 mm** [1]. ...",
"citations": [{"position": 1, "title": "Trail running shoes: a beginner's guide", "url": "https://www.example-running.com/trail-shoes-beginners", "domain": "www.example-running.com", "snippet": "Lug depth and drop matter more than brand."}],
"search_queries": [],
"products": []
}AI answers can take longer than a page fetch, so large runs go best as jobs (see Jobs and batches).
Perplexity scraper API: POST /v1/perplexity
| Parameter | Type | Default | Allowed values | Notes |
|---|---|---|---|---|
prompt | string | required | 1–8,000 characters | |
country | string | us | two-letter country code | |
include_html | boolean | false | Also return answer_html |
The response holds answer_text, answer_markdown (with [n] markers that point to the numbered sources), answer_html, model (or null), citations[] and related_questions[], the follow-ups Perplexity suggests. Each prompt returns that one answer and no data from any account.
Web Scraping API: POST /v1/scrape
Any public URL, fetched over plain HTTP or loaded in a browser. render alone decides the price: false is the HTTP price, true the JavaScript-rendering price.
| Parameter | Type | Default | Allowed values | Notes |
|---|---|---|---|---|
url | string | required | an absolute http(s) URL, up to 8,192 characters | |
render | boolean | false | false: plain HTTP; true: loaded in a browser | |
method | string | GET | GET, POST, PUT | |
body | string | null | up to 1 MB | For POST and PUT |
headers | object | none | string values | Sent to the site as given |
cookies | string | null | name=value; name2=value2 | |
country | string | any | two-letter country code | The exit IP's country; there is no city setting |
session_id | string | null | up to 64 characters: letters, digits, _ and - | The same exit IP for requests with the same id, for up to 10 minutes |
device | string | desktop | desktop, mobile | |
wait | integer | 0 | 0–35000 ms | Extra wait after load (render only) |
wait_for | string | null | a CSS selector, or XPath if it starts with / | Wait until it appears (render only) |
wait_until | string | domcontentloaded | domcontentloaded, load, networkidle | The page event that counts as loaded (render only) |
actions | array | [] | up to 20 actions | Browser actions, run in order (render only) |
block_resources | boolean | true | Skip images, fonts and media (render only; off for screenshots) | |
window_width, window_height | integer | 1920, 1080 | 320–3840 | |
output | string | html | html, markdown, text, json, screenshot | screenshot returns a PNG and needs render |
screenshot | boolean | false | Also take a PNG, returned base64 with output: json (render only) | |
screenshot_full_page | boolean | false | The whole page, not only the window | |
follow_redirects | boolean | true |
Action type | Fields | Does |
|---|---|---|
click | selector | clicks the first match |
fill | selector, value | types into a field |
scroll | to: "bottom" or y (pixels) | scrolls the page |
wait | ms (up to 10000) | waits |
wait_for | selector, timeout_ms (up to 30000) | waits for an element |
evaluate | script (up to 10,000 characters) | runs JavaScript; its return value goes to actions_log[].result |
infinite_scroll | max_count (up to 50), delay_ms (up to 5000) | scrolls until nothing new loads or max_count is reached |
output: html, markdown or text returns the body itself, with the site's status code in X-Target-Status and the URL after redirects in X-Final-Url. output: json returns metadata, parameters, status_code, final_url, content_type, headers (the site's), cookies[], content, screenshot (base64 or null) and actions_log[]. Blocked pages are retried on new IPs within timeout, and the retries are not billed. If no valid page comes back in time, the answer is 502 target_unavailable with the site's last status, not billed.
# The request the Web Scraping API takes (access through Contact sales)
curl https://api.proxyfield.io/v1/scrape \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.example-shop.com/category/grinders?page=2", "render": true, "wait_for": ".product-card", "country": "gb", "output": "json", "actions": [{"type": "click", "selector": "#accept-cookies"}, {"type": "scroll", "to": "bottom"}]}'{
"metadata": {"id": "req_41ac7e93d05f2b68", "api": "web_scrape", "status": "success", "billed": true, "cached": false, "html_url": null, "tag": null},
"status_code": 200,
"final_url": "https://www.example-shop.com/category/grinders?page=2",
"content_type": "text/html; charset=utf-8",
"cookies": [{"name": "consent", "value": "accepted", "domain": ".example-shop.com", "path": "/"}],
"content": "<!DOCTYPE html><html lang=\"en-GB\"><head><title>Grinders - page 2</title></head><body>...</body></html>",
"screenshot": null,
"actions_log": [{"type": "click", "ok": true}, {"type": "scroll", "ok": true}]
} Amazon scraper API: POST /v1/amazon/product and POST /v1/amazon/search
Two operations: one product page, or one search or category results page.
| Parameter | Operation | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|
asin | product | string | null | 10 characters, A-Z 0-9 | Send asin or url |
url | product, search | string | null | a product page, or a search or category results page | |
query | search | string | null | up to 500 characters | Send query or url |
domain | both | string | com | com, co.uk, de, fr, it, es, ca, co.jp | The marketplace: the part after amazon. |
zip_code | both | string | null | a 5-digit US ZIP code, domain: com only | Prices, delivery and stock as Amazon shows them for that delivery ZIP |
locale | both | string | null | e.g. en_US, es_US, de_DE | Must be a language the marketplace offers |
page | search | integer | 1 | 1–20 | Each page is one billed result |
sort_by | search | string | featured | featured, price_low_to_high, price_high_to_low, average_review, newest, best_sellers |
The first version covers amazon.com, amazon.co.uk, amazon.de, amazon.fr, amazon.it, amazon.es, amazon.ca and amazon.co.jp; another marketplace returns 400 unsupported_marketplace. The zip_code is Amazon's own delivery setting on amazon.com, not a way to pick the IP.
- Product:
asin,parent_asin,url,title,brand,price,price_strikethrough,currency,discount_percentage,coupon,stock,is_prime,delivery[],delivery_location,buybox(seller_name,seller_id,fulfilled_by_amazon),other_sellers_count,rating,reviews_count,sales_rank[],categories[],bullet_points[],description,images[],variations[],product_details. - Search:
results[]withposition,organic_position,sponsored_position,is_sponsored,asin,title,url,image,price,price_strikethrough,currency,rating,reviews_count,sales_volume,is_prime,is_amazons_choice,is_best_seller; pluspage,last_pageandtotal_results. A results page with no products is still a result. - An ASIN or URL with no product page returns
404 target_not_found, not billed. Review pages, the offers list and best-seller lists are not part of the first version.
# The request the Amazon scraper API takes (access through Contact sales)
curl https://api.proxyfield.io/v1/amazon/product \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-d '{"asin": "B0EXAMPLE7", "domain": "com", "zip_code": "10001"}' Google Maps scraper API: POST /v1/google/maps
One request returns one results page of up to 20 places.
| Parameter | Type | Default | Allowed values | Notes |
|---|---|---|---|---|
q | string | required | 1–700 characters | What to search for, such as coffee roasters |
ll | string | null | @latitude,, zoom 3–21 | The map centre and zoom; send ll or location |
location | string | null | a canonical region or city name | Instead of ll |
gl | string | us | two-letter country code | |
hl | string | en | as on the SERP API | |
page | integer | 1 | 1–6 | Up to 20 places a page; each page is one billed result |
no_cache | boolean | false | Skip the 1-hour cache |
Each place in places[] has position (counted across pages), title, place_id, address, phone, website, domain, rating, reviews_count, price_level, category, categories[], gps_coordinates, open_state, hours (per weekday), service_options, thumbnail and description; pagination gives current_page, next_page and places_on_page. Review texts, emails and single-place details are not part of the first version.
{
"metadata": {"id": "req_5d2e7a9c0b4f8136", "api": "google_maps", "status": "success", "billed": true, "cached": false, "tag": null},
"parameters": {"q": "coffee roasters", "ll": "@30.2672,-97.7431,14z", "location": null, "gl": "us", "hl": "en", "page": 1},
"places": [{"position": 1, "title": "Example Roasting Co.", "place_id": "ChIJexample0101AustinTX", "address": "507 Example Ave, Austin, TX 78702", "phone": "+1 512-555-0187", "website": "https://www.example-roasting.com/", "domain": "www.example-roasting.com", "rating": 4.8, "reviews_count": 1126, "category": "Coffee roasters"}]
}Jobs and batches
Every API can also run as a job: a job takes the same parameters as the direct call and returns the same body in result. Use jobs for AI answers and for large runs.
| Call | Does |
|---|---|
POST /v1/jobs with {api, params, callback_ | queues one request and returns 202 with the job (status: queued) |
POST /v1/jobs/batch with {api, params, items[], callback_ | queues up to 1,000 requests of one API; params are shared and each item overrides them; returns 202 with the batch and one job id per item, in order |
GET /v1/jobs/{id} | status is queued, running, done or failed; result when done, error when failed |
GET /v1/batches/{id} | the counts per status and the job ids |
- A job has up to 10 minutes; its
timeoutis ignored. - Results are kept for 48 hours after the job finishes (
expires_at), then return410 expired. Fetching a result again is not billed. callback_urlreceives aPOSTof the finished job,resultincluded, signed withX-ProxyField-Signature: sha256=<HMAC of the body with your webhook secret>. A failed callback is retried 3 times. A batch calls it once per job.
{
"id": "bat_7e19c4a2d0f5b683",
"api": "google_search",
"counts": {"total": 2, "queued": 2, "running": 0, "done": 0, "failed": 0},
"jobs": [{"index": 0, "id": "job_a1b2c3d4e5f60718", "status": "queued"}, {"index": 1, "id": "job_a1b2c3d4e5f60719", "status": "queued"}]
}Helpers, none of them billed: GET /v1/google/locations, GET /v1/jobs/{id}, GET /v1/batches/{id}, GET /v1/requests/{id}/html and GET /v1/usage, which counts billed results and unbilled requests per API and day.
Billing
The scraper APIs are billed on successful results only, priced per 1,000 successful results (prices in the table above and on pricing).
Billed (X-Billed: true, metadata.billed: true):
- a response with
metadata.status: success; - Web Scraping API: a site's 2xx answer, including a sign-in page the site serves with a 200 status, and a site's 404 or 410;
- a job that ends
donewith a result, by the same rule as a direct call.
Not billed:
- every error response (
4xx,5xx): bad parameters, an empty balance, rate limits, our failures,target_unavailable,timeout; - AI APIs:
no_result, when the engine showed no answer; - Amazon:
404 target_not_found; - our internal retries: only the final delivered result counts;
- jobs that end
failed; - cached results: on Google search and Maps, the same parameters within 1 hour come from the cache with
metadata.cached: trueandX-Cache: hit;no_cache: truefetches fresh and is billed; - the helpers.
Volume price: the lower price of each API applies from 10,000 successful results in one purchase.
Payment: the APIs are paid from the same crypto balance as ProxyField proxies, in USDT, BTC, ETH or 10 other coins (crypto payments). The balance never expires, and there is no subscription or monthly fee.
Limits
- 20 requests at once per account (direct calls in flight); the next one returns
429 concurrency_limitwithRetry-After. Higher limits through sales. Your account's own limit is inX-Concurrency-Limitand inGET /v1/usage. - Up to 1,000 requests in one batch; a larger batch returns
400 invalid_parameter. - Too many calls in a short time return
429 rate_limitedwithRetry-After. - Limits apply per account, never per key, and a
429is never billed.
Errors
Errors use real HTTP status codes and one body: error with code, message, param and target_status, plus request_id.
{
"error": {"code": "unsupported_combination", "message": "wait_for needs render=true.", "param": "wait_for", "target_status": null},
"request_id": "req_b7d40e2c19a6f853"
}| HTTP | error.code | When | Billed |
|---|---|---|---|
| 400 | missing_parameter, invalid_parameter, unsupported_combination, unsupported_country, unsupported_marketplace | the request is wrong; param names the field | no |
| 401 | invalid_api_key | no key, or an unknown key | no |
| 402 | insufficient_balance | the balance cannot pay for one more result | no |
| 403 | account_suspended | the account is suspended | no |
| 404 | not_found, target_not_found | an unknown job, batch or request id; Amazon: no product page for this ASIN or URL | no |
| 410 | expired | a job result or stored HTML past its 48 hours | no |
| 429 | concurrency_limit, rate_limited | see Limits | no |
| 500 | internal_error | our fault | no |
| 502 | target_unavailable | no valid page after our retries; target_status has the site's last code | no |
| 504 | timeout | no result within timeout | no |
What the first version leaves out
- Expanded People Also Ask, which ProxyField does not sell.
- Other Google tabs and engines (News, Images, the Shopping tab, Jobs, Bing), and parsed endpoints for other sites: the Web Scraping API fetches those pages as HTML, Markdown or text.
- Postal-code locations for Google, and Amazon delivery ZIP codes outside amazon.com.
- Amazon review pages, the offers list and best-seller lists; Google Maps review texts and single-place details.
- Follow-up turns in AI Mode and ChatGPT: one request is one answer.
GETrequests and a key in the query string.- SDKs, an MCP server, and a no-code dashboard with CSV export.
Acceptable use applies to every request: public pages only, and follow the site's terms (acceptable use policy).
ProxyField Scraper API Documentation FAQ
Where is the ProxyField scraper API documentation?
ProxyField's scraper API documentation is this page: authentication, the base URL https://api.proxyfield.io/v1, the 7 APIs with their parameters, fields and sample JSON, billing per 1,000 successful results ($1.20 for Google results pages, $0.50 for a plain-HTTP page), limits and errors. The APIs are in development, so access is through Contact sales.
How do I get a ProxyField API key?
Contact sales for access; once it opens, you create the key in your ProxyField dashboard. You send it in the Authorization: Bearer <api_key> header of every request, never in the URL.
Is the ProxyField API open for calls today?
Not yet: the scraper APIs are in development, and this page is their design. Prices are set, and sales gives you access and the go-live date.
Which endpoints does the ProxyField API have?
Eight: /v1/google/search, /v1/google/ai-mode, /v1/chatgpt, /v1/perplexity, /v1/scrape, /v1/amazon/product, /v1/amazon/search and /v1/google/maps, each a POST with a JSON body. Jobs and batches use /v1/jobs and /v1/jobs/batch, and the helpers cover locations, job status, stored HTML and usage.
Which parameters does a request need?
Only the one that says what to fetch: q on the Google APIs, prompt on ChatGPT and Perplexity, url on the Web Scraping API, and asin, url or query on Amazon. Every other parameter has a default, and an unknown one returns a 400 error, which is not billed.
Is there a limit to the number of concurrent requests?
Yes: 20 direct requests at once per account, and up to 1,000 requests in one batch. Higher limits are available through sales, and a request over the limit gets a 429 with Retry-After, which is not billed.
What does a 429 error from the ProxyField API mean?
It means your account reached its limit: concurrency_limit when 20 requests are already running, or rate_limited when too many calls arrive in a short time. Wait for the seconds in Retry-After and send the request again; a 429 is never billed.
Am I charged when an API request fails?
No. Errors, blocked and timed-out requests, our internal retries and AI requests where the engine showed no answer are not billed; every response says in X-Billed whether it counted.
Which status codes from the target site are billed?
On the Web Scraping API, a site's 2xx answers are billed, including a sign-in page served with a 200 status, and so are its 404 and 410, as is the market norm. Other errors from the site are retried on new IPs, and a page that never arrives within the time limit is not billed.
When should I use jobs instead of a direct request?
Use jobs for AI answers, which take longer than a page fetch, and for large runs: a batch queues up to 1,000 requests and calls your callback_url for each finished job. Results stay available for 48 hours after a job finishes.
Show 2 more questionsShow fewer questions
Which languages and SDKs does the ProxyField API support?
Any language that can send an HTTPS request with a JSON body, as in the cURL samples on this page. The first version has no SDK, no MCP server and no no-code export.
How do I pay for the scraper APIs?
From the same crypto balance as ProxyField proxies, in USDT, BTC, ETH or 10 other coins. The balance never expires, there is no subscription or monthly fee, and the volume price applies from 10,000 successful results in one purchase.