Skip to content

Website traffic

POST /v1/traffic/visits delivers page visits from real Chrome sessions to a URL, with a controlled referral source, geo/device targeting, and human-like dwell and browsing. Billed $0.002 per delivered visit.

Terminal window
curl -X POST https://api.serplify.io/v1/traffic/visits \
-H "Authorization: Bearer live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/landing",
"quantity": 5000,
"source": "facebook",
"geo": { "country": "US" },
"device": "mixed",
"dwell_seconds_min": 20,
"dwell_seconds_max": 90,
"bounce_rate": 0.4,
"pages_per_visit": 3
}'
FieldTypeRequiredDefaultNotes
urlstring (URL)yes—Destination the visit lands on.
quantityintegeryes—Visits to deliver (1–1,000,000).
sourceenumnoorganicorganic, direct, facebook, twitter, reddit, pinterest, linkedin, youtube, referral.
referrerstring (URL)no—Custom referrer (for source: "referral").
geoobjectno—{ country?, state?, city? } — country is ISO-3166 alpha-2. state and city optionally narrow it; see City and state targeting.
deviceenumnomixeddesktop, mobile, mixed.
browser_mixstring / object / nullnoomittedautomatic or browser percentages totaling 100. Omit or use null for the original Chrome delivery.
mobile_percentnumberno30Mobile share (0–100) when device=mixed and a browser mix is selected.
pacingenumnoasapasap delivers as fast as capacity allows; distributed spreads delivery naturally over spread_hours.
spread_hoursintegerno24For pacing: "distributed": spread the quantity over this many hours (1–720).
dwell_seconds_min / dwell_seconds_maxintegerno15 / 60Time on the landing page.
bounce_ratenumberno0.5Fraction (0–1) that bounce after landing.
pages_per_visitintegerno1Internal pages browsed (1 = landing only).
tagstringno—Free-form label.

HTTP 202 with a campaign whose product is visits. Poll status_url to watch delivered climb.

  • Each visit is a real browser page load, so client-side analytics (GA4, etc.) register it.
  • The referral source shapes the Referer and navigation pattern so the visit attributes to the chosen channel.
  • geo and device route the visit through matching residential/mobile proxies.
  • dwell_*, bounce_rate, and pages_per_visit shape realistic engagement.

You are charged only for visits actually delivered.

Add geo.city to deliver every visit from one city inside geo.country, or geo.state to deliver from anywhere in one state (United States):

"geo": { "country": "US", "city": "Los Angeles" }
"geo": { "country": "US", "state": "Texas" }

city takes the city’s name in any case, with or without accents ("São Paulo", "sao paulo"), or its key ("los_angeles"). state takes the state’s name or its two-letter code ("Texas", "TX"). Both require geo.country. Sending both is allowed when the city is in that state.

Coverage depends on what the delivery network can serve right now, and it is checked continuously. List the cities and states for a country, and whether each one is available at the moment:

Terminal window
curl "https://api.serplify.io/v1/traffic/cities?country=US" \
-H "Authorization: Bearer live_your_key_here"
{
"country": "US",
"cities": [
{ "city": "new_york", "name": "New York", "state": "NY", "available": true },
{ "city": "los_angeles", "name": "Los Angeles", "state": "CA", "available": true }
]
}
Terminal window
curl "https://api.serplify.io/v1/traffic/states?country=US" \
-H "Authorization: Bearer live_your_key_here"
{
"country": "US",
"states": [
{ "state": "TX", "name": "Texas", "available": true },
{ "state": "AK", "name": "Alaska", "available": true }
]
}
  • A city or state that is not in the lists fails validation (400), naming the endpoint to check.
  • A listed city or state that is not available is refused with 400 before anything is queued or charged. Retry later, or omit it to target the whole country.
  • Accepted campaigns echo "geo": { "country": "US", "state": "CA", "city": "los_angeles" } (or just country and state) in the campaign response and on GET /v1/traffic/campaigns/{id}.
  • Visits exit from IPs in or around the city, or anywhere in the state, and the browser presents the matching timezone. If the target stops being reachable mid-campaign, visits continue from the whole country until it is reachable again, rather than stalling.

City and state targeting are for website visits only. geo.city and geo.state on /v1/traffic/clicks are rejected.

Select the browser identity presented during visits independently of the traffic source. All visits still execute through Chrome; this setting changes user-agent, client-hint, and JavaScript navigator signals. Existing requests that omit browser_mix keep the original Chrome execution behavior. During rollout, explicit browser mixes are rejected until the service enables them; ordinary Chrome requests continue to work.

{
"url": "https://example.com/",
"quantity": 1000,
"source": "direct",
"device": "mixed",
"mobile_percent": 40,
"browser_mix": {
"chrome": 60,
"edge": 10,
"firefox": 10,
"safari": 20
}
}

Custom percentages must total 100; omitted browsers receive zero. Chrome, Edge, Firefox, and Safari profiles support both desktop and mobile visits. Safari mobile uses iPhone signals; the other mobile profiles use Android signals. Unknown profile names and invalid percentages are rejected.

"browser_mix": "automatic" uses product presets adjusted to the device mix: 60% Chrome, 15% Edge, 15% Firefox, 10% Safari for desktop, and 70% Chrome, 5% Edge, 5% Firefox, 20% Safari for mobile. Mixed-device presets blend these in proportion to the mobile share. These are product defaults, not global market-share claims.

Browser profile and device selection is stable across retries while campaign settings stay the same. Percentages describe allocation targets across many visits, not exact quotas or guaranteed analytics counts. Delivery failures and small samples can change observed proportions. Profile emulation does not change Chrome’s underlying rendering or TLS engine; analytics classification depends on the target’s own tracking. The website’s normal analytics run during the visit.

Campaign creation/status responses include browser_mix, device, and the effective mobile_percent when browser mixing is enabled. Campaign settings can also be edited in the dashboard. Changes apply when subsequent tasks are claimed; already-running visits keep their current settings.

GET /v1/traffic/campaigns/{id}/browsers returns an account-scoped, unbilled breakdown of profiles on retained successful task records over the last seven days, inside the standard API envelope:

{
"since": "2026-09-15T12:00:00.000Z",
"until": "2026-09-22T12:00:00.000Z",
"delivered": 100,
"browsers": [
{ "browser": "chrome", "delivered": 70, "share": 70 },
{ "browser": "safari", "delivered": 30, "share": 30 }
]
}

Historical visits without browser attribution appear under browser: null. Failed attempts are excluded. The dashboard shows the same breakdown and the profile/device for each recorded delivery. The browser field identifies the presented profile, not a separate browser runtime. Subscribed delivered webhooks also include result.browser and result.device for campaigns that opted into a browser mix. Existing campaigns keep their original webhook payload.