FeelingSurf API
https://api.feelingsurf.frProgrammatic access to a FeelingSurf account: manage the websites that receive automated visits, and read account information.
Quick start
Every endpoint except the health check needs a Premium API key.
1. Check connectivity — no key required:
curl https://api.feelingsurf.fr/v1/ping2. Get your API key. Generate one in your dashboard under Settings → API. API access is a Premium benefit: any account can create a key, but it only authenticates while your subscription is active (and the same key resumes working on re-upgrade — no reissue needed).
3. Make your first authenticated request — send the key as a bearer token:
curl https://api.feelingsurf.fr/v1/me -H "Authorization: Bearer fsk_your_key"That returns your account summary. From there: list your sites with GET /v1/sites, add one with POST /v1/sites, and so on — every endpoint is documented below.
Authentication
Every request carries Authorization: Bearer fsk_.... The key is distinct from the FeelingSurfViewer desktop app token — treat it like a password, and manage or revoke it any time under Settings → API.
Send request bodies as JSON and set a Content-Type: application/json header on POST and PATCH requests. Responses are JSON too, except the screenshot image endpoints, which stream raw image bytes.
Rate limits
60 requests per minute per account (fixed window). Every authenticated response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (the unix epoch when the window resets); over the limit returns 429 rate_limited with a Retry-After header (seconds).
Errors
Responses are JSON. Errors use a stable envelope — {"error": {"code": "…", "message": "…"}} — with a machine-readable, locale-independent code (the message is English and may change):
unauthorized(401)premium_required(403)forbidden(403) — a banned or disabled accountnot_found(404)validation_error(422)site_limit_reached/template_limit_reached/limit_reached(403, on create once a quota is full)rate_limited(429)server_error(500)service_unavailable(503) — temporary maintenance; carries aRetry-Afterheader
System
Liveness.
/v1/pingUnauthenticated health check.
Responses
statusstring
{
"status": "ok"
}Account
The authenticated account.
/v1/meAccount summary plus the earn-side rollup (credits earned today / last 7 days), active FeelingSurfViewer session count, and site-slot usage.
Responses
idintegerUnique identifier.usernamestringYour username.planstring(premium)Membership plan. Alwayspremium, since the API requires Premium.creditsnumberCurrent credit balance.earningobjectCredits earned by surfing.credits_todaynumberCredits earned by surfing today.credits_last_7_daysnumberRolling sum over the last 7 days (today inclusive).
surfingobjectYour live surfing activity.active_sessionsintegerFeelingSurfViewer sessions active in the last few minutes.
site_slotsobjectSite-slot usage; create returns 403 onceusedreachesmax.usedintegerSite slots currently in use (your number of sites).maxintegerTotal site slots your plan allows.availableintegerUnused site slots (max minus used).
visit_own_sitesbooleanWhether the app also surfs your own sites.timezonestringnullableIANA timezone for active-hours scheduling; UTC is used when null.currencystring(eur,usd)Your billing currency.languagestring(en,fr,es,pt,ru,vi,id,tr,de,it,nl)Your account language (ISO code).newsletterbooleanNewsletter email opt-in.invoice_emailsbooleanWhether invoice emails are sent.subscriptionobjectPremium subscription lifecycle.activebooleanWhether an active premium subscription exists.renews_atstringnullableNext renewal date while active and not cancelled.ends_atstringnullableWhen premium access ends after a cancellation.
{
"id": 98221,
"username": "acme",
"plan": "premium",
"credits": 5000,
"earning": {
"credits_today": 0,
"credits_last_7_days": 0
},
"surfing": {
"active_sessions": 1
},
"site_slots": {
"used": 1,
"max": 12,
"available": 11
},
"visit_own_sites": false,
"timezone": null,
"currency": "eur",
"language": "en",
"newsletter": true,
"invoice_emails": true,
"subscription": {
"active": true,
"renews_at": "2026-12-25T12:00:00Z",
"ends_at": null
}
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/meUpdate non-sensitive account settings (e.g. visit_own_sites, timezone).
Request body
visit_own_sitesbooleanWhether the app also surfs your own sites.timezonestringnullableAn IANA timezone name (e.g. "Europe/Paris"), or null to clear (scheduling then uses UTC).currencystring(eur,usd)Your billing currency.languagestring(en,fr,es,pt,ru,vi,id,tr,de,it,nl)Your account language (ISO code).newsletterbooleanNewsletter email opt-in.invoice_emailsbooleanWhether invoice emails are sent.
Responses
idintegerUnique identifier.usernamestringYour username.planstring(premium)Membership plan. Alwayspremium, since the API requires Premium.creditsnumberCurrent credit balance.earningobjectCredits earned by surfing.credits_todaynumberCredits earned by surfing today.credits_last_7_daysnumberRolling sum over the last 7 days (today inclusive).
surfingobjectYour live surfing activity.active_sessionsintegerFeelingSurfViewer sessions active in the last few minutes.
site_slotsobjectSite-slot usage; create returns 403 onceusedreachesmax.usedintegerSite slots currently in use (your number of sites).maxintegerTotal site slots your plan allows.availableintegerUnused site slots (max minus used).
visit_own_sitesbooleanWhether the app also surfs your own sites.timezonestringnullableIANA timezone for active-hours scheduling; UTC is used when null.currencystring(eur,usd)Your billing currency.languagestring(en,fr,es,pt,ru,vi,id,tr,de,it,nl)Your account language (ISO code).newsletterbooleanNewsletter email opt-in.invoice_emailsbooleanWhether invoice emails are sent.subscriptionobjectPremium subscription lifecycle.activebooleanWhether an active premium subscription exists.renews_atstringnullableNext renewal date while active and not cancelled.ends_atstringnullableWhen premium access ends after a cancellation.
{
"id": 98221,
"username": "acme",
"plan": "premium",
"credits": 5000,
"earning": {
"credits_today": 0,
"credits_last_7_days": 0
},
"surfing": {
"active_sessions": 1
},
"site_slots": {
"used": 1,
"max": 12,
"available": 11
},
"visit_own_sites": false,
"timezone": null,
"currency": "eur",
"language": "en",
"newsletter": true,
"invoice_emails": true,
"subscription": {
"active": true,
"renews_at": "2026-12-25T12:00:00Z",
"ends_at": null
}
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/surf-sessionsRecent FeelingSurfViewer sessions on your account (the earning side), most recent first. These are your own FeelingSurfViewer instances and their IPs.
Parameters
limit | query | integer | Page size (clamped to 1..200). |
offset | query | integer | Number of items to skip. |
Responses
dataSurfSession[]ip_addressstringThe IP address this session runs from.country_codestringnullableISO country code of the IP, or null if unknown.credits_earnednumberCredits this session has earned.activebooleanWhether the session was active in the last few minutes.last_activity_atstringnullableWhen the session was last active.app_versionstringnullableFeelingSurfViewer app version, e.g. "2.5.0".app_version_outdatedbooleanWhether this app version is behind the current release.app_version_supported_untilstringnullableWhen support for this app version ends, or null.low_quality_ipbooleanThe IP is classified low-quality (earns more slowly).overused_ipbooleanTrue when this IP has tripped one of your account's session limits — for example too many simultaneous sessions from the same IP or IP subnet, or your account-wide session cap. While flagged, further sessions from the IP are rejected, so it earns less until it drops back under the limit.
metaPageMetaPagination metadata for a list response.limitintegerPage size applied (clamped).offsetintegerNumber of items skipped before this page.totalintegerTotal number of items across all pages.
{
"data": [
{
"ip_address": "203.0.113.42",
"country_code": "US",
"credits_earned": 128.5,
"active": true,
"last_activity_at": "2026-06-25T09:04:36Z",
"app_version": "2.5.0",
"app_version_outdated": false,
"app_version_supported_until": null,
"low_quality_ip": false,
"overused_ip": false
}
],
"meta": {
"limit": 50,
"offset": 0,
"total": 1
}
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/referralsYour shareable referral link, how many users you've referred, your commission rate, and commission credits earned.
Responses
referral_linkstringShareable signup link that credits you for the referral.referred_countintegerNumber of (non-banned) users you referred.commission_percentintegerYour referral commission: you get this percentage of every credit your referrals earn, forever (10 for Free accounts, 20 for Premium).credits_earnedobjectCredits earned from referrals.totalnumberAll-time commission credits.todaynumberCommission credits earned today.last_7_daysnumberRolling sum over the last 7 days (today inclusive).
{
"referral_link": "https://www.feelingsurf.fr/r/98220",
"referred_count": 0,
"commission_percent": 20,
"credits_earned": {
"total": 0,
"today": 0,
"last_7_days": 0
}
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Sites
The websites that receive automated visits.
/v1/sitesParameters
limit | query | integer | Page size (clamped to 1..200). |
offset | query | integer | Number of items to skip. |
Responses
dataSite[]idintegerUnique identifier.urlstringThe website's URL.namestringnullableOptional user-chosen name.pausedbooleanWhether the user has paused delivery.blockedbooleanWhether the platform has blocked the site (e.g. dead link).limit_reachedbooleanWhether a configured visit cap has been reached.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
traffic_sourcesinteger[]IDs of assigned traffic sources (resolve via GET /v1/traffic-sources).labelsinteger[]IDs of assigned labels (resolve via GET /v1/labels).total_visitsintegerLifetime visits delivered.created_atstringnullableWhen it was created (UTC), or null.
metaPageMetaPagination metadata for a list response.limitintegerPage size applied (clamped).offsetintegerNumber of items skipped before this page.totalintegerTotal number of items across all pages.
{
"data": [
{
"id": 2761880,
"url": "https://example.com",
"name": "My landing page",
"paused": false,
"blocked": false,
"limit_reached": false,
"devices": {
"desktop": 100,
"mobile": 0,
"tablet": 0
},
"visit_duration": {
"min_seconds": 10,
"max_seconds": 10
},
"visit_distribution": "even",
"limits": {
"hourly": 50,
"daily": null,
"total": null
},
"schedule": {
"active_hours_mask": null,
"time_zone": null
},
"traffic_quality": {
"low_quality_ips": true,
"ipv6": true
},
"browsing": {
"max_sub_windows": 0
},
"traffic_sources": [1],
"labels": [],
"total_visits": 0,
"created_at": "2026-06-25T07:58:02Z"
}
],
"meta": {
"limit": 50,
"offset": 0,
"total": 1
}
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/sitesOnly url is required; every other field defaults to a new-site configuration. Exceeding the account's slot count returns 403 site_limit_reached.
Request body
urlstringrequiredThe website's URL.namestringnullableUser-chosen name; null clears it.pausedbooleanPause or resume visit delivery.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteActionInput[]The actions to perform.typestringrequired (click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointegerrequired (0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of traffic sources to assign; an empty list assigns the default "Direct visits" source.labelsinteger[]IDs of labels to assign.template_idintegerA site template to apply as the base configuration. Must be one of your own templates; an unknown id returns 422. The template's settings become the defaults; any field you also send in this request overrides the template's value for that whole field (shallow merge, per top-level field).
Responses
idintegerUnique identifier.urlstringThe website's URL.namestringnullableOptional user-chosen name.pausedbooleanWhether the user has paused delivery.blockedbooleanWhether the platform has blocked the site (e.g. dead link).limit_reachedbooleanWhether a configured visit cap has been reached.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
traffic_sourcesinteger[]IDs of assigned traffic sources (resolve via GET /v1/traffic-sources).labelsinteger[]IDs of assigned labels (resolve via GET /v1/labels).total_visitsintegerLifetime visits delivered.created_atstringnullableWhen it was created (UTC), or null.location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteAction[]The actions to perform.typestring(click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointeger(0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
visit_historyobjectRecent visit counts.by_hourinteger[]Visits per hour over the last 24h, oldest first (last = current hour).by_dayinteger[]Visits per day over the last 8 days, oldest first (last = today).
{
"id": 2761880,
"url": "https://example.com",
"name": "My landing page",
"paused": false,
"blocked": false,
"limit_reached": false,
"devices": {
"desktop": 100,
"mobile": 0,
"tablet": 0
},
"visit_duration": {
"min_seconds": 10,
"max_seconds": 10
},
"visit_distribution": "even",
"limits": {
"hourly": 50,
"daily": null,
"total": null
},
"schedule": {
"active_hours_mask": null,
"time_zone": null
},
"traffic_quality": {
"low_quality_ips": true,
"ipv6": true
},
"browsing": {
"max_sub_windows": 0
},
"traffic_sources": [1],
"labels": [],
"total_visits": 0,
"created_at": "2026-06-25T07:58:02Z",
"location_targeting": {
"mode": "include",
"locations": []
},
"blocked_domains": {
"rate": 100,
"domains": []
},
"actions": {
"window": "latest",
"items": []
},
"visit_history": {
"by_hour": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"by_day": [0, 0, 0, 0, 0, 0, 0, 0]
}
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/sites/{id}Parameters
id required | path | integer | Site identifier. |
Responses
idintegerUnique identifier.urlstringThe website's URL.namestringnullableOptional user-chosen name.pausedbooleanWhether the user has paused delivery.blockedbooleanWhether the platform has blocked the site (e.g. dead link).limit_reachedbooleanWhether a configured visit cap has been reached.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
traffic_sourcesinteger[]IDs of assigned traffic sources (resolve via GET /v1/traffic-sources).labelsinteger[]IDs of assigned labels (resolve via GET /v1/labels).total_visitsintegerLifetime visits delivered.created_atstringnullableWhen it was created (UTC), or null.location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteAction[]The actions to perform.typestring(click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointeger(0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
visit_historyobjectRecent visit counts.by_hourinteger[]Visits per hour over the last 24h, oldest first (last = current hour).by_dayinteger[]Visits per day over the last 8 days, oldest first (last = today).
{
"id": 2761880,
"url": "https://example.com",
"name": "My landing page",
"paused": false,
"blocked": false,
"limit_reached": false,
"devices": {
"desktop": 100,
"mobile": 0,
"tablet": 0
},
"visit_duration": {
"min_seconds": 10,
"max_seconds": 10
},
"visit_distribution": "even",
"limits": {
"hourly": 50,
"daily": null,
"total": null
},
"schedule": {
"active_hours_mask": null,
"time_zone": null
},
"traffic_quality": {
"low_quality_ips": true,
"ipv6": true
},
"browsing": {
"max_sub_windows": 0
},
"traffic_sources": [1],
"labels": [],
"total_visits": 0,
"created_at": "2026-06-25T07:58:02Z",
"location_targeting": {
"mode": "include",
"locations": []
},
"blocked_domains": {
"rate": 100,
"domains": []
},
"actions": {
"window": "latest",
"items": []
},
"visit_history": {
"by_hour": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"by_day": [0, 0, 0, 0, 0, 0, 0, 0]
}
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/sites/{id}Parameters
id required | path | integer | Site identifier. |
Request body
namestringnullableUser-chosen name; null clears it.pausedbooleanPause or resume visit delivery.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteActionInput[]The actions to perform.typestringrequired (click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointegerrequired (0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of traffic sources to assign; an empty list assigns the default "Direct visits" source.labelsinteger[]IDs of labels to assign.
Responses
idintegerUnique identifier.urlstringThe website's URL.namestringnullableOptional user-chosen name.pausedbooleanWhether the user has paused delivery.blockedbooleanWhether the platform has blocked the site (e.g. dead link).limit_reachedbooleanWhether a configured visit cap has been reached.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
traffic_sourcesinteger[]IDs of assigned traffic sources (resolve via GET /v1/traffic-sources).labelsinteger[]IDs of assigned labels (resolve via GET /v1/labels).total_visitsintegerLifetime visits delivered.created_atstringnullableWhen it was created (UTC), or null.location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteAction[]The actions to perform.typestring(click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointeger(0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
visit_historyobjectRecent visit counts.by_hourinteger[]Visits per hour over the last 24h, oldest first (last = current hour).by_dayinteger[]Visits per day over the last 8 days, oldest first (last = today).
{
"id": 2761880,
"url": "https://example.com",
"name": "My landing page",
"paused": false,
"blocked": false,
"limit_reached": false,
"devices": {
"desktop": 100,
"mobile": 0,
"tablet": 0
},
"visit_duration": {
"min_seconds": 10,
"max_seconds": 10
},
"visit_distribution": "even",
"limits": {
"hourly": 50,
"daily": null,
"total": null
},
"schedule": {
"active_hours_mask": null,
"time_zone": null
},
"traffic_quality": {
"low_quality_ips": true,
"ipv6": true
},
"browsing": {
"max_sub_windows": 0
},
"traffic_sources": [1],
"labels": [],
"total_visits": 0,
"created_at": "2026-06-25T07:58:02Z",
"location_targeting": {
"mode": "include",
"locations": []
},
"blocked_domains": {
"rate": 100,
"domains": []
},
"actions": {
"window": "latest",
"items": []
},
"visit_history": {
"by_hour": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"by_day": [0, 0, 0, 0, 0, 0, 0, 0]
}
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/sites/{id}Parameters
id required | path | integer | Site identifier. |
Responses
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Site templates
Reusable bundles of site settings.
/v1/site-templatesParameters
limit | query | integer | Page size (clamped to 1..200). |
offset | query | integer | Number of items to skip. |
Responses
dataSiteTemplate[]idintegerUnique identifier.namestringnullableTemplate name.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteAction[]The actions to perform.
traffic_sourcesinteger[]IDs of assigned traffic sources (resolve via GET /v1/traffic-sources).created_atstringnullableWhen it was created (UTC), or null.
metaPageMetaPagination metadata for a list response.limitintegerPage size applied (clamped).offsetintegerNumber of items skipped before this page.totalintegerTotal number of items across all pages.
{
"data": [
{
"id": 2644,
"name": "Default desktop",
"devices": {
"desktop": 100,
"mobile": 0,
"tablet": 0
},
"visit_duration": {
"min_seconds": 10,
"max_seconds": 10
},
"visit_distribution": "even",
"limits": {
"hourly": 50,
"daily": null,
"total": null
},
"schedule": {
"active_hours_mask": null,
"time_zone": null
},
"traffic_quality": {
"low_quality_ips": true,
"ipv6": true
},
"browsing": {
"max_sub_windows": 0
},
"location_targeting": {
"mode": "include",
"locations": []
},
"blocked_domains": {
"rate": 100,
"domains": []
},
"actions": {
"window": "latest",
"items": []
},
"traffic_sources": [],
"created_at": "2026-06-25T07:58:02Z"
}
],
"meta": {
"limit": 50,
"offset": 0,
"total": 1
}
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/site-templatesA template is a reusable bundle of site settings (no url/paused/labels). Only name is required; every other field defaults to a new-template configuration. Exceeding the per-account cap returns 403 template_limit_reached.
Request body
namestringrequiredTemplate name.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteActionInput[]The actions to perform.typestringrequired (click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointegerrequired (0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of traffic sources to assign.
Responses
idintegerUnique identifier.namestringnullableTemplate name.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteAction[]The actions to perform.typestring(click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointeger(0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of assigned traffic sources (resolve via GET /v1/traffic-sources).created_atstringnullableWhen it was created (UTC), or null.
{
"id": 2644,
"name": "Default desktop",
"devices": {
"desktop": 100,
"mobile": 0,
"tablet": 0
},
"visit_duration": {
"min_seconds": 10,
"max_seconds": 10
},
"visit_distribution": "even",
"limits": {
"hourly": 50,
"daily": null,
"total": null
},
"schedule": {
"active_hours_mask": null,
"time_zone": null
},
"traffic_quality": {
"low_quality_ips": true,
"ipv6": true
},
"browsing": {
"max_sub_windows": 0
},
"location_targeting": {
"mode": "include",
"locations": []
},
"blocked_domains": {
"rate": 100,
"domains": []
},
"actions": {
"window": "latest",
"items": []
},
"traffic_sources": [],
"created_at": "2026-06-25T07:58:02Z"
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/site-templates/{id}Parameters
id required | path | integer | Resource identifier. |
Responses
idintegerUnique identifier.namestringnullableTemplate name.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteAction[]The actions to perform.typestring(click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointeger(0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of assigned traffic sources (resolve via GET /v1/traffic-sources).created_atstringnullableWhen it was created (UTC), or null.
{
"id": 2644,
"name": "Default desktop",
"devices": {
"desktop": 100,
"mobile": 0,
"tablet": 0
},
"visit_duration": {
"min_seconds": 10,
"max_seconds": 10
},
"visit_distribution": "even",
"limits": {
"hourly": 50,
"daily": null,
"total": null
},
"schedule": {
"active_hours_mask": null,
"time_zone": null
},
"traffic_quality": {
"low_quality_ips": true,
"ipv6": true
},
"browsing": {
"max_sub_windows": 0
},
"location_targeting": {
"mode": "include",
"locations": []
},
"blocked_domains": {
"rate": 100,
"domains": []
},
"actions": {
"window": "latest",
"items": []
},
"traffic_sources": [],
"created_at": "2026-06-25T07:58:02Z"
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/site-templates/{id}Parameters
id required | path | integer | Resource identifier. |
Request body
namestringnullableTemplate name.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteActionInput[]The actions to perform.typestringrequired (click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointegerrequired (0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of traffic sources to assign.
Responses
idintegerUnique identifier.namestringnullableTemplate name.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteAction[]The actions to perform.typestring(click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointeger(0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of assigned traffic sources (resolve via GET /v1/traffic-sources).created_atstringnullableWhen it was created (UTC), or null.
{
"id": 2644,
"name": "Default desktop",
"devices": {
"desktop": 100,
"mobile": 0,
"tablet": 0
},
"visit_duration": {
"min_seconds": 10,
"max_seconds": 10
},
"visit_distribution": "even",
"limits": {
"hourly": 50,
"daily": null,
"total": null
},
"schedule": {
"active_hours_mask": null,
"time_zone": null
},
"traffic_quality": {
"low_quality_ips": true,
"ipv6": true
},
"browsing": {
"max_sub_windows": 0
},
"location_targeting": {
"mode": "include",
"locations": []
},
"blocked_domains": {
"rate": 100,
"domains": []
},
"actions": {
"window": "latest",
"items": []
},
"traffic_sources": [],
"created_at": "2026-06-25T07:58:02Z"
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/site-templates/{id}Parameters
id required | path | integer | Resource identifier. |
Responses
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Traffic sources
Custom referers a site can report visits as coming from.
/v1/traffic-sourcesYour own sources plus the shared/built-in ones, referenced by id from a site's traffic_sources.
Parameters
limit | query | integer | Page size (clamped to 1..200). |
offset | query | integer | Number of items to skip. |
Responses
dataTrafficSource[]idintegerUnique identifier.namestringnullableName of the traffic source; a default is shown when unset.refererstringThe referer reported to the target site. Only the scheme is removed, sohttps://www.google.com/is stored aswww.google.com/.premiumbooleanWhether this source is gated to Premium. Premium sources (your custom ones, plus some shared ones) are unassigned from your sites if your subscription lapses.custombooleanTrue for your own sources, false for shared/built-in ones. Independent ofpremium, since some shared sources are Premium-gated too.created_atstringnullableWhen it was created (UTC), or null.
metaPageMetaPagination metadata for a list response.limitintegerPage size applied (clamped).offsetintegerNumber of items skipped before this page.totalintegerTotal number of items across all pages.
{
"data": [
{
"id": 166445,
"name": "Newsletter",
"referer": "www.google.com/",
"premium": true,
"custom": true,
"created_at": "2026-06-25T07:58:02Z"
}
],
"meta": {
"limit": 50,
"offset": 0,
"total": 1
}
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/traffic-sourcesExceeding the per-account source cap returns 403 limit_reached.
Request body
namestringrequiredName of the traffic source; a default is shown when unset.refererstringrequiredThe referer to report to the target site (a domain or full URL, e.g.https://www.google.com/); the scheme is stripped on save.
Responses
idintegerUnique identifier.namestringnullableName of the traffic source; a default is shown when unset.refererstringThe referer reported to the target site. Only the scheme is removed, sohttps://www.google.com/is stored aswww.google.com/.premiumbooleanWhether this source is gated to Premium. Premium sources (your custom ones, plus some shared ones) are unassigned from your sites if your subscription lapses.custombooleanTrue for your own sources, false for shared/built-in ones. Independent ofpremium, since some shared sources are Premium-gated too.created_atstringnullableWhen it was created (UTC), or null.
{
"id": 166445,
"name": "Newsletter",
"referer": "www.google.com/",
"premium": true,
"custom": true,
"created_at": "2026-06-25T07:58:02Z"
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/traffic-sources/{id}Works for your own sources and for the shared defaults (e.g. id 1, "Direct visits").
Parameters
id required | path | integer | Resource identifier. |
Responses
idintegerUnique identifier.namestringnullableName of the traffic source; a default is shown when unset.refererstringThe referer reported to the target site. Only the scheme is removed, sohttps://www.google.com/is stored aswww.google.com/.premiumbooleanWhether this source is gated to Premium. Premium sources (your custom ones, plus some shared ones) are unassigned from your sites if your subscription lapses.custombooleanTrue for your own sources, false for shared/built-in ones. Independent ofpremium, since some shared sources are Premium-gated too.created_atstringnullableWhen it was created (UTC), or null.
{
"id": 166445,
"name": "Newsletter",
"referer": "www.google.com/",
"premium": true,
"custom": true,
"created_at": "2026-06-25T07:58:02Z"
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/traffic-sources/{id}Parameters
id required | path | integer | Resource identifier. |
Request body
namestringName of the traffic source; a default is shown when unset.refererstringThe referer to report to the target site (a domain or full URL, e.g.https://www.google.com/); the scheme is stripped on save.
Responses
idintegerUnique identifier.namestringnullableName of the traffic source; a default is shown when unset.refererstringThe referer reported to the target site. Only the scheme is removed, sohttps://www.google.com/is stored aswww.google.com/.premiumbooleanWhether this source is gated to Premium. Premium sources (your custom ones, plus some shared ones) are unassigned from your sites if your subscription lapses.custombooleanTrue for your own sources, false for shared/built-in ones. Independent ofpremium, since some shared sources are Premium-gated too.created_atstringnullableWhen it was created (UTC), or null.
{
"id": 166445,
"name": "Newsletter",
"referer": "www.google.com/",
"premium": true,
"custom": true,
"created_at": "2026-06-25T07:58:02Z"
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/traffic-sources/{id}Parameters
id required | path | integer | Resource identifier. |
Responses
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Labels
Labels for organizing your sites.
/v1/labelsReferenced by id from a site's labels.
Parameters
limit | query | integer | Page size (clamped to 1..200). |
offset | query | integer | Number of items to skip. |
Responses
dataLabel[]idintegerUnique identifier.namestringLabel name.colorstring(#6610f2,#6f42c1,#d63384,#dc3545,#fd7e14,#ffc107,#198754,#20c997,#0dcaf0,#6c757d,#343a40)Label color.descriptionstringnullableOptional notes.
metaPageMetaPagination metadata for a list response.limitintegerPage size applied (clamped).offsetintegerNumber of items skipped before this page.totalintegerTotal number of items across all pages.
{
"data": [
{
"id": 1744,
"name": "Campaign A",
"color": "#0dcaf0",
"description": "Q1 landing pages"
}
],
"meta": {
"limit": 50,
"offset": 0,
"total": 1
}
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/labelsExceeding the per-account label cap returns 403 limit_reached.
Request body
namestringrequiredLabel name.colorstringrequired (#6610f2,#6f42c1,#d63384,#dc3545,#fd7e14,#ffc107,#198754,#20c997,#0dcaf0,#6c757d,#343a40)Label color.descriptionstringnullableOptional notes.
Responses
idintegerUnique identifier.namestringLabel name.colorstring(#6610f2,#6f42c1,#d63384,#dc3545,#fd7e14,#ffc107,#198754,#20c997,#0dcaf0,#6c757d,#343a40)Label color.descriptionstringnullableOptional notes.
{
"id": 1744,
"name": "Campaign A",
"color": "#0dcaf0",
"description": "Q1 landing pages"
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/labels/{id}Parameters
id required | path | integer | Resource identifier. |
Responses
idintegerUnique identifier.namestringLabel name.colorstring(#6610f2,#6f42c1,#d63384,#dc3545,#fd7e14,#ffc107,#198754,#20c997,#0dcaf0,#6c757d,#343a40)Label color.descriptionstringnullableOptional notes.
{
"id": 1744,
"name": "Campaign A",
"color": "#0dcaf0",
"description": "Q1 landing pages"
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/labels/{id}Parameters
id required | path | integer | Resource identifier. |
Request body
namestringLabel name.colorstring(#6610f2,#6f42c1,#d63384,#dc3545,#fd7e14,#ffc107,#198754,#20c997,#0dcaf0,#6c757d,#343a40)Label color.descriptionstringnullableOptional notes.
Responses
idintegerUnique identifier.namestringLabel name.colorstring(#6610f2,#6f42c1,#d63384,#dc3545,#fd7e14,#ffc107,#198754,#20c997,#0dcaf0,#6c757d,#343a40)Label color.descriptionstringnullableOptional notes.
{
"id": 1744,
"name": "Campaign A",
"color": "#0dcaf0",
"description": "Q1 landing pages"
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/labels/{id}Parameters
id required | path | integer | Resource identifier. |
Responses
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Screenshots
FeelingSurfViewer screenshots captured while surfing a site.
/v1/sites/{id}/screenshotsScreenshots captured while the app surfed the site. Returns the most recent (up to 24); this list is not paginated.
Parameters
id required | path | integer | Site identifier. |
Responses
dataScreenshot[]uidstringUnique id for this visit's screenshot set.devicestring(desktop,mobile,tablet)Device category the visit ran on.orientationstring(landscape,portrait)Screen orientation.country_codestringnullableISO country code of the visitor, or null.country_namestringnullableLocalized country name, or null.visit_duration_secondsintegerHow long the visit lasted, in seconds.imagesScreenshotImage[]The captured images, one per browser window.urlstringURL to fetch the screenshot image.preview_urlstringnullableURL to fetch the blurred preview, or null.windowintegerBrowser window index the image was captured from.widthintegerImage width in pixels.heightintegerImage height in pixels.delay_secondsintegerSeconds into the visit when the image was captured.captured_atstringWhen the image was captured.
{
"data": [
{
"uid": "2659c544-81ab-4841-912b-4005336a2a2e",
"device": "desktop",
"orientation": "landscape",
"country_code": "US",
"country_name": "United States",
"visit_duration_seconds": 45,
"images": [
{
"url": "https://api.feelingsurf.fr/v1/screenshots/c99c25613c8b956ba2b3b0f1f764ce83",
"preview_url": "https://api.feelingsurf.fr/v1/screenshots/c99c25613c8b956ba2b3b0f1f764ce83/preview",
"window": 0,
"width": 1280,
"height": 720,
"delay_seconds": 5,
"captured_at": "2026-06-25T09:00:00Z"
}
]
}
]
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/screenshots/{uid}Streams the image bytes. The id comes from a screenshot's images[].url.
Parameters
uid required | path | string |
Responses
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
/v1/screenshots/{uid}/previewParameters
uid required | path | string |
Responses
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Traffic availability
Surfer-traffic availability by country (reference data).
/v1/traffic-availabilitySurfer-traffic availability per country, to guide a site's or template's location targeting. A country with availability: none has no surfers delivering visits, so targeting it yields nothing. A fixed reference dataset (~250 countries), returned in full — not paginated.
Responses
dataTrafficAvailability[]codestringISO 3166-1 alpha-2 country code.namestringLocalized country name.continentstringISO continent code (EU, AS, NA, AF, SA, OC, AN).availabilitystring(none,low,medium,high)Relative volume of surfer traffic available in this country.
{
"data": [
{
"code": "AD",
"name": "Andorra",
"continent": "EU",
"availability": "low"
}
]
}errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
premium_required; a banned or disabled account is rejected with forbidden.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Retry-After response header, then retry.
errorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
Models
ErrorerrorobjectError details.codestringStable, locale-independent error code.messagestringHuman-readable description (English).
{
"error": {
"code": "unauthorized",
"message": "string"
}
}AccountSummaryidintegerUnique identifier.usernamestringYour username.planstring(premium)Membership plan. Alwayspremium, since the API requires Premium.creditsnumberCurrent credit balance.earningobjectCredits earned by surfing.credits_todaynumberCredits earned by surfing today.credits_last_7_daysnumberRolling sum over the last 7 days (today inclusive).
surfingobjectYour live surfing activity.active_sessionsintegerFeelingSurfViewer sessions active in the last few minutes.
site_slotsobjectSite-slot usage; create returns 403 onceusedreachesmax.usedintegerSite slots currently in use (your number of sites).maxintegerTotal site slots your plan allows.availableintegerUnused site slots (max minus used).
visit_own_sitesbooleanWhether the app also surfs your own sites.timezonestringnullableIANA timezone for active-hours scheduling; UTC is used when null.currencystring(eur,usd)Your billing currency.languagestring(en,fr,es,pt,ru,vi,id,tr,de,it,nl)Your account language (ISO code).newsletterbooleanNewsletter email opt-in.invoice_emailsbooleanWhether invoice emails are sent.subscriptionobjectPremium subscription lifecycle.activebooleanWhether an active premium subscription exists.renews_atstringnullableNext renewal date while active and not cancelled.ends_atstringnullableWhen premium access ends after a cancellation.
{
"id": 98221,
"username": "acme",
"plan": "premium",
"credits": 5000,
"earning": {
"credits_today": 0,
"credits_last_7_days": 0
},
"surfing": {
"active_sessions": 1
},
"site_slots": {
"used": 1,
"max": 12,
"available": 11
},
"visit_own_sites": false,
"timezone": null,
"currency": "eur",
"language": "en",
"newsletter": true,
"invoice_emails": true,
"subscription": {
"active": true,
"renews_at": "2026-12-25T12:00:00Z",
"ends_at": null
}
}ReferralSummaryreferral_linkstringShareable signup link that credits you for the referral.referred_countintegerNumber of (non-banned) users you referred.commission_percentintegerYour referral commission: you get this percentage of every credit your referrals earn, forever (10 for Free accounts, 20 for Premium).credits_earnedobjectCredits earned from referrals.totalnumberAll-time commission credits.todaynumberCommission credits earned today.last_7_daysnumberRolling sum over the last 7 days (today inclusive).
{
"referral_link": "https://www.feelingsurf.fr/r/98220",
"referred_count": 0,
"commission_percent": 20,
"credits_earned": {
"total": 0,
"today": 0,
"last_7_days": 0
}
}AccountSettingsUpdateWritable account settings. Provide at least one. Email, password and billing are intentionally not editable via the API.
visit_own_sitesbooleanWhether the app also surfs your own sites.timezonestringnullableAn IANA timezone name (e.g. "Europe/Paris"), or null to clear (scheduling then uses UTC).currencystring(eur,usd)Your billing currency.languagestring(en,fr,es,pt,ru,vi,id,tr,de,it,nl)Your account language (ISO code).newsletterbooleanNewsletter email opt-in.invoice_emailsbooleanWhether invoice emails are sent.
PageMetaPagination metadata for a list response.
limitintegerPage size applied (clamped).offsetintegerNumber of items skipped before this page.totalintegerTotal number of items across all pages.
{
"limit": 50,
"offset": 0,
"total": 1
}TrafficAvailabilitySurfer-traffic availability for a country (guides location targeting).
codestringISO 3166-1 alpha-2 country code.namestringLocalized country name.continentstringISO continent code (EU, AS, NA, AF, SA, OC, AN).availabilitystring(none,low,medium,high)Relative volume of surfer traffic available in this country.
{
"code": "AD",
"name": "Andorra",
"continent": "EU",
"availability": "low"
}SurfSessionA FeelingSurfViewer session on your account. The IP is your own instance's IP. Sessions older than 7 days, and inactive ones that earned nothing, are not returned.
ip_addressstringThe IP address this session runs from.country_codestringnullableISO country code of the IP, or null if unknown.credits_earnednumberCredits this session has earned.activebooleanWhether the session was active in the last few minutes.last_activity_atstringnullableWhen the session was last active.app_versionstringnullableFeelingSurfViewer app version, e.g. "2.5.0".app_version_outdatedbooleanWhether this app version is behind the current release.app_version_supported_untilstringnullableWhen support for this app version ends, or null.low_quality_ipbooleanThe IP is classified low-quality (earns more slowly).overused_ipbooleanTrue when this IP has tripped one of your account's session limits — for example too many simultaneous sessions from the same IP or IP subnet, or your account-wide session cap. While flagged, further sessions from the IP are rejected, so it earns less until it drops back under the limit.
{
"ip_address": "203.0.113.42",
"country_code": "US",
"credits_earned": 128.5,
"active": true,
"last_activity_at": "2026-06-25T09:04:36Z",
"app_version": "2.5.0",
"app_version_outdated": false,
"app_version_supported_until": null,
"low_quality_ip": false,
"overused_ip": false
}SiteA website that receives automated visits. Relation-backed settings (geo targeting, blocked domains, actions, traffic sources, labels) are added alongside their write endpoints.
idintegerUnique identifier.urlstringThe website's URL.namestringnullableOptional user-chosen name.pausedbooleanWhether the user has paused delivery.blockedbooleanWhether the platform has blocked the site (e.g. dead link).limit_reachedbooleanWhether a configured visit cap has been reached.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
traffic_sourcesinteger[]IDs of assigned traffic sources (resolve via GET /v1/traffic-sources).labelsinteger[]IDs of assigned labels (resolve via GET /v1/labels).total_visitsintegerLifetime visits delivered.created_atstringnullableWhen it was created (UTC), or null.
{
"id": 2761880,
"url": "https://example.com",
"name": "My landing page",
"paused": false,
"blocked": false,
"limit_reached": false,
"devices": {
"desktop": 100,
"mobile": 0,
"tablet": 0
},
"visit_duration": {
"min_seconds": 10,
"max_seconds": 10
},
"visit_distribution": "even",
"limits": {
"hourly": 50,
"daily": null,
"total": null
},
"schedule": {
"active_hours_mask": null,
"time_zone": null
},
"traffic_quality": {
"low_quality_ips": true,
"ipv6": true
},
"browsing": {
"max_sub_windows": 0
},
"traffic_sources": [1],
"labels": [],
"total_visits": 0,
"created_at": "2026-06-25T07:58:02Z"
}SiteActionAn action FeelingSurfViewer performs during the visit (click a link, scroll, set a cookie, etc.).
typestring(click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointeger(0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
SiteActionInputA site action to apply. Same shape as SiteAction, but type and ratio are required.
typestringrequired (click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointegerrequired (0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
SiteDetailA site with its full configuration (returned by GET /v1/sites/{id}).
idintegerUnique identifier.urlstringThe website's URL.namestringnullableOptional user-chosen name.pausedbooleanWhether the user has paused delivery.blockedbooleanWhether the platform has blocked the site (e.g. dead link).limit_reachedbooleanWhether a configured visit cap has been reached.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
traffic_sourcesinteger[]IDs of assigned traffic sources (resolve via GET /v1/traffic-sources).labelsinteger[]IDs of assigned labels (resolve via GET /v1/labels).total_visitsintegerLifetime visits delivered.created_atstringnullableWhen it was created (UTC), or null.location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteAction[]The actions to perform.typestring(click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointeger(0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
visit_historyobjectRecent visit counts.by_hourinteger[]Visits per hour over the last 24h, oldest first (last = current hour).by_dayinteger[]Visits per day over the last 8 days, oldest first (last = today).
{
"id": 2761880,
"url": "https://example.com",
"name": "My landing page",
"paused": false,
"blocked": false,
"limit_reached": false,
"devices": {
"desktop": 100,
"mobile": 0,
"tablet": 0
},
"visit_duration": {
"min_seconds": 10,
"max_seconds": 10
},
"visit_distribution": "even",
"limits": {
"hourly": 50,
"daily": null,
"total": null
},
"schedule": {
"active_hours_mask": null,
"time_zone": null
},
"traffic_quality": {
"low_quality_ips": true,
"ipv6": true
},
"browsing": {
"max_sub_windows": 0
},
"traffic_sources": [1],
"labels": [],
"total_visits": 0,
"created_at": "2026-06-25T07:58:02Z",
"location_targeting": {
"mode": "include",
"locations": []
},
"blocked_domains": {
"rate": 100,
"domains": []
},
"actions": {
"window": "latest",
"items": []
},
"visit_history": {
"by_hour": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"by_day": [0, 0, 0, 0, 0, 0, 0, 0]
}
}SiteUpdateWritable fields of a site. For PATCH, provide at least one; only the fields present are changed.
namestringnullableUser-chosen name; null clears it.pausedbooleanPause or resume visit delivery.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteActionInput[]The actions to perform.typestringrequired (click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointegerrequired (0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of traffic sources to assign; an empty list assigns the default "Direct visits" source.labelsinteger[]IDs of labels to assign.
SiteCreateFields for creating a site. Only url is required; all others default to a new-site configuration. When template_id is given, that template's settings seed the defaults and any field set explicitly here overrides them (shallow, per top-level key).
urlstringrequiredThe website's URL.namestringnullableUser-chosen name; null clears it.pausedbooleanPause or resume visit delivery.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteActionInput[]The actions to perform.typestringrequired (click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointegerrequired (0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of traffic sources to assign; an empty list assigns the default "Direct visits" source.labelsinteger[]IDs of labels to assign.template_idintegerA site template to apply as the base configuration. Must be one of your own templates; an unknown id returns 422. The template's settings become the defaults; any field you also send in this request overrides the template's value for that whole field (shallow merge, per top-level field).
SiteTemplateA reusable bundle of site settings. Mirrors a site's configuration minus the site-only fields (url, paused, blocked, labels, visit history), plus a name.
idintegerUnique identifier.namestringnullableTemplate name.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteAction[]The actions to perform.typestring(click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointeger(0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of assigned traffic sources (resolve via GET /v1/traffic-sources).created_atstringnullableWhen it was created (UTC), or null.
{
"id": 2644,
"name": "Default desktop",
"devices": {
"desktop": 100,
"mobile": 0,
"tablet": 0
},
"visit_duration": {
"min_seconds": 10,
"max_seconds": 10
},
"visit_distribution": "even",
"limits": {
"hourly": 50,
"daily": null,
"total": null
},
"schedule": {
"active_hours_mask": null,
"time_zone": null
},
"traffic_quality": {
"low_quality_ips": true,
"ipv6": true
},
"browsing": {
"max_sub_windows": 0
},
"location_targeting": {
"mode": "include",
"locations": []
},
"blocked_domains": {
"rate": 100,
"domains": []
},
"actions": {
"window": "latest",
"items": []
},
"traffic_sources": [],
"created_at": "2026-06-25T07:58:02Z"
}SiteTemplateUpdateWritable fields of a site template. For PATCH, provide at least one; only the fields present are changed.
namestringnullableTemplate name.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteActionInput[]The actions to perform.typestringrequired (click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointegerrequired (0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of traffic sources to assign.
SiteTemplateCreateFields for creating a site template. Only name is required; all others default to a new-template configuration.
namestringrequiredTemplate name.devicesobjectDevice targeting split, as percentages summing to 100.desktopinteger(0–100)Percentage of visits sent to desktop devices.mobileinteger(0–100)Percentage of visits sent to mobile devices.tabletinteger(0–100)Percentage of visits sent to tablet devices.
visit_durationobjectVisit duration range, in seconds.min_secondsinteger(10–600)Shortest visit duration, in seconds.max_secondsinteger(10–600)Longest visit duration, in seconds.
visit_distributionstring(even,asap)How visits are paced — "even" spreads them across the day, "asap" delivers as fast as possible.limitsobjectVisit caps; null means no limit.hourlyinteger(1–500)Max visits per hour — always at least 1 (an hourly cap is mandatory).dailyintegernullable (1–10000)Max visits per day; null means no limit.totalintegernullable (1–500000)Max visits in total (lifetime); null means no limit.
scheduleobjectActive-hours scheduling.active_hours_maskstringnullableA weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is1(active that hour) or0(paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, intime_zone.nullor all-1s means always on; at least one hour must be active, so an all-0s mask is rejected.time_zonestringnullableIANA time zone for the active-hours schedule (e.g. "Europe/Paris"); null uses your account timezone.
location_targetingobjectCountry/continent targeting.modestring(include,exclude)Whether the locations list is an allow-list (include) or a block-list (exclude).locationsobject[]The countries/continents to include or exclude.typestring(country,continent)Whether code is a country or a continent.codestringISO country code (alpha-2) or continent code, per type.
traffic_qualityobjectTraffic quality controls.low_quality_ipsbooleanWhether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site.ipv6booleanWhether IPv6 visitors may deliver visits to this site.
browsingobjectBrowsing options.max_sub_windowsinteger(0–1)How many pop-up windows the visited site may open during a visit.
blocked_domainsobjectDomains blocked during visits.rateinteger(0–100)Percentage of visits to which domain blocking applies.domainsstring[]Hostnames to block (e.g.ads.example.com; no scheme or path), one per entry. Up to 10.
actionsobjectAuto-actions performed during visits.windowstring(latest,first)Which opened browser window the actions target — the most recent (latest) or the first (first).itemsSiteActionInput[]The actions to perform.typestringrequired (click,click_rss,click_sitemap,cookie,scroll,refresh)What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh.ratiointegerrequired (0–100)Percentage of visits that perform this action (default 100 = every visit).elementobjectPresent for click-type actions.selectionstringnullable (random,first,last)Which element to click when several match.typestringnullable (any,internal_link,external_link,link,button)What to click: any element, a same-domain link (internal_link), an off-domain link (external_link), any link (link), or a button.url_filterstringnullableOnly click links whose URL contains this text; ignored when the element type isbutton.text_filterstringnullableOnly click elements whose visible text contains this.
cookieobjectPresent for cookie actions.namestringCookie name.valuestringCookie value.domainstringDomain to set the cookie on.
traffic_sourcesinteger[]IDs of traffic sources to assign.
TrafficSourceA traffic source (custom referer) a site can report visits as coming from.
idintegerUnique identifier.namestringnullableName of the traffic source; a default is shown when unset.refererstringThe referer reported to the target site. Only the scheme is removed, sohttps://www.google.com/is stored aswww.google.com/.premiumbooleanWhether this source is gated to Premium. Premium sources (your custom ones, plus some shared ones) are unassigned from your sites if your subscription lapses.custombooleanTrue for your own sources, false for shared/built-in ones. Independent ofpremium, since some shared sources are Premium-gated too.created_atstringnullableWhen it was created (UTC), or null.
{
"id": 166445,
"name": "Newsletter",
"referer": "www.google.com/",
"premium": true,
"custom": true,
"created_at": "2026-06-25T07:58:02Z"
}LabelidintegerUnique identifier.namestringLabel name.colorstring(#6610f2,#6f42c1,#d63384,#dc3545,#fd7e14,#ffc107,#198754,#20c997,#0dcaf0,#6c757d,#343a40)Label color.descriptionstringnullableOptional notes.
{
"id": 1744,
"name": "Campaign A",
"color": "#0dcaf0",
"description": "Q1 landing pages"
}ScreenshotImageurlstringURL to fetch the screenshot image.preview_urlstringnullableURL to fetch the blurred preview, or null.windowintegerBrowser window index the image was captured from.widthintegerImage width in pixels.heightintegerImage height in pixels.delay_secondsintegerSeconds into the visit when the image was captured.captured_atstringWhen the image was captured.
{
"url": "https://api.feelingsurf.fr/v1/screenshots/c99c25613c8b956ba2b3b0f1f764ce83",
"preview_url": "https://api.feelingsurf.fr/v1/screenshots/c99c25613c8b956ba2b3b0f1f764ce83/preview",
"window": 0,
"width": 1280,
"height": 720,
"delay_seconds": 5,
"captured_at": "2026-06-25T09:00:00Z"
}ScreenshotScreenshots captured during a single visit by the app.
uidstringUnique id for this visit's screenshot set.devicestring(desktop,mobile,tablet)Device category the visit ran on.orientationstring(landscape,portrait)Screen orientation.country_codestringnullableISO country code of the visitor, or null.country_namestringnullableLocalized country name, or null.visit_duration_secondsintegerHow long the visit lasted, in seconds.imagesScreenshotImage[]The captured images, one per browser window.urlstringURL to fetch the screenshot image.preview_urlstringnullableURL to fetch the blurred preview, or null.windowintegerBrowser window index the image was captured from.widthintegerImage width in pixels.heightintegerImage height in pixels.delay_secondsintegerSeconds into the visit when the image was captured.captured_atstringWhen the image was captured.
{
"uid": "2659c544-81ab-4841-912b-4005336a2a2e",
"device": "desktop",
"orientation": "landscape",
"country_code": "US",
"country_name": "United States",
"visit_duration_seconds": 45,
"images": [
{
"url": "https://api.feelingsurf.fr/v1/screenshots/c99c25613c8b956ba2b3b0f1f764ce83",
"preview_url": "https://api.feelingsurf.fr/v1/screenshots/c99c25613c8b956ba2b3b0f1f764ce83/preview",
"window": 0,
"width": 1280,
"height": 720,
"delay_seconds": 5,
"captured_at": "2026-06-25T09:00:00Z"
}
]
}TrafficSourceCreatenamestringrequiredName of the traffic source; a default is shown when unset.refererstringrequiredThe referer to report to the target site (a domain or full URL, e.g.https://www.google.com/); the scheme is stripped on save.
TrafficSourceUpdateProvide at least one field.
namestringName of the traffic source; a default is shown when unset.refererstringThe referer to report to the target site (a domain or full URL, e.g.https://www.google.com/); the scheme is stripped on save.
LabelCreatenamestringrequiredLabel name.colorstringrequired (#6610f2,#6f42c1,#d63384,#dc3545,#fd7e14,#ffc107,#198754,#20c997,#0dcaf0,#6c757d,#343a40)Label color.descriptionstringnullableOptional notes.
LabelUpdateProvide at least one field.
namestringLabel name.colorstring(#6610f2,#6f42c1,#d63384,#dc3545,#fd7e14,#ffc107,#198754,#20c997,#0dcaf0,#6c757d,#343a40)Label color.descriptionstringnullableOptional notes.