{
  "schemaVersion": "1.0",
  "item": {
    "slug": "foxreach-io",
    "name": "Foxreach Cold Outrach",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/concaption/foxreach-io",
    "canonicalUrl": "https://clawhub.ai/concaption/foxreach-io",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/foxreach-io",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=foxreach-io",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "examples.md",
      "SKILL.md",
      "api-reference.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/foxreach-io"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/foxreach-io",
    "agentPageUrl": "https://openagent3.xyz/skills/foxreach-io/agent",
    "manifestUrl": "https://openagent3.xyz/skills/foxreach-io/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/foxreach-io/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "FoxReach API Management Skill",
        "body": "You are managing the FoxReach cold email outreach platform through its Python SDK and CLI. This skill covers all API operations for leads, campaigns, sequences, templates, email accounts, inbox, and analytics."
      },
      {
        "title": "Setup & Authentication",
        "body": "The Python SDK is at integrations/sdk-python/ and the CLI is at integrations/cli/. Both use API key authentication with keys prefixed otr_.\n\nCheck if the SDK is available:\n\npython -c \"from foxreach import FoxReach; print('SDK ready')\"\n\nIf not installed, install it:\n\ncd integrations/sdk-python && pip install -e .\n\nAuthentication — Always get the API key from the user or environment before making calls. Never hardcode keys. Use environment variable injection:\n\nFOXREACH_API_KEY=otr_... python script.py\n\nOr use the CLI config:\n\ncd integrations/cli && PYTHONPATH=. python -m foxreach_cli.main config set-key --key otr_..."
      },
      {
        "title": "How to Execute Operations",
        "body": "Write inline Python scripts using the SDK. Always follow this pattern:\n\nimport json\nfrom foxreach import FoxReach\n\nclient = FoxReach(api_key=\"otr_USER_KEY_HERE\")\n\n# ... perform operation ...\n\nclient.close()\n\nFor quick operations, use one-liners:\n\npython -c \"\nfrom foxreach import FoxReach\nclient = FoxReach(api_key='otr_...')\nresult = client.leads.list(page_size=10)\nfor lead in result:\n    print(f'{lead.id}  {lead.email}  {lead.status}')\nprint(f'Total: {result.meta.total}')\nclient.close()\n\""
      },
      {
        "title": "Resource Reference",
        "body": "For complete API details, see api-reference.md.\nFor usage examples of every operation, see examples.md."
      },
      {
        "title": "Leads",
        "body": "ActionMethodNotesListclient.leads.list(page=1, page_size=50, search=..., status=..., tags=...)Paginated, filterableGetclient.leads.get(lead_id)Returns single LeadCreateclient.leads.create(LeadCreate(email=..., first_name=..., ...))Deduplicates by emailUpdateclient.leads.update(lead_id, LeadUpdate(company=..., ...))Partial updateDeleteclient.leads.delete(lead_id)Soft-delete"
      },
      {
        "title": "Campaigns",
        "body": "ActionMethodNotesListclient.campaigns.list(status=...)Filter by draft/active/paused/completedGetclient.campaigns.get(campaign_id)Includes statsCreateclient.campaigns.create(CampaignCreate(name=..., ...))Creates in draftUpdateclient.campaigns.update(campaign_id, CampaignUpdate(...))Can't edit if activeDeleteclient.campaigns.delete(campaign_id)Must be draftStartclient.campaigns.start(campaign_id)Transitions to activePauseclient.campaigns.pause(campaign_id)Pauses sendingAdd Leadsclient.campaigns.add_leads(campaign_id, [lead_ids])Bulk addAdd Accountsclient.campaigns.add_accounts(campaign_id, [account_ids])Assign senders"
      },
      {
        "title": "Sequences (nested under campaigns)",
        "body": "ActionMethodNotesListclient.campaigns.sequences.list(campaign_id)All stepsCreateclient.campaigns.sequences.create(campaign_id, SequenceCreate(body=..., ...))Add stepUpdateclient.campaigns.sequences.update(campaign_id, seq_id, SequenceUpdate(...))Edit stepDeleteclient.campaigns.sequences.delete(campaign_id, seq_id)Remove step"
      },
      {
        "title": "Templates",
        "body": "ActionMethodNotesListclient.templates.list()PaginatedGetclient.templates.get(template_id)Single templateCreateclient.templates.create(TemplateCreate(name=..., body=...))New templateUpdateclient.templates.update(template_id, TemplateUpdate(...))Partial updateDeleteclient.templates.delete(template_id)Remove"
      },
      {
        "title": "Email Accounts",
        "body": "ActionMethodNotesListclient.email_accounts.list()PaginatedGetclient.email_accounts.get(account_id)With health metricsDeleteclient.email_accounts.delete(account_id)Remove"
      },
      {
        "title": "Inbox",
        "body": "ActionMethodNotesList Threadsclient.inbox.list_threads(category=..., is_read=..., ...)FilterableGetclient.inbox.get(reply_id)Full threadUpdateclient.inbox.update(reply_id, ThreadUpdate(is_read=..., ...))Mark read/starred"
      },
      {
        "title": "Analytics",
        "body": "ActionMethodNotesOverviewclient.analytics.overview()Dashboard KPIsCampaignclient.analytics.campaign(campaign_id)Metrics + daily stats"
      },
      {
        "title": "Pagination",
        "body": "List endpoints return PaginatedResponse objects:\n\nresult = client.leads.list(page=1, page_size=50, search=\"acme\")\n\n# Access data\nfor lead in result:\n    print(lead.email)\n\n# Check pagination info\nprint(f\"Page {result.meta.page}/{result.meta.total_pages}, {result.meta.total} total\")\n\n# Get next page\nif result.has_next_page():\n    next_result = result.next_page()\n\n# Auto-paginate through ALL results\nfor lead in client.leads.list().auto_paging_iter():\n    print(lead.email)"
      },
      {
        "title": "Error Handling",
        "body": "Always wrap API calls in try/except:\n\nfrom foxreach import FoxReach, NotFoundError, RateLimitError, AuthenticationError, FoxReachError\n\ntry:\n    lead = client.leads.get(\"cld_nonexistent\")\nexcept NotFoundError:\n    print(\"Lead not found\")\nexcept AuthenticationError:\n    print(\"Invalid API key\")\nexcept RateLimitError as e:\n    print(f\"Rate limited. Retry after {e.retry_after}s\")\nexcept FoxReachError as e:\n    print(f\"API error: {e}\")"
      },
      {
        "title": "Template Variables & Personalization",
        "body": "Email bodies support variable substitution using {{variable}} syntax:\n\n{{firstName}}, {{lastName}}, {{email}}\n{{company}}, {{title}}, {{phone}}\n{{website}}, {{linkedinUrl}}\nCustom fields: {{customFieldName}}\n\nSpintax is also supported: {Hi|Hey|Hello} {{firstName}}"
      },
      {
        "title": "1. Full Campaign Setup",
        "body": "When the user wants to set up a complete campaign, follow these steps in order:\n\nCreate the campaign with campaigns.create()\nAdd sequence steps with campaigns.sequences.create() for each email in the chain\nAdd leads with campaigns.add_leads()\nAssign email accounts with campaigns.add_accounts()\nStart the campaign with campaigns.start()"
      },
      {
        "title": "2. Check Campaign Performance",
        "body": "Get campaign analytics with analytics.campaign(id)\nShow sent, delivered, bounced, replied, opened stats\nShow reply rate and bounce rate\nIf daily_stats are available, summarize trends"
      },
      {
        "title": "3. Manage Inbox",
        "body": "List unread threads with inbox.list_threads(is_read=False)\nCategorize replies by updating with inbox.update(id, ThreadUpdate(category=\"interested\"))\nCommon categories: interested, not_interested, out_of_office, wrong_person, unsubscribe"
      },
      {
        "title": "4. Bulk Lead Import",
        "body": "For adding multiple leads, create them one by one (the API deduplicates by email):\n\nleads_data = [\n    {\"email\": \"a@example.com\", \"first_name\": \"Alice\", \"company\": \"Acme\"},\n    {\"email\": \"b@example.com\", \"first_name\": \"Bob\", \"company\": \"Beta\"},\n]\ncreated = []\nfor data in leads_data:\n    lead = client.leads.create(LeadCreate(**data))\n    created.append(lead)\n    print(f\"Created: {lead.id} - {lead.email}\")"
      },
      {
        "title": "Important Notes",
        "body": "Base URL: https://api.foxreach.io/api/v1\nRate limit: 100 requests per minute. The SDK auto-retries on 429.\nID prefixes: Leads cld_, Campaigns cmp_, Replies rpl_, Templates tpl_\nTimezone: All datetimes in UTC ISO 8601 format.\nSending days: Array of integers, 1=Monday through 7=Sunday.\nSending hours: 0-23 range, in the campaign's timezone.\nCampaign status flow: draft → active → paused → active → completed\nSoft deletes: Leads are soft-deleted and can reappear on re-import.\nAlways confirm with the user before destructive operations (delete, start campaign).\nWhen listing data, default to showing a formatted summary, not raw JSON.\nWhen creating resources, confirm the details with the user before executing."
      }
    ],
    "body": "FoxReach API Management Skill\n\nYou are managing the FoxReach cold email outreach platform through its Python SDK and CLI. This skill covers all API operations for leads, campaigns, sequences, templates, email accounts, inbox, and analytics.\n\nSetup & Authentication\n\nThe Python SDK is at integrations/sdk-python/ and the CLI is at integrations/cli/. Both use API key authentication with keys prefixed otr_.\n\nCheck if the SDK is available:\n\npython -c \"from foxreach import FoxReach; print('SDK ready')\"\n\n\nIf not installed, install it:\n\ncd integrations/sdk-python && pip install -e .\n\n\nAuthentication — Always get the API key from the user or environment before making calls. Never hardcode keys. Use environment variable injection:\n\nFOXREACH_API_KEY=otr_... python script.py\n\n\nOr use the CLI config:\n\ncd integrations/cli && PYTHONPATH=. python -m foxreach_cli.main config set-key --key otr_...\n\nHow to Execute Operations\n\nWrite inline Python scripts using the SDK. Always follow this pattern:\n\nimport json\nfrom foxreach import FoxReach\n\nclient = FoxReach(api_key=\"otr_USER_KEY_HERE\")\n\n# ... perform operation ...\n\nclient.close()\n\n\nFor quick operations, use one-liners:\n\npython -c \"\nfrom foxreach import FoxReach\nclient = FoxReach(api_key='otr_...')\nresult = client.leads.list(page_size=10)\nfor lead in result:\n    print(f'{lead.id}  {lead.email}  {lead.status}')\nprint(f'Total: {result.meta.total}')\nclient.close()\n\"\n\nResource Reference\n\nFor complete API details, see api-reference.md. For usage examples of every operation, see examples.md.\n\nQuick Reference — Available Operations\nLeads\nAction\tMethod\tNotes\nList\tclient.leads.list(page=1, page_size=50, search=..., status=..., tags=...)\tPaginated, filterable\nGet\tclient.leads.get(lead_id)\tReturns single Lead\nCreate\tclient.leads.create(LeadCreate(email=..., first_name=..., ...))\tDeduplicates by email\nUpdate\tclient.leads.update(lead_id, LeadUpdate(company=..., ...))\tPartial update\nDelete\tclient.leads.delete(lead_id)\tSoft-delete\nCampaigns\nAction\tMethod\tNotes\nList\tclient.campaigns.list(status=...)\tFilter by draft/active/paused/completed\nGet\tclient.campaigns.get(campaign_id)\tIncludes stats\nCreate\tclient.campaigns.create(CampaignCreate(name=..., ...))\tCreates in draft\nUpdate\tclient.campaigns.update(campaign_id, CampaignUpdate(...))\tCan't edit if active\nDelete\tclient.campaigns.delete(campaign_id)\tMust be draft\nStart\tclient.campaigns.start(campaign_id)\tTransitions to active\nPause\tclient.campaigns.pause(campaign_id)\tPauses sending\nAdd Leads\tclient.campaigns.add_leads(campaign_id, [lead_ids])\tBulk add\nAdd Accounts\tclient.campaigns.add_accounts(campaign_id, [account_ids])\tAssign senders\nSequences (nested under campaigns)\nAction\tMethod\tNotes\nList\tclient.campaigns.sequences.list(campaign_id)\tAll steps\nCreate\tclient.campaigns.sequences.create(campaign_id, SequenceCreate(body=..., ...))\tAdd step\nUpdate\tclient.campaigns.sequences.update(campaign_id, seq_id, SequenceUpdate(...))\tEdit step\nDelete\tclient.campaigns.sequences.delete(campaign_id, seq_id)\tRemove step\nTemplates\nAction\tMethod\tNotes\nList\tclient.templates.list()\tPaginated\nGet\tclient.templates.get(template_id)\tSingle template\nCreate\tclient.templates.create(TemplateCreate(name=..., body=...))\tNew template\nUpdate\tclient.templates.update(template_id, TemplateUpdate(...))\tPartial update\nDelete\tclient.templates.delete(template_id)\tRemove\nEmail Accounts\nAction\tMethod\tNotes\nList\tclient.email_accounts.list()\tPaginated\nGet\tclient.email_accounts.get(account_id)\tWith health metrics\nDelete\tclient.email_accounts.delete(account_id)\tRemove\nInbox\nAction\tMethod\tNotes\nList Threads\tclient.inbox.list_threads(category=..., is_read=..., ...)\tFilterable\nGet\tclient.inbox.get(reply_id)\tFull thread\nUpdate\tclient.inbox.update(reply_id, ThreadUpdate(is_read=..., ...))\tMark read/starred\nAnalytics\nAction\tMethod\tNotes\nOverview\tclient.analytics.overview()\tDashboard KPIs\nCampaign\tclient.analytics.campaign(campaign_id)\tMetrics + daily stats\nPagination\n\nList endpoints return PaginatedResponse objects:\n\nresult = client.leads.list(page=1, page_size=50, search=\"acme\")\n\n# Access data\nfor lead in result:\n    print(lead.email)\n\n# Check pagination info\nprint(f\"Page {result.meta.page}/{result.meta.total_pages}, {result.meta.total} total\")\n\n# Get next page\nif result.has_next_page():\n    next_result = result.next_page()\n\n# Auto-paginate through ALL results\nfor lead in client.leads.list().auto_paging_iter():\n    print(lead.email)\n\nError Handling\n\nAlways wrap API calls in try/except:\n\nfrom foxreach import FoxReach, NotFoundError, RateLimitError, AuthenticationError, FoxReachError\n\ntry:\n    lead = client.leads.get(\"cld_nonexistent\")\nexcept NotFoundError:\n    print(\"Lead not found\")\nexcept AuthenticationError:\n    print(\"Invalid API key\")\nexcept RateLimitError as e:\n    print(f\"Rate limited. Retry after {e.retry_after}s\")\nexcept FoxReachError as e:\n    print(f\"API error: {e}\")\n\nTemplate Variables & Personalization\n\nEmail bodies support variable substitution using {{variable}} syntax:\n\n{{firstName}}, {{lastName}}, {{email}}\n{{company}}, {{title}}, {{phone}}\n{{website}}, {{linkedinUrl}}\nCustom fields: {{customFieldName}}\n\nSpintax is also supported: {Hi|Hey|Hello} {{firstName}}\n\nCommon Workflows\n1. Full Campaign Setup\n\nWhen the user wants to set up a complete campaign, follow these steps in order:\n\nCreate the campaign with campaigns.create()\nAdd sequence steps with campaigns.sequences.create() for each email in the chain\nAdd leads with campaigns.add_leads()\nAssign email accounts with campaigns.add_accounts()\nStart the campaign with campaigns.start()\n2. Check Campaign Performance\nGet campaign analytics with analytics.campaign(id)\nShow sent, delivered, bounced, replied, opened stats\nShow reply rate and bounce rate\nIf daily_stats are available, summarize trends\n3. Manage Inbox\nList unread threads with inbox.list_threads(is_read=False)\nCategorize replies by updating with inbox.update(id, ThreadUpdate(category=\"interested\"))\nCommon categories: interested, not_interested, out_of_office, wrong_person, unsubscribe\n4. Bulk Lead Import\n\nFor adding multiple leads, create them one by one (the API deduplicates by email):\n\nleads_data = [\n    {\"email\": \"a@example.com\", \"first_name\": \"Alice\", \"company\": \"Acme\"},\n    {\"email\": \"b@example.com\", \"first_name\": \"Bob\", \"company\": \"Beta\"},\n]\ncreated = []\nfor data in leads_data:\n    lead = client.leads.create(LeadCreate(**data))\n    created.append(lead)\n    print(f\"Created: {lead.id} - {lead.email}\")\n\nImportant Notes\nBase URL: https://api.foxreach.io/api/v1\nRate limit: 100 requests per minute. The SDK auto-retries on 429.\nID prefixes: Leads cld_, Campaigns cmp_, Replies rpl_, Templates tpl_\nTimezone: All datetimes in UTC ISO 8601 format.\nSending days: Array of integers, 1=Monday through 7=Sunday.\nSending hours: 0-23 range, in the campaign's timezone.\nCampaign status flow: draft → active → paused → active → completed\nSoft deletes: Leads are soft-deleted and can reappear on re-import.\nAlways confirm with the user before destructive operations (delete, start campaign).\nWhen listing data, default to showing a formatted summary, not raw JSON.\nWhen creating resources, confirm the details with the user before executing."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/concaption/foxreach-io",
    "publisherUrl": "https://clawhub.ai/concaption/foxreach-io",
    "owner": "concaption",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/foxreach-io",
    "downloadUrl": "https://openagent3.xyz/downloads/foxreach-io",
    "agentUrl": "https://openagent3.xyz/skills/foxreach-io/agent",
    "manifestUrl": "https://openagent3.xyz/skills/foxreach-io/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/foxreach-io/agent.md"
  }
}