FeelingSurf
Manage your FeelingSurf traffic exchange account: sites, targeting, templates, sources and proxies.
사용해야 할까요
품질 및 안전성
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"feelingsurf": {
"url": "https://api.feelingsurf.fr/mcp"
}
}
}원격 엔드포인트
https://api.feelingsurf.fr/mcpstreamable-http할 수 있는 일
도구 목록
도구 (34)
🟢get_account
Get the authenticated account. Account summary plus the earn-side rollup (credits earned today / last 7 days), active FeelingSurfViewer session count, and site-slot usage.
입력 스키마
{
"type": "object",
"properties": {}
}🔴update_account(visit_own_sites, timezone, currency, language, newsletter, ...)
Update account settings. Update non-sensitive account settings (e.g. `visit_own_sites`, `timezone`). Writable account settings. Provide at least one. Email, password and billing are intentionally not editable via the API.
입력 스키마
{
"type": "object",
"properties": {
"visit_own_sites": {
"type": "boolean",
"description": "Whether the app also surfs your own sites."
},
"timezone": {
"type": [
"string",
"null"
],
"description": "An IANA timezone name (e.g. \"Europe/Paris\"), or null to clear (scheduling then uses UTC)."
},
"currency": {
"type": "string",
"enum": [
"eur",
"usd"
],
"description": "Your billing currency."
},
"language": {
"type": "string",
"enum": [
"en",
"fr",
"es",
"pt",
"ru",
"vi",
"id",
"tr",
"de",
"it",
"nl"
],
"description": "Your account language (ISO code)."
},
"newsletter": {
"type": "boolean",
"description": "Newsletter email opt-in."
},
"invoice_emails": {
"type": "boolean",
"description": "Whether invoice emails are sent."
}
}
}🟢list_surf_sessions(limit, offset)
List your FeelingSurfViewer sessions. Recent FeelingSurfViewer sessions on your account (the earning side), most recent first. These are your own FeelingSurfViewer instances and their IPs.
입력 스키마
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50,
"minimum": 1,
"maximum": 200,
"description": "Page size (clamped to 1..200)."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Number of items to skip."
}
}
}🟢get_referrals
Get your referral program. Your shareable referral link, how many users you've referred, your commission rate, and commission credits earned.
입력 스키마
{
"type": "object",
"properties": {}
}🟢get_traffic_availability
Traffic availability by country. Surfer-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.
입력 스키마
{
"type": "object",
"properties": {}
}🟢list_sites(limit, offset)
List your sites.
입력 스키마
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50,
"minimum": 1,
"maximum": 200,
"description": "Page size (clamped to 1..200)."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Number of items to skip."
}
}
}🟢get_site(id)
Get one site.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Site identifier."
}
},
"required": [
"id"
]
}🟡create_site(name, paused, devices, visit_duration, visit_distribution, ...)
Create a site. Only `url` is required; every other field defaults to a new-site configuration. Exceeding the account's slot count returns 403 `site_limit_reached`. Fields 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).
입력 스키마
{
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
],
"description": "User-chosen name; null clears it."
},
"paused": {
"type": "boolean",
"description": "Pause or resume visit delivery."
},
"devices": {
"type": "object",
"description": "Device targeting split, as percentages summing to 100.",
"properties": {
"desktop": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to desktop devices."
},
"mobile": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to mobile devices."
},
"tablet": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to tablet devices."
}
}
},
"visit_duration": {
"type": "object",
"description": "Visit duration range, in seconds.",
"properties": {
"min_seconds": {
"type": "integer",
"minimum": 10,
"maximum": 600,
"description": "Shortest visit duration, in seconds."
},
"max_seconds": {
"type": "integer",
"minimum": 10,
"maximum": 600,
"description": "Longest visit duration, in seconds."
}
}
},
"visit_distribution": {
"type": "string",
"enum": [
"even",
"asap"
],
"description": "How visits are paced — \"even\" spreads them across the day, \"asap\" delivers as fast as possible."
},
"limits": {
"type": "object",
"description": "Visit caps; null means no limit.",
"properties": {
"hourly": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"description": "Max visits per hour — always at least 1 (an hourly cap is mandatory)."
},
"daily": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 10000,
"description": "Max visits per day; null means no limit."
},
"total": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 500000,
"description": "Max visits in total (lifetime); null means no limit."
}
}
},
"schedule": {
"type": "object",
"description": "Active-hours scheduling.",
"properties": {
"active_hours_mask": {
"type": [
"string",
"null"
],
"description": "A weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is `1` (active that hour) or `0` (paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, in `time_zone`. `null` or all-`1`s means always on; at least one hour must be active, so an all-`0`s mask is rejected.\n"
},
"time_zone": {
"type": [
"string",
"null"
],
"description": "IANA time zone for the active-hours schedule (e.g. \"Europe/Paris\"); null uses your account timezone."
}
}
},
"location_targeting": {
"type": "object",
"description": "Country/continent targeting.",
"properties": {
"mode": {
"type": "string",
"enum": [
"include",
"exclude"
],
"description": "Whether the locations list is an allow-list (include) or a block-list (exclude)."
},
"locations": {
"type": "array",
"description": "The countries/continents to include or exclude.",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"country",
"continent"
],
"description": "Whether code is a country or a continent."
},
"code": {
"type": "string",
"description": "ISO country code (alpha-2) or continent code, per type."
}
}
}
}
}
},
"traffic_quality": {
"type": "object",
"description": "Traffic quality controls.",
"properties": {
"low_quality_ips": {
"type": "boolean",
"description": "Whether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site."
},
"ipv6": {
"type": "boolean",
"description": "Whether IPv6 visitors may deliver visits to this site."
}
}
},
"browsing": {
"type": "object",
"description": "Browsing options.",
"properties": {
"max_sub_windows": {
"type": "integer",
"minimum": 0,
"maximum": 1,
"description": "How many pop-up windows the visited site may open during a visit."
}
}
},
"blocked_domains": {
"type": "object",
"description": "Domains blocked during visits.",
"properties": {
"rate": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits to which domain blocking applies."
},
"domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hostnames to block (e.g. `ads.example.com`; no scheme or path), one per entry. Up to 10."
}
}
},
"actions": {
"type": "object",
"description": "Auto-actions performed during visits.",
"properties": {
"window": {
"type": "string",
"enum": [
"latest",
"first"
],
"description": "Which opened browser window the actions target — the most recent (latest) or the first (first)."
},
"items": {
"type": "array",
"description": "The actions to perform.",
"items": {
"description": "A site action to apply. Same shape as SiteAction, but type and ratio are required.",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"click",
"click_rss",
"click_sitemap",
"cookie",
"scroll",
"refresh"
],
"description": "What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh."
},
"ratio": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits that perform this action (default 100 = every visit)."
},
"element": {
"type": "object",
"description": "Present for click-type actions.",
"properties": {
"selection": {
"type": [
"string",
"null"
],
"enum": [
"random",
"first",
"last",
null
],
"description": "Which element to click when several match."
},
"type": {
"type": [
"string",
"null"
],
"enum": [
"any",
"internal_link",
"external_link",
"link",
"button",
null
],
"description": "What to click: any element, a same-domain link (`internal_link`), an off-domain link (`external_link`), any link (`link`), or a button.\n"
},
"url_filter": {
"type": [
"string",
"null"
],
"description": "Only click links whose URL contains this text; ignored when the element type is `button`."
},
"text_filter": {
"type": [
"string",
"null"
],
"description": "Only click elements whose visible text contains this."
}
}
},
"cookie": {
"type": "object",
"description": "Present for cookie actions.",
"properties": {
"name": {
"type": "string",
"description": "Cookie name."
},
"value": {
"type": "string",
"description": "Cookie value."
},
"domain": {
"type": "string",
"description": "Domain to set the cookie on."
}
}
}
},
"required": [
"type",
"ratio"
]
}
}
}
},
"traffic_sources": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of traffic sources to assign; an empty list assigns the default \"Direct visits\" source."
},
"labels": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of labels to assign."
},
"url": {
"type": "string",
"description": "The website's URL."
},
"template_id": {
"type": "integer",
"format": "int64",
"description": "A 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).\n"
}
},
"required": [
"url"
]
}🔴update_site(id, name, paused, devices, visit_duration, ...)
Update a site. Writable fields of a site. For PATCH, provide at least one; only the fields present are changed.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Site identifier."
},
"name": {
"type": [
"string",
"null"
],
"description": "User-chosen name; null clears it."
},
"paused": {
"type": "boolean",
"description": "Pause or resume visit delivery."
},
"devices": {
"type": "object",
"description": "Device targeting split, as percentages summing to 100.",
"properties": {
"desktop": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to desktop devices."
},
"mobile": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to mobile devices."
},
"tablet": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to tablet devices."
}
}
},
"visit_duration": {
"type": "object",
"description": "Visit duration range, in seconds.",
"properties": {
"min_seconds": {
"type": "integer",
"minimum": 10,
"maximum": 600,
"description": "Shortest visit duration, in seconds."
},
"max_seconds": {
"type": "integer",
"minimum": 10,
"maximum": 600,
"description": "Longest visit duration, in seconds."
}
}
},
"visit_distribution": {
"type": "string",
"enum": [
"even",
"asap"
],
"description": "How visits are paced — \"even\" spreads them across the day, \"asap\" delivers as fast as possible."
},
"limits": {
"type": "object",
"description": "Visit caps; null means no limit.",
"properties": {
"hourly": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"description": "Max visits per hour — always at least 1 (an hourly cap is mandatory)."
},
"daily": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 10000,
"description": "Max visits per day; null means no limit."
},
"total": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 500000,
"description": "Max visits in total (lifetime); null means no limit."
}
}
},
"schedule": {
"type": "object",
"description": "Active-hours scheduling.",
"properties": {
"active_hours_mask": {
"type": [
"string",
"null"
],
"description": "A weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is `1` (active that hour) or `0` (paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, in `time_zone`. `null` or all-`1`s means always on; at least one hour must be active, so an all-`0`s mask is rejected.\n"
},
"time_zone": {
"type": [
"string",
"null"
],
"description": "IANA time zone for the active-hours schedule (e.g. \"Europe/Paris\"); null uses your account timezone."
}
}
},
"location_targeting": {
"type": "object",
"description": "Country/continent targeting.",
"properties": {
"mode": {
"type": "string",
"enum": [
"include",
"exclude"
],
"description": "Whether the locations list is an allow-list (include) or a block-list (exclude)."
},
"locations": {
"type": "array",
"description": "The countries/continents to include or exclude.",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"country",
"continent"
],
"description": "Whether code is a country or a continent."
},
"code": {
"type": "string",
"description": "ISO country code (alpha-2) or continent code, per type."
}
}
}
}
}
},
"traffic_quality": {
"type": "object",
"description": "Traffic quality controls.",
"properties": {
"low_quality_ips": {
"type": "boolean",
"description": "Whether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site."
},
"ipv6": {
"type": "boolean",
"description": "Whether IPv6 visitors may deliver visits to this site."
}
}
},
"browsing": {
"type": "object",
"description": "Browsing options.",
"properties": {
"max_sub_windows": {
"type": "integer",
"minimum": 0,
"maximum": 1,
"description": "How many pop-up windows the visited site may open during a visit."
}
}
},
"blocked_domains": {
"type": "object",
"description": "Domains blocked during visits.",
"properties": {
"rate": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits to which domain blocking applies."
},
"domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hostnames to block (e.g. `ads.example.com`; no scheme or path), one per entry. Up to 10."
}
}
},
"actions": {
"type": "object",
"description": "Auto-actions performed during visits.",
"properties": {
"window": {
"type": "string",
"enum": [
"latest",
"first"
],
"description": "Which opened browser window the actions target — the most recent (latest) or the first (first)."
},
"items": {
"type": "array",
"description": "The actions to perform.",
"items": {
"description": "A site action to apply. Same shape as SiteAction, but type and ratio are required.",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"click",
"click_rss",
"click_sitemap",
"cookie",
"scroll",
"refresh"
],
"description": "What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh."
},
"ratio": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits that perform this action (default 100 = every visit)."
},
"element": {
"type": "object",
"description": "Present for click-type actions.",
"properties": {
"selection": {
"type": [
"string",
"null"
],
"enum": [
"random",
"first",
"last",
null
],
"description": "Which element to click when several match."
},
"type": {
"type": [
"string",
"null"
],
"enum": [
"any",
"internal_link",
"external_link",
"link",
"button",
null
],
"description": "What to click: any element, a same-domain link (`internal_link`), an off-domain link (`external_link`), any link (`link`), or a button.\n"
},
"url_filter": {
"type": [
"string",
"null"
],
"description": "Only click links whose URL contains this text; ignored when the element type is `button`."
},
"text_filter": {
"type": [
"string",
"null"
],
"description": "Only click elements whose visible text contains this."
}
}
},
"cookie": {
"type": "object",
"description": "Present for cookie actions.",
"properties": {
"name": {
"type": "string",
"description": "Cookie name."
},
"value": {
"type": "string",
"description": "Cookie value."
},
"domain": {
"type": "string",
"description": "Domain to set the cookie on."
}
}
}
},
"required": [
"type",
"ratio"
]
}
}
}
},
"traffic_sources": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of traffic sources to assign; an empty list assigns the default \"Direct visits\" source."
},
"labels": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of labels to assign."
}
},
"required": [
"id"
]
}🔴delete_site(id)
Delete a site.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Site identifier."
}
},
"required": [
"id"
]
}🟢list_deleted_sites(limit, offset)
List sites you can still restore. Sites you deleted within the retention window, most recently deleted first. Sites removed because a plan downgrade reduced your slot count are not listed: those come back on their own when you upgrade again.
입력 스키마
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50,
"minimum": 1,
"maximum": 200,
"description": "Page size (clamped to 1..200)."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Number of items to skip."
}
}
}⚪restore_site(id)
Restore a deleted site. Brings back a site you deleted, with the settings it had. Geo targeting, blocked domains and actions your plan cannot use stay suspended and come back empty. Returns 404 once the retention window has passed, and 403 `site_limit_reached` when you have no free slot.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Site identifier."
}
},
"required": [
"id"
]
}🟢list_site_screenshots(id)
List a site's FeelingSurfViewer screenshots. Screenshots captured while the app surfed the site. Returns the most recent (up to 24); this list is not paginated.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Site identifier."
}
},
"required": [
"id"
]
}🟢get_screenshot(uid)
Get a screenshot image. Returns the image FeelingSurfViewer captured. The uid is the last path segment of an `images[].url` from list_site_screenshots.
입력 스키마
{
"type": "object",
"properties": {
"uid": {
"type": "string"
}
},
"required": [
"uid"
]
}🟢list_site_templates(limit, offset)
List your site templates.
입력 스키마
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50,
"minimum": 1,
"maximum": 200,
"description": "Page size (clamped to 1..200)."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Number of items to skip."
}
}
}🟢get_site_template(id)
Get one site template.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
}
},
"required": [
"id"
]
}🟡create_site_template(name, devices, visit_duration, visit_distribution, limits, ...)
Create a site template. A 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`. Fields for creating a site template. Only `name` is required; all others default to a new-template configuration.
입력 스키마
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Template name."
},
"devices": {
"type": "object",
"description": "Device targeting split, as percentages summing to 100.",
"properties": {
"desktop": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to desktop devices."
},
"mobile": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to mobile devices."
},
"tablet": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to tablet devices."
}
}
},
"visit_duration": {
"type": "object",
"description": "Visit duration range, in seconds.",
"properties": {
"min_seconds": {
"type": "integer",
"minimum": 10,
"maximum": 600,
"description": "Shortest visit duration, in seconds."
},
"max_seconds": {
"type": "integer",
"minimum": 10,
"maximum": 600,
"description": "Longest visit duration, in seconds."
}
}
},
"visit_distribution": {
"type": "string",
"enum": [
"even",
"asap"
],
"description": "How visits are paced — \"even\" spreads them across the day, \"asap\" delivers as fast as possible."
},
"limits": {
"type": "object",
"description": "Visit caps; null means no limit.",
"properties": {
"hourly": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"description": "Max visits per hour — always at least 1 (an hourly cap is mandatory)."
},
"daily": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 10000,
"description": "Max visits per day; null means no limit."
},
"total": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 500000,
"description": "Max visits in total (lifetime); null means no limit."
}
}
},
"schedule": {
"type": "object",
"description": "Active-hours scheduling.",
"properties": {
"active_hours_mask": {
"type": [
"string",
"null"
],
"description": "A weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is `1` (active that hour) or `0` (paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, in `time_zone`. `null` or all-`1`s means always on; at least one hour must be active, so an all-`0`s mask is rejected.\n"
},
"time_zone": {
"type": [
"string",
"null"
],
"description": "IANA time zone for the active-hours schedule (e.g. \"Europe/Paris\"); null uses your account timezone."
}
}
},
"location_targeting": {
"type": "object",
"description": "Country/continent targeting.",
"properties": {
"mode": {
"type": "string",
"enum": [
"include",
"exclude"
],
"description": "Whether the locations list is an allow-list (include) or a block-list (exclude)."
},
"locations": {
"type": "array",
"description": "The countries/continents to include or exclude.",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"country",
"continent"
],
"description": "Whether code is a country or a continent."
},
"code": {
"type": "string",
"description": "ISO country code (alpha-2) or continent code, per type."
}
}
}
}
}
},
"traffic_quality": {
"type": "object",
"description": "Traffic quality controls.",
"properties": {
"low_quality_ips": {
"type": "boolean",
"description": "Whether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site."
},
"ipv6": {
"type": "boolean",
"description": "Whether IPv6 visitors may deliver visits to this site."
}
}
},
"browsing": {
"type": "object",
"description": "Browsing options.",
"properties": {
"max_sub_windows": {
"type": "integer",
"minimum": 0,
"maximum": 1,
"description": "How many pop-up windows the visited site may open during a visit."
}
}
},
"blocked_domains": {
"type": "object",
"description": "Domains blocked during visits.",
"properties": {
"rate": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits to which domain blocking applies."
},
"domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hostnames to block (e.g. `ads.example.com`; no scheme or path), one per entry. Up to 10."
}
}
},
"actions": {
"type": "object",
"description": "Auto-actions performed during visits.",
"properties": {
"window": {
"type": "string",
"enum": [
"latest",
"first"
],
"description": "Which opened browser window the actions target — the most recent (latest) or the first (first)."
},
"items": {
"type": "array",
"description": "The actions to perform.",
"items": {
"description": "A site action to apply. Same shape as SiteAction, but type and ratio are required.",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"click",
"click_rss",
"click_sitemap",
"cookie",
"scroll",
"refresh"
],
"description": "What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh."
},
"ratio": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits that perform this action (default 100 = every visit)."
},
"element": {
"type": "object",
"description": "Present for click-type actions.",
"properties": {
"selection": {
"type": [
"string",
"null"
],
"enum": [
"random",
"first",
"last",
null
],
"description": "Which element to click when several match."
},
"type": {
"type": [
"string",
"null"
],
"enum": [
"any",
"internal_link",
"external_link",
"link",
"button",
null
],
"description": "What to click: any element, a same-domain link (`internal_link`), an off-domain link (`external_link`), any link (`link`), or a button.\n"
},
"url_filter": {
"type": [
"string",
"null"
],
"description": "Only click links whose URL contains this text; ignored when the element type is `button`."
},
"text_filter": {
"type": [
"string",
"null"
],
"description": "Only click elements whose visible text contains this."
}
}
},
"cookie": {
"type": "object",
"description": "Present for cookie actions.",
"properties": {
"name": {
"type": "string",
"description": "Cookie name."
},
"value": {
"type": "string",
"description": "Cookie value."
},
"domain": {
"type": "string",
"description": "Domain to set the cookie on."
}
}
}
},
"required": [
"type",
"ratio"
]
}
}
}
},
"traffic_sources": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of traffic sources to assign."
}
},
"required": [
"name"
]
}🔴update_site_template(id, name, devices, visit_duration, visit_distribution, ...)
Update a site template. Writable fields of a site template. For PATCH, provide at least one; only the fields present are changed.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
},
"name": {
"type": [
"string",
"null"
],
"description": "Template name."
},
"devices": {
"type": "object",
"description": "Device targeting split, as percentages summing to 100.",
"properties": {
"desktop": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to desktop devices."
},
"mobile": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to mobile devices."
},
"tablet": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits sent to tablet devices."
}
}
},
"visit_duration": {
"type": "object",
"description": "Visit duration range, in seconds.",
"properties": {
"min_seconds": {
"type": "integer",
"minimum": 10,
"maximum": 600,
"description": "Shortest visit duration, in seconds."
},
"max_seconds": {
"type": "integer",
"minimum": 10,
"maximum": 600,
"description": "Longest visit duration, in seconds."
}
}
},
"visit_distribution": {
"type": "string",
"enum": [
"even",
"asap"
],
"description": "How visits are paced — \"even\" spreads them across the day, \"asap\" delivers as fast as possible."
},
"limits": {
"type": "object",
"description": "Visit caps; null means no limit.",
"properties": {
"hourly": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"description": "Max visits per hour — always at least 1 (an hourly cap is mandatory)."
},
"daily": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 10000,
"description": "Max visits per day; null means no limit."
},
"total": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 500000,
"description": "Max visits in total (lifetime); null means no limit."
}
}
},
"schedule": {
"type": "object",
"description": "Active-hours scheduling.",
"properties": {
"active_hours_mask": {
"type": [
"string",
"null"
],
"description": "A weekly on/off schedule: a 168-character string, one character per hour (24 hours × 7 days). Each is `1` (active that hour) or `0` (paused). The first character is Monday 00:00 and each next is the following hour, ending Sunday 23:00, in `time_zone`. `null` or all-`1`s means always on; at least one hour must be active, so an all-`0`s mask is rejected.\n"
},
"time_zone": {
"type": [
"string",
"null"
],
"description": "IANA time zone for the active-hours schedule (e.g. \"Europe/Paris\"); null uses your account timezone."
}
}
},
"location_targeting": {
"type": "object",
"description": "Country/continent targeting.",
"properties": {
"mode": {
"type": "string",
"enum": [
"include",
"exclude"
],
"description": "Whether the locations list is an allow-list (include) or a block-list (exclude)."
},
"locations": {
"type": "array",
"description": "The countries/continents to include or exclude.",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"country",
"continent"
],
"description": "Whether code is a country or a continent."
},
"code": {
"type": "string",
"description": "ISO country code (alpha-2) or continent code, per type."
}
}
}
}
}
},
"traffic_quality": {
"type": "object",
"description": "Traffic quality controls.",
"properties": {
"low_quality_ips": {
"type": "boolean",
"description": "Whether low-quality IPs (VPN/proxy/datacenter) may deliver visits to this site."
},
"ipv6": {
"type": "boolean",
"description": "Whether IPv6 visitors may deliver visits to this site."
}
}
},
"browsing": {
"type": "object",
"description": "Browsing options.",
"properties": {
"max_sub_windows": {
"type": "integer",
"minimum": 0,
"maximum": 1,
"description": "How many pop-up windows the visited site may open during a visit."
}
}
},
"blocked_domains": {
"type": "object",
"description": "Domains blocked during visits.",
"properties": {
"rate": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits to which domain blocking applies."
},
"domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hostnames to block (e.g. `ads.example.com`; no scheme or path), one per entry. Up to 10."
}
}
},
"actions": {
"type": "object",
"description": "Auto-actions performed during visits.",
"properties": {
"window": {
"type": "string",
"enum": [
"latest",
"first"
],
"description": "Which opened browser window the actions target — the most recent (latest) or the first (first)."
},
"items": {
"type": "array",
"description": "The actions to perform.",
"items": {
"description": "A site action to apply. Same shape as SiteAction, but type and ratio are required.",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"click",
"click_rss",
"click_sitemap",
"cookie",
"scroll",
"refresh"
],
"description": "What the app does — click a link, click an RSS or sitemap link, set a cookie, scroll, or refresh."
},
"ratio": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"description": "Percentage of visits that perform this action (default 100 = every visit)."
},
"element": {
"type": "object",
"description": "Present for click-type actions.",
"properties": {
"selection": {
"type": [
"string",
"null"
],
"enum": [
"random",
"first",
"last",
null
],
"description": "Which element to click when several match."
},
"type": {
"type": [
"string",
"null"
],
"enum": [
"any",
"internal_link",
"external_link",
"link",
"button",
null
],
"description": "What to click: any element, a same-domain link (`internal_link`), an off-domain link (`external_link`), any link (`link`), or a button.\n"
},
"url_filter": {
"type": [
"string",
"null"
],
"description": "Only click links whose URL contains this text; ignored when the element type is `button`."
},
"text_filter": {
"type": [
"string",
"null"
],
"description": "Only click elements whose visible text contains this."
}
}
},
"cookie": {
"type": "object",
"description": "Present for cookie actions.",
"properties": {
"name": {
"type": "string",
"description": "Cookie name."
},
"value": {
"type": "string",
"description": "Cookie value."
},
"domain": {
"type": "string",
"description": "Domain to set the cookie on."
}
}
}
},
"required": [
"type",
"ratio"
]
}
}
}
},
"traffic_sources": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of traffic sources to assign."
}
},
"required": [
"id"
]
}🔴delete_site_template(id)
Delete a site template.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
}
},
"required": [
"id"
]
}🟢list_traffic_sources(limit, offset)
List your traffic sources. Your own sources plus the shared/built-in ones, referenced by id from a site's `traffic_sources`.
입력 스키마
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50,
"minimum": 1,
"maximum": 200,
"description": "Page size (clamped to 1..200)."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Number of items to skip."
}
}
}🟢get_traffic_source(id)
Get one traffic source. Works for your own sources and for the shared defaults (e.g. id 1, "Direct visits").
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
}
},
"required": [
"id"
]
}🟡create_traffic_source(name, referer)
Create a traffic source. Exceeding the per-account source cap returns 403 `limit_reached`.
입력 스키마
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name of the traffic source; a default is shown when unset."
},
"referer": {
"type": "string",
"description": "The referer to report to the target site (a domain or full URL, e.g. `https://www.google.com/`); the scheme is stripped on save."
}
},
"required": [
"name",
"referer"
]
}🔴update_traffic_source(id, name, referer)
Update a traffic source. Provide at least one field.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
},
"name": {
"type": "string",
"description": "Name of the traffic source; a default is shown when unset."
},
"referer": {
"type": "string",
"description": "The referer to report to the target site (a domain or full URL, e.g. `https://www.google.com/`); the scheme is stripped on save."
}
},
"required": [
"id"
]
}🔴delete_traffic_source(id)
Delete a traffic source.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
}
},
"required": [
"id"
]
}🟢list_proxies(limit, offset)
List your proxies. Every proxy on your account, oldest first.
입력 스키마
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50,
"minimum": 1,
"maximum": 200,
"description": "Page size (clamped to 1..200)."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Number of items to skip."
}
}
}🟢get_proxy(id)
Get one proxy.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
}
},
"required": [
"id"
]
}🟡create_proxy(type, host, port, username, password)
Add a proxy. Registers a static proxy. FeelingSurfViewer checks it before any session goes through it, so a new proxy starts with `proven` false. Exceeding the per-account proxy cap returns 403 `proxy_limit_reached`; a host and port already on your account returns 422 `validation_error`.
입력 스키마
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"http",
"https",
"socks5"
],
"default": "http",
"description": "The proxy protocol, case-insensitive."
},
"host": {
"type": "string",
"description": "The proxy's public IPv4 or IPv6 address. Hostnames and private addresses are rejected; IPv6 is stored in its compressed form."
},
"port": {
"type": "integer",
"minimum": 1,
"maximum": 65535,
"description": "The proxy's port."
},
"username": {
"type": "string",
"description": "Username for an `http` or `https` proxy. Not allowed with `socks5`."
},
"password": {
"type": "string",
"description": "Password for an `http` or `https` proxy. Not allowed with `socks5`."
}
},
"required": [
"host",
"port"
]
}🔴update_proxy(id, enabled)
Pause or resume a proxy. Only `enabled` can change. Pausing or resuming clears `last_error` and its error history, and a resumed proxy is checked again at once, so this also brings back a proxy that was switched off after failing. To change the host, port or credentials, delete the proxy and add it again.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
},
"enabled": {
"type": "boolean",
"description": "False pauses the proxy, true resumes it."
}
},
"required": [
"id",
"enabled"
]
}🔴delete_proxy(id)
Remove a proxy.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
}
},
"required": [
"id"
]
}🟢list_labels(limit, offset)
List your labels. Referenced by id from a site's `labels`.
입력 스키마
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50,
"minimum": 1,
"maximum": 200,
"description": "Page size (clamped to 1..200)."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Number of items to skip."
}
}
}🟢get_label(id)
Get one label.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
}
},
"required": [
"id"
]
}🟡create_label(name, color, description)
Create a label. Exceeding the per-account label cap returns 403 `limit_reached`.
입력 스키마
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Label name."
},
"color": {
"type": "string",
"enum": [
"#6610f2",
"#6f42c1",
"#d63384",
"#dc3545",
"#fd7e14",
"#ffc107",
"#198754",
"#20c997",
"#0dcaf0",
"#6c757d",
"#343a40"
],
"description": "Label color."
},
"description": {
"type": [
"string",
"null"
],
"description": "Optional notes."
}
},
"required": [
"name",
"color"
]
}🔴update_label(id, name, color, description)
Update a label. Provide at least one field.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
},
"name": {
"type": "string",
"description": "Label name."
},
"color": {
"type": "string",
"enum": [
"#6610f2",
"#6f42c1",
"#d63384",
"#dc3545",
"#fd7e14",
"#ffc107",
"#198754",
"#20c997",
"#0dcaf0",
"#6c757d",
"#343a40"
],
"description": "Label color."
},
"description": {
"type": [
"string",
"null"
],
"description": "Optional notes."
}
},
"required": [
"id"
]
}🔴delete_label(id)
Delete a label.
입력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64",
"description": "Resource identifier."
}
},
"required": [
"id"
]
}커뮤니티
증거