{"id":"5b981a0e-7d03-4166-ae0e-f4f1b6031d7b","entityType":"agent","slug":"clawhub-jrrqd-verosight-monitor","name":"Verosight Monitor","canonicalUrl":"https://www.xpersona.co/agent/clawhub-jrrqd-verosight-monitor","canonicalPath":"/agent/clawhub-jrrqd-verosight-monitor","generatedAt":"2026-10-10T09:08:55.010Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T06:51:12.695Z","emptyReason":null},"description":"Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection... Skill: Verosight Monitor Owner: jrrqd Summary: Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection... Tags: latest:1.1.2 Version history: v1.1.2 | 2026-07-22T16:47:53.462Z | user Added MCP server support, 14+ platforms (Reddit, Darkweb, Capital Market), 30 MCP tools v1.1.1 | 2026-07-22T16:44:57.357Z | user Added","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.6K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s1744qdetx6kce4034de07720583y5mj:verosight-monitor","sourceUrl":"https://clawhub.ai/jrrqd/verosight-monitor","homepage":"https://clawhub.ai/jrrqd/skills/verosight-monitor","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/jrrqd/verosight-monitor","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/jrrqd/skills/verosight-monitor","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":40,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T06:51:12.695Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T06:51:12.695Z","emptyReason":null},"stars":null,"forks":null,"downloads":1609,"packageName":null,"latestVersion":"1.1.2","tractionLabel":"1.6K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T06:51:12.695Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T06:51:12.695Z","lastCrawledAt":"2026-10-10T06:51:12.695Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T06:51:12.695Z","lastVerifiedAt":null,"highlights":[{"version":"1.1.2","createdAt":"2026-07-22T16:47:53.462Z","changelog":"Added MCP server support, 14+ platforms (Reddit, Darkweb, Capital Market), 30 MCP tools","fileCount":8,"zipByteSize":13791},{"version":"1.1.1","createdAt":"2026-07-22T16:44:57.357Z","changelog":"Added MCP server support, 14+ platforms (Reddit, Darkweb, Capital Market), 30 MCP tools","fileCount":8,"zipByteSize":13806},{"version":"1.1.0","createdAt":"2026-07-22T16:28:03.566Z","changelog":"Added MCP server support, 14+ platforms (Reddit, Darkweb, Play Store, App Store, Capital Market), 30 MCP tools, and Capital Market intelligence endpoint","fileCount":8,"zipByteSize":14622},{"version":"1.0.2","createdAt":"2026-03-31T04:15:50.907Z","changelog":"Fix README for ClawHub — pure Markdown, no HTML tags","fileCount":8,"zipByteSize":13736},{"version":"1.0.1","createdAt":"2026-03-31T04:11:14.100Z","changelog":"Complete English documentation: full API reference, sentiment workflow, PDF generation guide, use cases, credit system, contributing guidelines.","fileCount":7,"zipByteSize":12459},{"version":"1.0.0","createdAt":"2026-03-31T04:07:35.818Z","changelog":"Initial release: Verosight API integration for social media intelligence.","fileCount":7,"zipByteSize":8240}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1744qdetx6kce4034de07720583y5mj:verosight-monitor","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jrrqd-verosight-monitor/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jrrqd-verosight-monitor/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jrrqd-verosight-monitor/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-jrrqd-verosight-monitor/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-jrrqd-verosight-monitor/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-jrrqd-verosight-monitor/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T09:08:55.007Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jrrqd-verosight-monitor/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jrrqd-verosight-monitor/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jrrqd-verosight-monitor/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jrrqd-verosight-monitor/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T06:51:12.695Z","emptyReason":null},"readme":"Skill: Verosight Monitor\n\nOwner: jrrqd\n\nSummary: Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection...\n\nTags: latest:1.1.2\n\nVersion history:\n\nv1.1.2 | 2026-07-22T16:47:53.462Z | user\n\nAdded MCP server support, 14+ platforms (Reddit, Darkweb, Capital Market), 30 MCP tools\n\nv1.1.1 | 2026-07-22T16:44:57.357Z | user\n\nAdded MCP server support, 14+ platforms (Reddit, Darkweb, Capital Market), 30 MCP tools\n\nv1.1.0 | 2026-07-22T16:28:03.566Z | user\n\nAdded MCP server support, 14+ platforms (Reddit, Darkweb, Play Store, App Store, Capital Market), 30 MCP tools, and Capital Market intelligence endpoint\n\nv1.0.2 | 2026-03-31T04:15:50.907Z | user\n\nFix README for ClawHub — pure Markdown, no HTML tags\n\nv1.0.1 | 2026-03-31T04:11:14.100Z | user\n\nComplete English documentation: full API reference, sentiment workflow, PDF generation guide, use cases, credit system, contributing guidelines.\n\nv1.0.0 | 2026-03-31T04:07:35.818Z | user\n\nInitial release: Verosight API integration for social media intelligence.\n\nArchive index:\n\nArchive v1.1.2: 8 files, 13791 bytes\n\nFiles: _meta.json (136b), README.md (5978b), references/pdf-template.md (7691b), references/sentiment-workflow.md (4971b), scripts/quick-sentiment.sh (877b), scripts/verosight-auth.sh (666b), skill-card.md (3034b), SKILL.md (6748b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: verosight-monitor\ndescription: \"Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection across X (Twitter), Instagram, TikTok, YouTube, Threads, and news portals. Use when: user asks for sentiment analysis, social media monitoring, trend analysis, influencer tracking, bot detection, or mentions 'Verosight', 'social listening', 'cyber monitoring', 'digital reputation'. Covers auth setup, querying posts, analytics (sentiment/trending/volume), profile search, and report generation.\"\n---\n\n# Verosight Monitor — Social Media Intelligence Skill\n\nIntegrate Verosight API for real-time social media monitoring and digital reputation management across major platforms.\n\n## Quick Setup\n\n### 1. Get API Key\nSign up at [verosight.com](https://verosight.com) and generate an API key from the [API Keys dashboard](https://verosight.com/dashboard/keys). Keys start with `vlt_live_` (production) or `vlt_test_` (test).\n\n### 2. Authenticate\nExchange your API key for a JWT token (valid 24 hours):\n\n```bash\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\nOr use the bundled auth script:\n```bash\n./scripts/verosight-auth.sh vlt_live_YOUR_KEY\n```\n\n### 3. Query Data\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\"\n\n# Search posts\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,instagram&limit=10\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## API Endpoints\n\n### Posts\n```\nGET /v1/posts\n```\nSearch posts across platforms with filters.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated: `x,instagram,tiktok,youtube,threads,news_portal` |\n| `limit` | int | Results per page (default: 10, max: 50) |\n| `days` | int | Lookback period (1-90) |\n| `sentiment` | string | Filter: `positive`, `negative`, `neutral` |\n\n```\nGET /v1/posts/:id\n```\nGet a single post by ID.\n\n```\nGET /v1/posts/:id/comments\n```\nGet comments for a post.\n\n### Analytics\n```\nGET /v1/analytics/sentiment\n```\nSentiment analysis for a keyword. Returns positive/negative/neutral breakdown, weighted percentages, and sample posts.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated platforms |\n| `days` | int | Lookback period |\n| `limit` | int | Number of sample posts to return |\n\n```\nGET /v1/analytics/volume\n```\nPost/comment volume over time (daily breakdown).\n\n```\nGET /v1/analytics/trending\n```\nTrending posts and profiles for a keyword.\n\n### Profiles\n```\nGET /v1/profiles?query=ACCOUNT&source=instagram\n```\nSearch for social media profiles.\n\n```\nGET /v1/profiles/:source/:account\n```\nGet profile details (auto-crawls if missing).\n\n```\nGET /v1/profiles/:source/:account/stats\n```\nEngagement stats for a profile.\n\n### Search\n```\nPOST /v1/search\n```\nSemantic search across all content.\n\nBody:\n```json\n{\n  \"query\": \"keyword\",\n  \"sources\": [\"x\", \"instagram\"],\n  \"days\": 7\n}\n```\n\n### Account\n```\nGET /v1/account/balance\n```\nCheck credit balance (0 cost).\n\n```\nGET /v1/account/usage\n```\nUsage history and statistics (0 cost).\n\n## Response Format\n\nAll responses follow a standard envelope:\n\n```json\n{\n  \"data\": { ... },\n  \"meta\": {\n    \"request_id\": \"uuid\",\n    \"credits_used\": 2,\n    \"credits_remaining\": 998\n  },\n  \"pagination\": {\n    \"next_cursor\": \"base64...\",\n    \"has_more\": true,\n    \"total\": 38113\n  }\n}\n```\n\n## Workflows\n\n### Sentiment Analysis Report\n\n1. Authenticate → get JWT\n2. Query `/v1/analytics/sentiment` → get positive/negative/neutral breakdown\n3. Query `/v1/posts` with `sentiment=negative` → identify vocal accounts\n4. Query `/v1/analytics/volume` → trend over time\n5. Compile report: overview → trend → narratives → insights → recommendations\n\nFor detailed workflow, see [references/sentiment-workflow.md](references/sentiment-workflow.md).\n\n### Influencer Identification\n\n1. Query posts about target topic with high engagement\n2. Sort by likes, shares, views\n3. Cross-reference with sentiment (positive vs negative influencers)\n4. Profile top accounts for follower count and verification status\n\n### Bot Detection\n\n1. Query posts about target topic across platforms\n2. Look for patterns:\n   - Multiple posts from same account in short timeframe\n   - Identical or near-identical content across accounts\n   - Coordinated posting timing\n   - New accounts with abnormally high activity\n3. Flag suspicious accounts for manual review\n\n### PDF Report Generation\n\nGenerate professional reports with tables, charts, and formatted layouts using pdfkit (Node.js).\n\nSee [references/pdf-template.md](references/pdf-template.md) for complete guide.\n\n## Supported Platforms\n\n| Platform | Coverage |\n|----------|----------|\n| X (Twitter) | Posts, replies, engagement metrics |\n| Instagram | Posts, captions, engagement |\n| TikTok | Videos, descriptions |\n| YouTube | Videos, comments |\n| Threads | Posts, replies |\n| Facebook | Posts, pages |\n| LinkedIn | Posts, articles |\n| News Portals | Articles from Indonesian media |\n\n## Credit System\n\nEach successful API call (2xx response) costs credits. Failed calls (4xx/5xx) do not deduct credits.\n\n| Tier | Rate Limit | Starting Credits |\n|------|-----------|-----------------|\n| Standard | 60 req/min | 1,000 |\n| Pro | 300 req/min | 10,000 |\n| Enterprise | Custom | Custom |\n\nCheck balance:\n```bash\ncurl -s \"https://api.verosight.com/v1/account/balance\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## Known Limitations\n\n- News portal results dominate volume (~70%); social platforms contribute less\n- Semantic search returns broadly relevant results; source/date filters are limited\n- Instagram direct scraping often blocked; use Verosight API for Instagram data\n- Profile metadata (followers, account age) may not be available for all accounts\n\n## Bundled Resources\n\n| File | Purpose |\n|------|---------|\n| `references/sentiment-workflow.md` | Step-by-step sentiment analysis workflow with report template |\n| `references/pdf-template.md` | PDF generation guide with pdfkit (tables, charts, layout) |\n| `scripts/verosight-auth.sh` | Auth helper — exchange API key for JWT |\n| `scripts/quick-sentiment.sh` | Quick sentiment check from command line |\n\n## Links\n\n- [Verosight API](https://verosight.com)\n- [API Dashboard](https://verosight.com/dashboard)\n- [Documentation](https://verosight.com/docs)\n- [ClawHub](https://clawhub.com/skills/verosight-monitor)\n- [GitHub](https://github.com/jrrqd/verosight-monitor)\n\nFile v1.1.2:README.md\n\n# 🔍 Verosight Monitor\n\n**Social Media Intelligence Skill for OpenClaw Agents**\n\nReal-time sentiment analysis, trend detection, influencer tracking, and bot detection powered by [Verosight API](https://verosight.com).\n\n[![OpenClaw Skill](https://img.shields.io/badge/OpenClaw-Skill-2563EB?style=for-the-badge)](https://github.com/openclaw/openclaw)\n[![Version](https://img.shields.io/badge/Version-1.0.1-8B5CF6?style=for-the-badge)](https://clawhub.com/skills/verosight-monitor)\n[![License](https://img.shields.io/badge/License-MIT-22C55E?style=for-the-badge)](LICENSE)\n\n---\n\n## What Is This?\n\nVerosight Monitor is an OpenClaw skill that integrates the [Verosight API](https://verosight.com) for real-time social media intelligence. It enables AI agents to perform sentiment analysis, track trends, identify influencers, and detect bot activity across major social media platforms.\n\n### Supported Platforms\n\n- **X (Twitter)** — Posts, replies, engagement metrics\n- **Instagram** — Posts, captions, engagement\n- **TikTok** — Videos, descriptions, views\n- **YouTube** — Videos, comments, engagement\n- **Threads** — Posts, replies, engagement\n- **Facebook** — Posts, pages\n- **LinkedIn** — Posts, articles\n- **News Portals** — Indonesian media articles\n\n## Features\n\n- 📊 **Sentiment Analysis** — Positive/negative/neutral breakdown with engagement-weighted scoring\n- 📈 **Trend Detection** — Volume tracking over time with daily breakdowns\n- 👤 **Influencer Identification** — Find the most vocal and impactful accounts\n- 🤖 **Bot Detection** — Identify coordinated posting patterns and inauthentic behavior\n- 📄 **PDF Reports** — Professional reports with tables, charts, and formatted layouts\n- 🌐 **Multi-Platform** — Monitor across 8+ platforms simultaneously\n- ⚡ **Real-Time** — Live data from social media and news sources\n\n## Quick Start\n\n### Prerequisites\n\n- [OpenClaw](https://github.com/openclaw/openclaw) agent instance\n- Verosight API key ([sign up here](https://verosight.com))\n\n### Installation\n\n```bash\n# Via ClawHub (recommended)\nclawhub install verosight-monitor\n\n# Or clone manually\ngit clone https://github.com/jrrqd/verosight-monitor.git\ncp -r verosight-monitor ~/.openclaw/workspace/skills/\n```\n\n### Get Your API Key\n\n1. Sign up at [verosight.com](https://verosight.com)\n2. Go to [API Keys](https://verosight.com/dashboard/keys)\n3. Generate a new key (starts with `vlt_live_`)\n\n### Authenticate\n\n```bash\n# Exchange API key for JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\n### Your First Query\n\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=your_keyword&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## API Reference\n\n### Posts\n\n```bash\n# Search posts\nGET /v1/posts?query=KEYWORD&sources=x,instagram&limit=10&days=7\n\n# Get single post\nGET /v1/posts/:id\n\n# Get comments\nGET /v1/posts/:id/comments\n```\n\n### Analytics\n\n```bash\n# Sentiment analysis\nGET /v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\n\n# Volume over time\nGET /v1/analytics/volume?query=KEYWORD&days=7\n\n# Trending posts/profiles\nGET /v1/analytics/trending?query=KEYWORD&limit=10\n```\n\n### Profiles\n\n```bash\n# Search profiles\nGET /v1/profiles?query=ACCOUNT&source=instagram\n\n# Profile details\nGET /v1/profiles/:source/:account\n\n# Engagement stats\nGET /v1/profiles/:source/:account/stats\n```\n\n### Account\n\n```bash\n# Check balance (free)\nGET /v1/account/balance\n\n# Usage history (free)\nGET /v1/account/usage\n```\n\n## Use Cases\n\n- **Digital Reputation Management** — Monitor brand mentions and sentiment in real-time\n- **Crisis Detection** — Early warning for negative viral content\n- **Competitor Analysis** — Track competitor mentions and public perception\n- **Influencer Marketing** — Identify key voices and opinion leaders\n- **Political Monitoring** — Track public opinion on policies and events\n- **Bot Detection** — Identify coordinated inauthentic behavior networks\n\n## Project Structure\n\n```\nverosight-monitor/\n├── SKILL.md                              # OpenClaw skill instructions\n├── README.md                             # This file\n├── LICENSE                               # MIT License\n├── references/\n│   ├── sentiment-workflow.md             # Step-by-step sentiment analysis guide\n│   └── pdf-template.md                   # PDF report generation with pdfkit\n└── scripts/\n    ├── verosight-auth.sh                 # Auth helper (API key → JWT)\n    └── quick-sentiment.sh                # Quick sentiment check CLI\n```\n\n## Credit System\n\nEach API call costs credits based on the endpoint:\n\n- **Posts search** — 2 credits\n- **Sentiment analysis** — 5 credits\n- **Volume analytics** — 5 credits\n- **Trending** — 5 credits\n- **Profile search** — 2 credits\n- **Account balance** — 0 credits\n\nFree accounts start with **1,000 credits**. Failed requests (4xx/5xx) do not deduct credits.\n\n## Rate Limits\n\n- **Standard** — 60 requests/minute\n- **Pro** — 300 requests/minute\n- **Enterprise** — Custom\n\n## Contributing\n\nContributions are welcome!\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## License\n\nThis project is licensed under the MIT License — see the [LICENSE](LICENSE) file for details.\n\n## Links\n\n- [Verosight API](https://verosight.com) — API documentation and dashboard\n- [ClawHub](https://clawhub.com) — OpenClaw skill marketplace\n- [OpenClaw](https://github.com/openclaw/openclaw) — Open-source AI agent runtime\n- [GitHub](https://github.com/jrrqd/verosight-monitor) — Source code\n\n---\n\nBuilt with 🔍 by **Slameticon Digital Valley**\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn7f5gtk7twvcw8bvhenbr0q5x83yqth\",\n  \"slug\": \"verosight-monitor\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1784738873462\n}\n\nFile v1.1.2:references/pdf-template.md\n\n# PDF Report Generation with pdfkit\n\nGenerate professional PDF reports with tables, charts, and formatted layouts using Node.js pdfkit.\n\n## Installation\n\n```bash\nnpm install pdfkit\n```\n\n## Basic Structure\n\n```javascript\nconst PDFDocument = require('pdfkit');\nconst fs = require('fs');\n\nconst doc = new PDFDocument({ \n  size: 'A4', \n  margin: 45,\n  info: {\n    Title: 'Report Title',\n    Author: 'SDVM',\n    Subject: 'Report Subject'\n  }\n});\n\ndoc.pipe(fs.createWriteStream('report.pdf'));\n\n// Page constants\nconst PAGE_W = 595.28;   // A4 width in points\nconst MG = 45;           // Margin\nconst CW = PAGE_W - (MG * 2);  // Content width: 505\nconst PAGE_H = 841.89;   // A4 height in points\nconst BOT = PAGE_H - 55; // Bottom limit\n\n// State\nlet pg = 1;  // Page number\nlet y = 0;   // Current Y position\n```\n\n## Page Management\n\n```javascript\nfunction newPage() {\n  doc.addPage();\n  pg++;\n  y = MG;\n  // Header\n  doc.fontSize(7).fillColor('#6B7280').text('Your Brand', MG, MG - 12);\n  doc.moveTo(MG, MG + 2).lineTo(PAGE_W - MG, MG + 2)\n    .strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n  y = MG + 12;\n}\n\nfunction footer() {\n  doc.fontSize(7).fillColor('#6B7280')\n    .text(`Page ${pg}`, MG, PAGE_H - 30, { align: 'center', width: CW });\n}\n\nfunction need(h = 60) {\n  if (y + h > BOT) { footer(); newPage(); }\n}\n```\n\n## Drawing Functions\n\n### Section Title\n\n```javascript\nfunction title(text) {\n  need(45);\n  doc.fontSize(13).fillColor('#1F2937').text(text, MG, y);\n  const tw = doc.widthOfString(text);\n  doc.moveTo(MG, y + 16).lineTo(MG + tw + 8, y + 16)\n    .strokeColor('#2563EB').lineWidth(1.5).stroke();\n  y += 28;\n}\n```\n\n### Paragraph\n\n```javascript\nfunction para(text, indent = 0) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 6);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 6;\n}\n```\n\n### Bullet List\n\n```javascript\nfunction bullet(text, indent = 18) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 5);\n  doc.fillColor('#2563EB').text('●', MG, y);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 5;\n}\n```\n\n### Info Box (measures text height FIRST, then draws box)\n\n```javascript\nfunction infoBox(text, bg = '#FEF2F2', border = '#DC2626') {\n  const pad = 12;\n  const w = CW - pad * 2;\n  doc.fontSize(9);\n  \n  // Calculate height FIRST\n  const textH = doc.heightOfString(text, { width: w, lineGap: 1 });\n  const boxH = textH + pad * 2;\n  need(boxH + 10);\n  \n  // Then draw\n  doc.fillColor(bg).rect(MG, y, CW, boxH).fill();\n  doc.rect(MG, y, CW, boxH).strokeColor(border).lineWidth(1).stroke();\n  doc.fillColor('#1F2937').text(text, MG + pad, y + pad, { width: w, lineGap: 1 });\n  y += boxH + 12;\n}\n```\n\n### Data Table (auto row height calculation)\n\n```javascript\nfunction table(headers, rows, colW) {\n  const pad = 6;\n  const fs = 8;\n  const hdrH = 24;\n  \n  doc.fontSize(fs);\n  \n  // Pre-calculate all row heights\n  const rowH = rows.map(row => {\n    let maxH = 22;\n    row.forEach((cell, ci) => {\n      const h = doc.heightOfString(cell || '', { \n        width: colW[ci] - pad * 2, \n        lineGap: 1 \n      });\n      const cellH = h + pad * 2;\n      if (cellH > maxH) maxH = cellH;\n    });\n    return maxH;\n  });\n  \n  const totalH = hdrH + rowH.reduce((a, b) => a + b, 0);\n  need(totalH + 15);\n  \n  let ty = y;\n  \n  // Draw header\n  doc.fillColor('#EFF6FF').rect(MG, ty, CW, hdrH).fill();\n  doc.rect(MG, ty, CW, hdrH).strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n  let cx = MG + pad;\n  headers.forEach((h, i) => {\n    doc.fontSize(fs).fillColor('#1F2937')\n      .text(h, cx, ty + pad + 2, { width: colW[i] - pad * 2, lineBreak: false });\n    cx += colW[i];\n  });\n  ty += hdrH;\n  \n  // Draw rows\n  rows.forEach((row, ri) => {\n    const rh = rowH[ri];\n    if (ri % 2 === 0) {\n      doc.fillColor('#F9FAFB').rect(MG, ty, CW, rh).fill();\n    }\n    doc.rect(MG, ty, CW, rh).strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n    \n    let rx = MG + pad;\n    doc.fontSize(fs).fillColor('#1F2937');\n    row.forEach((cell, ci) => {\n      doc.text(cell || '', rx, ty + pad, { \n        width: colW[ci] - pad * 2,\n        lineGap: 1\n      });\n      rx += colW[ci];\n    });\n    ty += rh;\n  });\n  \n  y = ty + 10;\n}\n```\n\n### Bar Chart\n\n```javascript\nfunction barChart(items, maxVal) {\n  const barH = 24;\n  const barMaxW = 300;\n  const lblW = 60;\n  \n  need(items.length * (barH + 10) + 15);\n  \n  items.forEach(item => {\n    const bw = Math.max(0, (item.value / maxVal) * barMaxW);\n    \n    // Label\n    doc.fontSize(9).fillColor('#1F2937')\n      .text(item.label, MG, y + 6, { width: lblW });\n    \n    // Background bar\n    doc.fillColor('#F3F4F6')\n      .rect(MG + lblW, y, barMaxW, barH).fill();\n    \n    // Value bar\n    if (bw > 0) {\n      doc.fillColor(item.color || '#2563EB')\n        .rect(MG + lblW, y, bw, barH).fill();\n    }\n    \n    // Value text\n    const valText = item.value.toLocaleString();\n    doc.fontSize(9)\n      .fillColor(bw > 55 ? '#FFFFFF' : '#1F2937')\n      .text(valText, MG + lblW + 6, y + 6, { \n        width: Math.max(bw - 12, 40) \n      });\n    \n    // Percentage (optional)\n    if (item.pct) {\n      doc.fontSize(8).fillColor('#6B7280')\n        .text(item.pct, MG + lblW + barMaxW + 10, y + 7);\n    }\n    \n    y += barH + 10;\n  });\n  \n  // Reset spacing\n  y += 5;\n}\n```\n\n## Color Palette\n\n```javascript\nconst C = {\n  red: '#DC2626',       // Danger, critical alerts\n  orange: '#EA580C',    // Warnings\n  green: '#16A34A',     // Positive, success\n  blue: '#2563EB',      // Primary, links\n  gray: '#6B7280',      // Secondary text\n  dark: '#1F2937',      // Primary text\n  lightGray: '#E5E7EB', // Borders\n  lighterGray: '#F3F4F6', // Backgrounds\n  white: '#FFFFFF',\n  headerBg: '#EFF6FF',  // Table header\n  rowAlt: '#F9FAFB',    // Alternating row\n  dangerBg: '#FEF2F2'   // Alert box\n};\n```\n\n## Common Pitfalls\n\n1. **Text overlap** — Always calculate text height BEFORE drawing boxes/containers. Use `doc.heightOfString()` first, then draw the box with that height.\n\n2. **Row height in tables** — Pre-calculate ALL row heights before drawing. Use the maximum height per row across all columns.\n\n3. **Page breaks** — Always call `need()` before drawing any multi-line element (tables, charts, info boxes).\n\n4. **Line gap** — Use `lineGap: 1` option for multi-line text to prevent crowding between lines.\n\n5. **Credit/secret info** — Remove internal API details (credits, keys, tokens) from client-facing reports.\n\n6. **Column widths** — Ensure column widths sum to content width. Test with long text to verify wrapping.\n\n7. **Font sizing** — Keep body text at 9pt minimum for readability in print.\n\n## Complete Example\n\n```javascript\nconst PDFDocument = require('pdfkit');\nconst fs = require('fs');\n\nconst doc = new PDFDocument({ size: 'A4', margin: 45 });\ndoc.pipe(fs.createWriteStream('output.pdf'));\n\nconst MG = 45, CW = 505, BOT = 786;\nlet pg = 1, y = MG;\n\n// ... include all helper functions above ...\n\n// Page 1\ntitle('Executive Summary');\ninfoBox('Status: CRITICAL — 60% negative sentiment detected across platforms.');\n\ntitle('Key Metrics');\ntable(\n  ['Metric', 'Value', 'Change', 'Status'],\n  [\n    ['Total Posts', '8,251', '+33%', 'High'],\n    ['Negative', '3,300', '+45%', 'Critical'],\n    ['Positive', '0', '-100%', 'None'],\n  ],\n  [120, 80, 80, 225]\n);\n\ntitle('Volume Trend');\nbarChart([\n  { label: 'Day 1', value: 3490, color: '#3B82F6', pct: '33%' },\n  { label: 'Day 2', value: 4646, color: '#EF4444', pct: '44%' },\n  { label: 'Day 3', value: 115, color: '#9CA3AF', pct: '1%' },\n], 4600);\n\nfooter();\ndoc.end();\n```\n\nFile v1.1.2:references/sentiment-workflow.md\n\n# Sentiment Analysis Workflow\n\nComplete workflow for conducting sentiment analysis using the Verosight API.\n\n## Step 1: Authentication\n\n```bash\n# Set your API key\nexport VEROSIGHT_API_KEY=\"vlt_live_YOUR_KEY\"\n\n# Get JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: $VEROSIGHT_API_KEY\" | jq -r '.token')\n\n# Verify token works\ncurl -s \"https://api.verosight.com/v1/account/balance\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## Step 2: Get Sentiment Data\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram,tiktok&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n### Response Fields\n\n| Field | Description |\n|-------|-------------|\n| `positive` / `negative` / `neutral` | Post counts by sentiment |\n| `positive_pct` / `negative_pct` / `neutral_pct` | Percentage breakdown |\n| `weighted_positive_pct` / `weighted_negative_pct` | Engagement-weighted percentages |\n| `sample_positive` / `sample_negative` | Sample posts with engagement data |\n| `sample_independent_negative` | Social media comments with negative sentiment |\n| `post_positive` / `post_negative` / `post_neutral` | Post-level sentiment counts |\n| `thread_positive` / `thread_negative` | Thread-level sentiment counts |\n| `independent_positive` / `independent_negative` | Independent comment sentiment |\n\n## Step 3: Get Volume Trend\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/volume?query=KEYWORD&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\nReturns daily breakdown of posts and comments by platform.\n\n## Step 4: Get High-Engagement Posts\n\n```bash\n# Negative posts from X\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x&sentiment=negative&limit=15&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n\n# All posts from specific platforms\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,threads&limit=20&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## Step 5: Compile Report\n\nUse the following structure for your report:\n\n### Report Template\n\n```markdown\n# 🔍 SDV REPORT\n## Keyword: \"[KEYWORD]\"\n**Period:** [START] – [END] | **Sources:** [PLATFORMS]\n\n---\n\n## 📊 SENTIMENT OVERVIEW\n\n| Sentiment | Count | % | Weighted |\n|-----------|-------|---|----------|\n| Positive  | X     | X%| X%       |\n| Negative  | X     | X%| X%       |\n| Neutral   | X     | X%| X%       |\n\n**Status:** [CRITICAL / HIGH / MEDIUM / LOW]\n\n## 📈 VOLUME TREND\n\n| Date | Posts | Change |\n|------|-------|--------|\n| Day 1| X     | -      |\n| Day 2| X     | +X%    |\n\n## 🔴 TOP NEGATIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes, X shares)\n   - Full quote or summary\n\n2. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 🟢 TOP POSITIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 👤 VOCAL ACCOUNTS (Negative)\n\n| Account | Platform | Engagement | Narrative |\n|---------|----------|------------|-----------|\n| @user1  | X        | 500 likes  | Topic A   |\n| @user2  | Threads  | 200 likes  | Topic B   |\n\n## 📡 PLATFORM BREAKDOWN\n\n| Platform | Volume | % | Engagement | Dominant Sentiment |\n|----------|--------|---|------------|-------------------|\n| News Portal | X | X% | Low | Factual |\n| X (Twitter) | X | X% | Medium | Opinion/criticism |\n| Threads     | X | X% | HIGH | Emotional/viral |\n\n## 💡 INSIGHTS\n\n1. [Key finding about sentiment trend]\n2. [Key finding about narrative shift]\n3. [Key finding about platform dynamics]\n\n## ⚠️ PREDICTIONS (48h)\n\n| Risk | Probability | Impact | Trigger | Timeline |\n|------|-------------|--------|---------|----------|\n| Volume spike | High | High | Event X | 0-24h |\n| Narrative shift | Medium | Medium | Statement Y | 24-48h |\n\n## 📋 RECOMMENDATIONS\n\n### Immediate (0–24h)\n- Action 1\n- Action 2\n\n### Short-term (1–7 days)\n- Action 3\n- Action 4\n\n### Medium-term (1–4 weeks)\n- Action 5\n- Action 6\n```\n\n## Interpreting Results\n\n### Sentiment Status Levels\n\n| Status | Negative % | Weighted Neg | Action |\n|--------|-----------|--------------|--------|\n| CRITICAL | >50% | >60% | Immediate crisis response |\n| HIGH | 30-50% | 40-60% | Active monitoring + counter-narrative |\n| MEDIUM | 15-30% | 20-40% | Regular monitoring |\n| LOW | <15% | <20% | Passive monitoring |\n\n### Bot Detection Indicators\n\n- Same account posting multiple times about one topic\n- Identical content across different accounts\n- New accounts with abnormally high posting frequency\n- Coordinated timing (posts within minutes of each other)\n- Low follower count with high post count\n\n### Engagement Benchmarks (Indonesian social media)\n\n| Metric | Low | Medium | High | Viral |\n|--------|-----|--------|------|-------|\n| Likes (X) | <10 | 10-100 | 100-1K | >1K |\n| Likes (Threads) | <5 | 5-50 | 50-500 | >500 |\n| Views (X) | <1K | 1K-10K | 10K-100K | >100K |\n| Shares | <5 | 5-50 | 50-500 | >500 |\n\nFile v1.1.2:skill-card.md\n\n## Description:\n\nIntegrate Verosight API for social media intelligence and cyber monitoring across social, news, and web sources, including sentiment analysis, trend detection, influencer identification, bot detection, authentication setup, API querying, and report generation.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[jrrqd](https://clawhub.ai/user/jrrqd)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and analysts use this skill to connect agents to the Verosight API for social listening, digital reputation monitoring, sentiment analysis, trend tracking, influencer review, bot-pattern review, and report drafting.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: API keys and JWTs are used to authenticate with a third-party service and could be exposed if pasted into commands, logs, or reports.\n\nMitigation: Use test or least-privilege credentials where possible, prefer environment variables, and avoid placing production keys or JWTs directly in shared commands or generated deliverables.\n\nRisk: Monitoring queries and returned content are sent to or retrieved from a third-party service and may involve confidential or regulated targets.\n\nMitigation: Submit only authorized monitoring targets and avoid confidential or regulated data unless the deployment has the required approvals and data-handling controls.\n\nRisk: Generated client-facing reports may accidentally include internal API details, credits, keys, tokens, or raw sensitive findings.\n\nMitigation: Review and redact reports before distribution, especially sections derived from API metadata, account usage, or raw monitoring results.\n\nRisk: Optional PDF report generation depends on pdfkit and local Node.js packaging.\n\nMitigation: Pin or isolate the optional pdfkit dependency and scan generated report code before using it in production workflows.\n\n## Reference(s):\n\n- [Verosight API](https://verosight.com)\n- [Verosight Documentation](https://verosight.com/docs)\n- [Verosight API Dashboard](https://verosight.com/dashboard)\n- [Sentiment Analysis Workflow](references/sentiment-workflow.md)\n- [PDF Report Generation with pdfkit](references/pdf-template.md)\n- [ClawHub Skill Page](https://clawhub.ai/jrrqd/skills/verosight-monitor)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell commands, JSON API examples, and report templates]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May produce Verosight API request examples, response interpretation guidance, and optional PDF report-generation code.]\n\n## Skill Version(s):\n\n1.1.2 (source: server release metadata and artifact _meta.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.1: 8 files, 13806 bytes\n\nFiles: _meta.json (136b), README.md (5978b), references/pdf-template.md (7691b), references/sentiment-workflow.md (4971b), scripts/quick-sentiment.sh (877b), scripts/verosight-auth.sh (666b), skill-card.md (3068b), SKILL.md (6748b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: verosight-monitor\ndescription: \"Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection across X (Twitter), Instagram, TikTok, YouTube, Threads, and news portals. Use when: user asks for sentiment analysis, social media monitoring, trend analysis, influencer tracking, bot detection, or mentions 'Verosight', 'social listening', 'cyber monitoring', 'digital reputation'. Covers auth setup, querying posts, analytics (sentiment/trending/volume), profile search, and report generation.\"\n---\n\n# Verosight Monitor — Social Media Intelligence Skill\n\nIntegrate Verosight API for real-time social media monitoring and digital reputation management across major platforms.\n\n## Quick Setup\n\n### 1. Get API Key\nSign up at [verosight.com](https://verosight.com) and generate an API key from the [API Keys dashboard](https://verosight.com/dashboard/keys). Keys start with `vlt_live_` (production) or `vlt_test_` (test).\n\n### 2. Authenticate\nExchange your API key for a JWT token (valid 24 hours):\n\n```bash\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\nOr use the bundled auth script:\n```bash\n./scripts/verosight-auth.sh vlt_live_YOUR_KEY\n```\n\n### 3. Query Data\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\"\n\n# Search posts\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,instagram&limit=10\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## API Endpoints\n\n### Posts\n```\nGET /v1/posts\n```\nSearch posts across platforms with filters.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated: `x,instagram,tiktok,youtube,threads,news_portal` |\n| `limit` | int | Results per page (default: 10, max: 50) |\n| `days` | int | Lookback period (1-90) |\n| `sentiment` | string | Filter: `positive`, `negative`, `neutral` |\n\n```\nGET /v1/posts/:id\n```\nGet a single post by ID.\n\n```\nGET /v1/posts/:id/comments\n```\nGet comments for a post.\n\n### Analytics\n```\nGET /v1/analytics/sentiment\n```\nSentiment analysis for a keyword. Returns positive/negative/neutral breakdown, weighted percentages, and sample posts.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated platforms |\n| `days` | int | Lookback period |\n| `limit` | int | Number of sample posts to return |\n\n```\nGET /v1/analytics/volume\n```\nPost/comment volume over time (daily breakdown).\n\n```\nGET /v1/analytics/trending\n```\nTrending posts and profiles for a keyword.\n\n### Profiles\n```\nGET /v1/profiles?query=ACCOUNT&source=instagram\n```\nSearch for social media profiles.\n\n```\nGET /v1/profiles/:source/:account\n```\nGet profile details (auto-crawls if missing).\n\n```\nGET /v1/profiles/:source/:account/stats\n```\nEngagement stats for a profile.\n\n### Search\n```\nPOST /v1/search\n```\nSemantic search across all content.\n\nBody:\n```json\n{\n  \"query\": \"keyword\",\n  \"sources\": [\"x\", \"instagram\"],\n  \"days\": 7\n}\n```\n\n### Account\n```\nGET /v1/account/balance\n```\nCheck credit balance (0 cost).\n\n```\nGET /v1/account/usage\n```\nUsage history and statistics (0 cost).\n\n## Response Format\n\nAll responses follow a standard envelope:\n\n```json\n{\n  \"data\": { ... },\n  \"meta\": {\n    \"request_id\": \"uuid\",\n    \"credits_used\": 2,\n    \"credits_remaining\": 998\n  },\n  \"pagination\": {\n    \"next_cursor\": \"base64...\",\n    \"has_more\": true,\n    \"total\": 38113\n  }\n}\n```\n\n## Workflows\n\n### Sentiment Analysis Report\n\n1. Authenticate → get JWT\n2. Query `/v1/analytics/sentiment` → get positive/negative/neutral breakdown\n3. Query `/v1/posts` with `sentiment=negative` → identify vocal accounts\n4. Query `/v1/analytics/volume` → trend over time\n5. Compile report: overview → trend → narratives → insights → recommendations\n\nFor detailed workflow, see [references/sentiment-workflow.md](references/sentiment-workflow.md).\n\n### Influencer Identification\n\n1. Query posts about target topic with high engagement\n2. Sort by likes, shares, views\n3. Cross-reference with sentiment (positive vs negative influencers)\n4. Profile top accounts for follower count and verification status\n\n### Bot Detection\n\n1. Query posts about target topic across platforms\n2. Look for patterns:\n   - Multiple posts from same account in short timeframe\n   - Identical or near-identical content across accounts\n   - Coordinated posting timing\n   - New accounts with abnormally high activity\n3. Flag suspicious accounts for manual review\n\n### PDF Report Generation\n\nGenerate professional reports with tables, charts, and formatted layouts using pdfkit (Node.js).\n\nSee [references/pdf-template.md](references/pdf-template.md) for complete guide.\n\n## Supported Platforms\n\n| Platform | Coverage |\n|----------|----------|\n| X (Twitter) | Posts, replies, engagement metrics |\n| Instagram | Posts, captions, engagement |\n| TikTok | Videos, descriptions |\n| YouTube | Videos, comments |\n| Threads | Posts, replies |\n| Facebook | Posts, pages |\n| LinkedIn | Posts, articles |\n| News Portals | Articles from Indonesian media |\n\n## Credit System\n\nEach successful API call (2xx response) costs credits. Failed calls (4xx/5xx) do not deduct credits.\n\n| Tier | Rate Limit | Starting Credits |\n|------|-----------|-----------------|\n| Standard | 60 req/min | 1,000 |\n| Pro | 300 req/min | 10,000 |\n| Enterprise | Custom | Custom |\n\nCheck balance:\n```bash\ncurl -s \"https://api.verosight.com/v1/account/balance\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## Known Limitations\n\n- News portal results dominate volume (~70%); social platforms contribute less\n- Semantic search returns broadly relevant results; source/date filters are limited\n- Instagram direct scraping often blocked; use Verosight API for Instagram data\n- Profile metadata (followers, account age) may not be available for all accounts\n\n## Bundled Resources\n\n| File | Purpose |\n|------|---------|\n| `references/sentiment-workflow.md` | Step-by-step sentiment analysis workflow with report template |\n| `references/pdf-template.md` | PDF generation guide with pdfkit (tables, charts, layout) |\n| `scripts/verosight-auth.sh` | Auth helper — exchange API key for JWT |\n| `scripts/quick-sentiment.sh` | Quick sentiment check from command line |\n\n## Links\n\n- [Verosight API](https://verosight.com)\n- [API Dashboard](https://verosight.com/dashboard)\n- [Documentation](https://verosight.com/docs)\n- [ClawHub](https://clawhub.com/skills/verosight-monitor)\n- [GitHub](https://github.com/jrrqd/verosight-monitor)\n\nFile v1.1.1:README.md\n\n# 🔍 Verosight Monitor\n\n**Social Media Intelligence Skill for OpenClaw Agents**\n\nReal-time sentiment analysis, trend detection, influencer tracking, and bot detection powered by [Verosight API](https://verosight.com).\n\n[![OpenClaw Skill](https://img.shields.io/badge/OpenClaw-Skill-2563EB?style=for-the-badge)](https://github.com/openclaw/openclaw)\n[![Version](https://img.shields.io/badge/Version-1.0.1-8B5CF6?style=for-the-badge)](https://clawhub.com/skills/verosight-monitor)\n[![License](https://img.shields.io/badge/License-MIT-22C55E?style=for-the-badge)](LICENSE)\n\n---\n\n## What Is This?\n\nVerosight Monitor is an OpenClaw skill that integrates the [Verosight API](https://verosight.com) for real-time social media intelligence. It enables AI agents to perform sentiment analysis, track trends, identify influencers, and detect bot activity across major social media platforms.\n\n### Supported Platforms\n\n- **X (Twitter)** — Posts, replies, engagement metrics\n- **Instagram** — Posts, captions, engagement\n- **TikTok** — Videos, descriptions, views\n- **YouTube** — Videos, comments, engagement\n- **Threads** — Posts, replies, engagement\n- **Facebook** — Posts, pages\n- **LinkedIn** — Posts, articles\n- **News Portals** — Indonesian media articles\n\n## Features\n\n- 📊 **Sentiment Analysis** — Positive/negative/neutral breakdown with engagement-weighted scoring\n- 📈 **Trend Detection** — Volume tracking over time with daily breakdowns\n- 👤 **Influencer Identification** — Find the most vocal and impactful accounts\n- 🤖 **Bot Detection** — Identify coordinated posting patterns and inauthentic behavior\n- 📄 **PDF Reports** — Professional reports with tables, charts, and formatted layouts\n- 🌐 **Multi-Platform** — Monitor across 8+ platforms simultaneously\n- ⚡ **Real-Time** — Live data from social media and news sources\n\n## Quick Start\n\n### Prerequisites\n\n- [OpenClaw](https://github.com/openclaw/openclaw) agent instance\n- Verosight API key ([sign up here](https://verosight.com))\n\n### Installation\n\n```bash\n# Via ClawHub (recommended)\nclawhub install verosight-monitor\n\n# Or clone manually\ngit clone https://github.com/jrrqd/verosight-monitor.git\ncp -r verosight-monitor ~/.openclaw/workspace/skills/\n```\n\n### Get Your API Key\n\n1. Sign up at [verosight.com](https://verosight.com)\n2. Go to [API Keys](https://verosight.com/dashboard/keys)\n3. Generate a new key (starts with `vlt_live_`)\n\n### Authenticate\n\n```bash\n# Exchange API key for JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\n### Your First Query\n\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=your_keyword&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## API Reference\n\n### Posts\n\n```bash\n# Search posts\nGET /v1/posts?query=KEYWORD&sources=x,instagram&limit=10&days=7\n\n# Get single post\nGET /v1/posts/:id\n\n# Get comments\nGET /v1/posts/:id/comments\n```\n\n### Analytics\n\n```bash\n# Sentiment analysis\nGET /v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\n\n# Volume over time\nGET /v1/analytics/volume?query=KEYWORD&days=7\n\n# Trending posts/profiles\nGET /v1/analytics/trending?query=KEYWORD&limit=10\n```\n\n### Profiles\n\n```bash\n# Search profiles\nGET /v1/profiles?query=ACCOUNT&source=instagram\n\n# Profile details\nGET /v1/profiles/:source/:account\n\n# Engagement stats\nGET /v1/profiles/:source/:account/stats\n```\n\n### Account\n\n```bash\n# Check balance (free)\nGET /v1/account/balance\n\n# Usage history (free)\nGET /v1/account/usage\n```\n\n## Use Cases\n\n- **Digital Reputation Management** — Monitor brand mentions and sentiment in real-time\n- **Crisis Detection** — Early warning for negative viral content\n- **Competitor Analysis** — Track competitor mentions and public perception\n- **Influencer Marketing** — Identify key voices and opinion leaders\n- **Political Monitoring** — Track public opinion on policies and events\n- **Bot Detection** — Identify coordinated inauthentic behavior networks\n\n## Project Structure\n\n```\nverosight-monitor/\n├── SKILL.md                              # OpenClaw skill instructions\n├── README.md                             # This file\n├── LICENSE                               # MIT License\n├── references/\n│   ├── sentiment-workflow.md             # Step-by-step sentiment analysis guide\n│   └── pdf-template.md                   # PDF report generation with pdfkit\n└── scripts/\n    ├── verosight-auth.sh                 # Auth helper (API key → JWT)\n    └── quick-sentiment.sh                # Quick sentiment check CLI\n```\n\n## Credit System\n\nEach API call costs credits based on the endpoint:\n\n- **Posts search** — 2 credits\n- **Sentiment analysis** — 5 credits\n- **Volume analytics** — 5 credits\n- **Trending** — 5 credits\n- **Profile search** — 2 credits\n- **Account balance** — 0 credits\n\nFree accounts start with **1,000 credits**. Failed requests (4xx/5xx) do not deduct credits.\n\n## Rate Limits\n\n- **Standard** — 60 requests/minute\n- **Pro** — 300 requests/minute\n- **Enterprise** — Custom\n\n## Contributing\n\nContributions are welcome!\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## License\n\nThis project is licensed under the MIT License — see the [LICENSE](LICENSE) file for details.\n\n## Links\n\n- [Verosight API](https://verosight.com) — API documentation and dashboard\n- [ClawHub](https://clawhub.com) — OpenClaw skill marketplace\n- [OpenClaw](https://github.com/openclaw/openclaw) — Open-source AI agent runtime\n- [GitHub](https://github.com/jrrqd/verosight-monitor) — Source code\n\n---\n\nBuilt with 🔍 by **Slameticon Digital Valley**\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn7f5gtk7twvcw8bvhenbr0q5x83yqth\",\n  \"slug\": \"verosight-monitor\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1784738697357\n}\n\nFile v1.1.1:references/pdf-template.md\n\n# PDF Report Generation with pdfkit\n\nGenerate professional PDF reports with tables, charts, and formatted layouts using Node.js pdfkit.\n\n## Installation\n\n```bash\nnpm install pdfkit\n```\n\n## Basic Structure\n\n```javascript\nconst PDFDocument = require('pdfkit');\nconst fs = require('fs');\n\nconst doc = new PDFDocument({ \n  size: 'A4', \n  margin: 45,\n  info: {\n    Title: 'Report Title',\n    Author: 'SDVM',\n    Subject: 'Report Subject'\n  }\n});\n\ndoc.pipe(fs.createWriteStream('report.pdf'));\n\n// Page constants\nconst PAGE_W = 595.28;   // A4 width in points\nconst MG = 45;           // Margin\nconst CW = PAGE_W - (MG * 2);  // Content width: 505\nconst PAGE_H = 841.89;   // A4 height in points\nconst BOT = PAGE_H - 55; // Bottom limit\n\n// State\nlet pg = 1;  // Page number\nlet y = 0;   // Current Y position\n```\n\n## Page Management\n\n```javascript\nfunction newPage() {\n  doc.addPage();\n  pg++;\n  y = MG;\n  // Header\n  doc.fontSize(7).fillColor('#6B7280').text('Your Brand', MG, MG - 12);\n  doc.moveTo(MG, MG + 2).lineTo(PAGE_W - MG, MG + 2)\n    .strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n  y = MG + 12;\n}\n\nfunction footer() {\n  doc.fontSize(7).fillColor('#6B7280')\n    .text(`Page ${pg}`, MG, PAGE_H - 30, { align: 'center', width: CW });\n}\n\nfunction need(h = 60) {\n  if (y + h > BOT) { footer(); newPage(); }\n}\n```\n\n## Drawing Functions\n\n### Section Title\n\n```javascript\nfunction title(text) {\n  need(45);\n  doc.fontSize(13).fillColor('#1F2937').text(text, MG, y);\n  const tw = doc.widthOfString(text);\n  doc.moveTo(MG, y + 16).lineTo(MG + tw + 8, y + 16)\n    .strokeColor('#2563EB').lineWidth(1.5).stroke();\n  y += 28;\n}\n```\n\n### Paragraph\n\n```javascript\nfunction para(text, indent = 0) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 6);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 6;\n}\n```\n\n### Bullet List\n\n```javascript\nfunction bullet(text, indent = 18) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 5);\n  doc.fillColor('#2563EB').text('●', MG, y);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 5;\n}\n```\n\n### Info Box (measures text height FIRST, then draws box)\n\n```javascript\nfunction infoBox(text, bg = '#FEF2F2', border = '#DC2626') {\n  const pad = 12;\n  const w = CW - pad * 2;\n  doc.fontSize(9);\n  \n  // Calculate height FIRST\n  const textH = doc.heightOfString(text, { width: w, lineGap: 1 });\n  const boxH = textH + pad * 2;\n  need(boxH + 10);\n  \n  // Then draw\n  doc.fillColor(bg).rect(MG, y, CW, boxH).fill();\n  doc.rect(MG, y, CW, boxH).strokeColor(border).lineWidth(1).stroke();\n  doc.fillColor('#1F2937').text(text, MG + pad, y + pad, { width: w, lineGap: 1 });\n  y += boxH + 12;\n}\n```\n\n### Data Table (auto row height calculation)\n\n```javascript\nfunction table(headers, rows, colW) {\n  const pad = 6;\n  const fs = 8;\n  const hdrH = 24;\n  \n  doc.fontSize(fs);\n  \n  // Pre-calculate all row heights\n  const rowH = rows.map(row => {\n    let maxH = 22;\n    row.forEach((cell, ci) => {\n      const h = doc.heightOfString(cell || '', { \n        width: colW[ci] - pad * 2, \n        lineGap: 1 \n      });\n      const cellH = h + pad * 2;\n      if (cellH > maxH) maxH = cellH;\n    });\n    return maxH;\n  });\n  \n  const totalH = hdrH + rowH.reduce((a, b) => a + b, 0);\n  need(totalH + 15);\n  \n  let ty = y;\n  \n  // Draw header\n  doc.fillColor('#EFF6FF').rect(MG, ty, CW, hdrH).fill();\n  doc.rect(MG, ty, CW, hdrH).strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n  let cx = MG + pad;\n  headers.forEach((h, i) => {\n    doc.fontSize(fs).fillColor('#1F2937')\n      .text(h, cx, ty + pad + 2, { width: colW[i] - pad * 2, lineBreak: false });\n    cx += colW[i];\n  });\n  ty += hdrH;\n  \n  // Draw rows\n  rows.forEach((row, ri) => {\n    const rh = rowH[ri];\n    if (ri % 2 === 0) {\n      doc.fillColor('#F9FAFB').rect(MG, ty, CW, rh).fill();\n    }\n    doc.rect(MG, ty, CW, rh).strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n    \n    let rx = MG + pad;\n    doc.fontSize(fs).fillColor('#1F2937');\n    row.forEach((cell, ci) => {\n      doc.text(cell || '', rx, ty + pad, { \n        width: colW[ci] - pad * 2,\n        lineGap: 1\n      });\n      rx += colW[ci];\n    });\n    ty += rh;\n  });\n  \n  y = ty + 10;\n}\n```\n\n### Bar Chart\n\n```javascript\nfunction barChart(items, maxVal) {\n  const barH = 24;\n  const barMaxW = 300;\n  const lblW = 60;\n  \n  need(items.length * (barH + 10) + 15);\n  \n  items.forEach(item => {\n    const bw = Math.max(0, (item.value / maxVal) * barMaxW);\n    \n    // Label\n    doc.fontSize(9).fillColor('#1F2937')\n      .text(item.label, MG, y + 6, { width: lblW });\n    \n    // Background bar\n    doc.fillColor('#F3F4F6')\n      .rect(MG + lblW, y, barMaxW, barH).fill();\n    \n    // Value bar\n    if (bw > 0) {\n      doc.fillColor(item.color || '#2563EB')\n        .rect(MG + lblW, y, bw, barH).fill();\n    }\n    \n    // Value text\n    const valText = item.value.toLocaleString();\n    doc.fontSize(9)\n      .fillColor(bw > 55 ? '#FFFFFF' : '#1F2937')\n      .text(valText, MG + lblW + 6, y + 6, { \n        width: Math.max(bw - 12, 40) \n      });\n    \n    // Percentage (optional)\n    if (item.pct) {\n      doc.fontSize(8).fillColor('#6B7280')\n        .text(item.pct, MG + lblW + barMaxW + 10, y + 7);\n    }\n    \n    y += barH + 10;\n  });\n  \n  // Reset spacing\n  y += 5;\n}\n```\n\n## Color Palette\n\n```javascript\nconst C = {\n  red: '#DC2626',       // Danger, critical alerts\n  orange: '#EA580C',    // Warnings\n  green: '#16A34A',     // Positive, success\n  blue: '#2563EB',      // Primary, links\n  gray: '#6B7280',      // Secondary text\n  dark: '#1F2937',      // Primary text\n  lightGray: '#E5E7EB', // Borders\n  lighterGray: '#F3F4F6', // Backgrounds\n  white: '#FFFFFF',\n  headerBg: '#EFF6FF',  // Table header\n  rowAlt: '#F9FAFB',    // Alternating row\n  dangerBg: '#FEF2F2'   // Alert box\n};\n```\n\n## Common Pitfalls\n\n1. **Text overlap** — Always calculate text height BEFORE drawing boxes/containers. Use `doc.heightOfString()` first, then draw the box with that height.\n\n2. **Row height in tables** — Pre-calculate ALL row heights before drawing. Use the maximum height per row across all columns.\n\n3. **Page breaks** — Always call `need()` before drawing any multi-line element (tables, charts, info boxes).\n\n4. **Line gap** — Use `lineGap: 1` option for multi-line text to prevent crowding between lines.\n\n5. **Credit/secret info** — Remove internal API details (credits, keys, tokens) from client-facing reports.\n\n6. **Column widths** — Ensure column widths sum to content width. Test with long text to verify wrapping.\n\n7. **Font sizing** — Keep body text at 9pt minimum for readability in print.\n\n## Complete Example\n\n```javascript\nconst PDFDocument = require('pdfkit');\nconst fs = require('fs');\n\nconst doc = new PDFDocument({ size: 'A4', margin: 45 });\ndoc.pipe(fs.createWriteStream('output.pdf'));\n\nconst MG = 45, CW = 505, BOT = 786;\nlet pg = 1, y = MG;\n\n// ... include all helper functions above ...\n\n// Page 1\ntitle('Executive Summary');\ninfoBox('Status: CRITICAL — 60% negative sentiment detected across platforms.');\n\ntitle('Key Metrics');\ntable(\n  ['Metric', 'Value', 'Change', 'Status'],\n  [\n    ['Total Posts', '8,251', '+33%', 'High'],\n    ['Negative', '3,300', '+45%', 'Critical'],\n    ['Positive', '0', '-100%', 'None'],\n  ],\n  [120, 80, 80, 225]\n);\n\ntitle('Volume Trend');\nbarChart([\n  { label: 'Day 1', value: 3490, color: '#3B82F6', pct: '33%' },\n  { label: 'Day 2', value: 4646, color: '#EF4444', pct: '44%' },\n  { label: 'Day 3', value: 115, color: '#9CA3AF', pct: '1%' },\n], 4600);\n\nfooter();\ndoc.end();\n```\n\nFile v1.1.1:references/sentiment-workflow.md\n\n# Sentiment Analysis Workflow\n\nComplete workflow for conducting sentiment analysis using the Verosight API.\n\n## Step 1: Authentication\n\n```bash\n# Set your API key\nexport VEROSIGHT_API_KEY=\"vlt_live_YOUR_KEY\"\n\n# Get JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: $VEROSIGHT_API_KEY\" | jq -r '.token')\n\n# Verify token works\ncurl -s \"https://api.verosight.com/v1/account/balance\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## Step 2: Get Sentiment Data\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram,tiktok&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n### Response Fields\n\n| Field | Description |\n|-------|-------------|\n| `positive` / `negative` / `neutral` | Post counts by sentiment |\n| `positive_pct` / `negative_pct` / `neutral_pct` | Percentage breakdown |\n| `weighted_positive_pct` / `weighted_negative_pct` | Engagement-weighted percentages |\n| `sample_positive` / `sample_negative` | Sample posts with engagement data |\n| `sample_independent_negative` | Social media comments with negative sentiment |\n| `post_positive` / `post_negative` / `post_neutral` | Post-level sentiment counts |\n| `thread_positive` / `thread_negative` | Thread-level sentiment counts |\n| `independent_positive` / `independent_negative` | Independent comment sentiment |\n\n## Step 3: Get Volume Trend\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/volume?query=KEYWORD&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\nReturns daily breakdown of posts and comments by platform.\n\n## Step 4: Get High-Engagement Posts\n\n```bash\n# Negative posts from X\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x&sentiment=negative&limit=15&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n\n# All posts from specific platforms\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,threads&limit=20&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## Step 5: Compile Report\n\nUse the following structure for your report:\n\n### Report Template\n\n```markdown\n# 🔍 SDV REPORT\n## Keyword: \"[KEYWORD]\"\n**Period:** [START] – [END] | **Sources:** [PLATFORMS]\n\n---\n\n## 📊 SENTIMENT OVERVIEW\n\n| Sentiment | Count | % | Weighted |\n|-----------|-------|---|----------|\n| Positive  | X     | X%| X%       |\n| Negative  | X     | X%| X%       |\n| Neutral   | X     | X%| X%       |\n\n**Status:** [CRITICAL / HIGH / MEDIUM / LOW]\n\n## 📈 VOLUME TREND\n\n| Date | Posts | Change |\n|------|-------|--------|\n| Day 1| X     | -      |\n| Day 2| X     | +X%    |\n\n## 🔴 TOP NEGATIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes, X shares)\n   - Full quote or summary\n\n2. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 🟢 TOP POSITIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 👤 VOCAL ACCOUNTS (Negative)\n\n| Account | Platform | Engagement | Narrative |\n|---------|----------|------------|-----------|\n| @user1  | X        | 500 likes  | Topic A   |\n| @user2  | Threads  | 200 likes  | Topic B   |\n\n## 📡 PLATFORM BREAKDOWN\n\n| Platform | Volume | % | Engagement | Dominant Sentiment |\n|----------|--------|---|------------|-------------------|\n| News Portal | X | X% | Low | Factual |\n| X (Twitter) | X | X% | Medium | Opinion/criticism |\n| Threads     | X | X% | HIGH | Emotional/viral |\n\n## 💡 INSIGHTS\n\n1. [Key finding about sentiment trend]\n2. [Key finding about narrative shift]\n3. [Key finding about platform dynamics]\n\n## ⚠️ PREDICTIONS (48h)\n\n| Risk | Probability | Impact | Trigger | Timeline |\n|------|-------------|--------|---------|----------|\n| Volume spike | High | High | Event X | 0-24h |\n| Narrative shift | Medium | Medium | Statement Y | 24-48h |\n\n## 📋 RECOMMENDATIONS\n\n### Immediate (0–24h)\n- Action 1\n- Action 2\n\n### Short-term (1–7 days)\n- Action 3\n- Action 4\n\n### Medium-term (1–4 weeks)\n- Action 5\n- Action 6\n```\n\n## Interpreting Results\n\n### Sentiment Status Levels\n\n| Status | Negative % | Weighted Neg | Action |\n|--------|-----------|--------------|--------|\n| CRITICAL | >50% | >60% | Immediate crisis response |\n| HIGH | 30-50% | 40-60% | Active monitoring + counter-narrative |\n| MEDIUM | 15-30% | 20-40% | Regular monitoring |\n| LOW | <15% | <20% | Passive monitoring |\n\n### Bot Detection Indicators\n\n- Same account posting multiple times about one topic\n- Identical content across different accounts\n- New accounts with abnormally high posting frequency\n- Coordinated timing (posts within minutes of each other)\n- Low follower count with high post count\n\n### Engagement Benchmarks (Indonesian social media)\n\n| Metric | Low | Medium | High | Viral |\n|--------|-----|--------|------|-------|\n| Likes (X) | <10 | 10-100 | 100-1K | >1K |\n| Likes (Threads) | <5 | 5-50 | 50-500 | >500 |\n| Views (X) | <1K | 1K-10K | 10K-100K | >100K |\n| Shares | <5 | 5-50 | 50-500 | >500 |\n\nFile v1.1.1:skill-card.md\n\n## Description: <br>\nVerosight Monitor helps OpenClaw agents use the Verosight API for social media intelligence, sentiment analysis, trend detection, influencer identification, bot detection, and report generation. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[jrrqd](https://clawhub.ai/user/jrrqd) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and operators use this skill to connect an agent to Verosight for social listening, reputation monitoring, crisis detection, competitor analysis, influencer discovery, bot-detection review, and structured reports. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: API keys or JWT tokens can be exposed if users paste real credentials into shell history, logs, shared prompts, or reports. <br>\nMitigation: Use test or least-privilege Verosight API keys where possible, store credentials in environment variables or a secret manager, and avoid placing live keys directly in command history. <br>\nRisk: Queries and reports may involve confidential, regulated, or personal social-media data. <br>\nMitigation: Submit only data the user is authorized to process, avoid confidential or regulated personal data unless approved, and review generated reports before sharing. <br>\nRisk: Verosight API calls may consume paid credits. <br>\nMitigation: Check account balance and usage before running broad monitoring workflows, prefer narrow queries while testing, and use documented account endpoints to monitor credit consumption. <br>\nRisk: Social intelligence outputs can be incomplete or misleading because source coverage, filtering, and profile metadata availability vary. <br>\nMitigation: Treat analytics and bot-detection flags as decision support, validate important findings manually, and disclose platform coverage limitations in reports. <br>\n\n\n## Reference(s): <br>\n- [ClawHub Skill Page](https://clawhub.ai/jrrqd/skills/verosight-monitor) <br>\n- [Verosight API](https://verosight.com) <br>\n- [Verosight Documentation](https://verosight.com/docs) <br>\n- [Sentiment Analysis Workflow](references/sentiment-workflow.md) <br>\n- [PDF Report Generation with pdfkit](references/pdf-template.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with shell commands, API request examples, JSON response shapes, and report templates] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May produce Verosight API requests, sentiment summaries, bot-detection notes, and PDF report code snippets.] <br>\n\n## Skill Version(s): <br>\n1.1.1 (source: server release evidence and artifact _meta.json) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.1.0: 8 files, 14622 bytes\n\nFiles: _meta.json (136b), README.md (5978b), references/pdf-template.md (7691b), references/sentiment-workflow.md (4971b), scripts/quick-sentiment.sh (877b), scripts/verosight-auth.sh (666b), skill-card.md (2837b), SKILL.md (9260b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: verosight-monitor\ndescription: \"Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection across 14+ platforms (X, Instagram, TikTok, YouTube, Facebook, LinkedIn, Threads, Reddit, News, Blogs, Darkweb, Play Store, App Store, Capital Market). MCP-ready — connect directly to Claude, Cursor, or Windsurf. Use when: user asks for sentiment analysis, social media monitoring, trend analysis, influencer tracking, bot detection, market intelligence, or mentions 'Verosight', 'social listening', 'cyber monitoring', 'digital reputation', 'MCP'. Covers auth setup, querying posts, analytics (sentiment/trending/volume), profile search, MCP integration, and report generation.\"\n---\n\n# Verosight Monitor — Social Media Intelligence Skill\n\nIntegrate Verosight API for real-time social media monitoring and digital reputation management across **14+ platforms**. MCP-ready for AI agent integration.\n\n## 🚀 New in v1.1.0\n\n- **MCP Server** — Connect to Claude, Cursor, Windsurf via Model Context Protocol\n- **14+ Platforms** — Added Reddit, Darkweb, Play Store, App Store, Capital Market\n- **30 MCP Tools** — Expanded toolset for AI agent workflows\n- **Capital Market Data** — NEW Economic/market intelligence platform\n\n## Quick Setup\n\n### 1. Get API Key\nSign up at [verosight.com](https://verosight.com) and generate an API key from the [API Keys dashboard](https://verosight.com/dashboard/keys). Keys start with `vlt_live_` (production) or `vlt_test_` (test).\n\n### 2. Authenticate\nExchange your API key for a JWT token (valid 24 hours):\n\n```bash\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\nOr use the bundled auth script:\n```bash\n./scripts/verosight-auth.sh vlt_live_YOUR_KEY\n```\n\n### 3. Query Data\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\"\n\n# Search posts\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,instagram&limit=10\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## MCP Integration\n\nVerosight now supports **Model Context Protocol (MCP)** — connect directly to AI agents like Claude, Cursor, and Windsurf.\n\n### Connect to Claude Desktop\nAdd to your MCP settings:\n```json\n{\n  \"mcpServers\": {\n    \"verosight\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@verosight/mcp-server\"]\n    }\n  }\n}\n```\n\n### Available MCP Tools (30+)\n| Tool | Description |\n|------|-------------|\n| `posts_search` | Search posts across platforms |\n| `sentiment_analysis` | Analyze sentiment for keyword |\n| `trending_topics` | Get trending posts and profiles |\n| `profile_search` | Search social media profiles |\n| `volume_analysis` | Post/comment volume over time |\n| `capital_market` | Market data and financial signals |\n| `darkweb_monitor` | Monitor darkweb mentions |\n| `app_store_analysis` | App Store reviews and ratings |\n| `play_store_analysis` | Play Store reviews and ratings |\n| And 20+ more... |\n\n## API Endpoints\n\n### Posts\n```\nGET /v1/posts\n```\nSearch posts across platforms with filters.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated: `x,instagram,tiktok,youtube,threads,facebook,linkedin,reddit,news,blogs,darkweb,play_store,app_store,capital_market` |\n| `limit` | int | Results per page (default: 10, max: 50) |\n| `days` | int | Lookback period (1-90) |\n| `sentiment` | string | Filter: `positive`, `negative`, `neutral` |\n\n```\nGET /v1/posts/:id\n```\nGet a single post by ID.\n\n```\nGET /v1/posts/:id/comments\n```\nGet comments for a post.\n\n### Analytics\n```\nGET /v1/analytics/sentiment\n```\nSentiment analysis for a keyword. Returns positive/negative/neutral breakdown, weighted percentages, and sample posts.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated platforms |\n| `days` | int | Lookback period |\n| `limit` | int | Number of sample posts to return |\n\n```\nGET /v1/analytics/volume\n```\nPost/comment volume over time (daily breakdown).\n\n```\nGET /v1/analytics/trending\n```\nTrending posts and profiles for a keyword.\n\n### Profiles\n```\nGET /v1/profiles?query=ACCOUNT&source=instagram\n```\nSearch for social media profiles.\n\n```\nGET /v1/profiles/:source/:account\n```\nGet profile details (auto-crawls if missing).\n\n```\nGET /v1/profiles/:source/:account/stats\n```\nEngagement stats for a profile.\n\n### Capital Market\n```\nGET /v1/capital_market\n```\nMarket intelligence data — track brand/product mentions in financial contexts.\n\n### Search\n```\nPOST /v1/search\n```\nSemantic search across all content.\n\nBody:\n```json\n{\n  \"query\": \"keyword\",\n  \"sources\": [\"x\", \"instagram\", \"reddit\", \"news\"],\n  \"days\": 7\n}\n```\n\n### Account\n```\nGET /v1/account/balance\n```\nCheck credit balance (0 cost).\n\n```\nGET /v1/account/usage\n```\nUsage history and statistics (0 cost).\n\n## Response Format\n\nAll responses follow a standard envelope:\n\n```json\n{\n  \"data\": { ... },\n  \"meta\": {\n    \"request_id\": \"uuid\",\n    \"credits_used\": 2,\n    \"credits_remaining\": 998\n  },\n  \"pagination\": {\n    \"next_cursor\": \"base64...\",\n    \"has_more\": true,\n    \"total\": 38113\n  }\n}\n```\n\n## Workflows\n\n### Sentiment Analysis Report\n\n1. Authenticate → get JWT\n2. Query `/v1/analytics/sentiment` → get positive/negative/neutral breakdown\n3. Query `/v1/posts` with `sentiment=negative` → identify vocal accounts\n4. Query `/v1/analytics/volume` → trend over time\n5. Compile report: overview → trend → narratives → insights → recommendations\n\nFor detailed workflow, see [references/sentiment-workflow.md](references/sentiment-workflow.md).\n\n### Influencer Identification\n\n1. Query posts about target topic with high engagement\n2. Sort by likes, shares, views\n3. Cross-reference with sentiment (positive vs negative influencers)\n4. Profile top accounts for follower count and verification status\n\n### Bot Detection\n\n1. Query posts about target topic across platforms\n2. Look for patterns:\n   - Multiple posts from same account in short timeframe\n   - Identical or near-identical content across accounts\n   - Coordinated posting timing\n   - New accounts with abnormally high activity\n3. Flag suspicious accounts for manual review\n\n### Capital Market Intelligence\n\n1. Query `/v1/capital_market` for brand/product mentions in financial context\n2. Track sentiment shifts around earnings, product launches, regulatory news\n3. Monitor competitor mentions in financial media\n4. Alert on crisis indicators from financial conversations\n\n### PDF Report Generation\n\nGenerate professional reports with tables, charts, and formatted layouts using pdfkit (Node.js).\n\nSee [references/pdf-template.md](references/pdf-template.md) for complete guide.\n\n## Supported Platforms (14+)\n\n| Platform | Coverage |\n|----------|----------|\n| X (Twitter) | Posts, replies, engagement metrics |\n| Instagram | Posts, captions, engagement |\n| TikTok | Videos, descriptions |\n| YouTube | Videos, comments |\n| Threads | Posts, replies |\n| Facebook | Posts, pages |\n| LinkedIn | Posts, articles, company pages |\n| Reddit | Posts, comments, subreddits |\n| News Portals | Articles from Indonesian & global media |\n| Blogs | Blog posts, comments |\n| Darkweb | Underground mentions, leaks |\n| Play Store | App reviews, ratings |\n| App Store | App reviews, ratings |\n| Capital Market | Financial news, investor sentiment |\n\n## Credit System\n\nEach successful API call (2xx response) costs credits. Failed calls (4xx/5xx) do not deduct credits.\n\n| Tier | Rate Limit | Starting Credits |\n|------|-----------|-----------------|\n| Standard | 60 req/min | 1,000 |\n| Pro | 300 req/min | 10,000 |\n| Enterprise | Custom | Custom |\n\nCheck balance:\n```bash\ncurl -s \"https://api.verosight.com/v1/account/balance\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## Performance Stats\n\n| Metric | Value |\n|--------|-------|\n| Posts/day | 1M+ |\n| Platforms | 14+ |\n| Uptime SLA | 99.9% |\n| API Endpoints | 30+ |\n\n## Known Limitations\n\n- News portal results dominate volume (~70%); social platforms contribute less\n- Semantic search returns broadly relevant results; source/date filters are limited\n- Instagram direct scraping often blocked; use Verosight API for Instagram data\n- Profile metadata (followers, account age) may not be available for all accounts\n- Darkweb coverage varies by region and network access\n\n## Bundled Resources\n\n| File | Purpose |\n|------|---------|\n| `references/sentiment-workflow.md` | Step-by-step sentiment analysis workflow with report template |\n| `references/pdf-template.md` | PDF generation guide with pdfkit (tables, charts, layout) |\n| `scripts/verosight-auth.sh` | Auth helper — exchange API key for JWT |\n| `scripts/quick-sentiment.sh` | Quick sentiment check from command line |\n\n## Links\n\n- [Verosight API](https://verosight.com)\n- [API Dashboard](https://verosight.com/dashboard)\n- [Documentation](https://verosight.com/docs)\n- [MCP Setup](https://verosight.com/mcp)\n- [ClawHub](https://clawhub.ai/skills/verosight-monitor)\n- [GitHub](https://github.com/jrrqd/verosight-monitor)\n\nFile v1.1.0:README.md\n\n# 🔍 Verosight Monitor\n\n**Social Media Intelligence Skill for OpenClaw Agents**\n\nReal-time sentiment analysis, trend detection, influencer tracking, and bot detection powered by [Verosight API](https://verosight.com).\n\n[![OpenClaw Skill](https://img.shields.io/badge/OpenClaw-Skill-2563EB?style=for-the-badge)](https://github.com/openclaw/openclaw)\n[![Version](https://img.shields.io/badge/Version-1.0.1-8B5CF6?style=for-the-badge)](https://clawhub.com/skills/verosight-monitor)\n[![License](https://img.shields.io/badge/License-MIT-22C55E?style=for-the-badge)](LICENSE)\n\n---\n\n## What Is This?\n\nVerosight Monitor is an OpenClaw skill that integrates the [Verosight API](https://verosight.com) for real-time social media intelligence. It enables AI agents to perform sentiment analysis, track trends, identify influencers, and detect bot activity across major social media platforms.\n\n### Supported Platforms\n\n- **X (Twitter)** — Posts, replies, engagement metrics\n- **Instagram** — Posts, captions, engagement\n- **TikTok** — Videos, descriptions, views\n- **YouTube** — Videos, comments, engagement\n- **Threads** — Posts, replies, engagement\n- **Facebook** — Posts, pages\n- **LinkedIn** — Posts, articles\n- **News Portals** — Indonesian media articles\n\n## Features\n\n- 📊 **Sentiment Analysis** — Positive/negative/neutral breakdown with engagement-weighted scoring\n- 📈 **Trend Detection** — Volume tracking over time with daily breakdowns\n- 👤 **Influencer Identification** — Find the most vocal and impactful accounts\n- 🤖 **Bot Detection** — Identify coordinated posting patterns and inauthentic behavior\n- 📄 **PDF Reports** — Professional reports with tables, charts, and formatted layouts\n- 🌐 **Multi-Platform** — Monitor across 8+ platforms simultaneously\n- ⚡ **Real-Time** — Live data from social media and news sources\n\n## Quick Start\n\n### Prerequisites\n\n- [OpenClaw](https://github.com/openclaw/openclaw) agent instance\n- Verosight API key ([sign up here](https://verosight.com))\n\n### Installation\n\n```bash\n# Via ClawHub (recommended)\nclawhub install verosight-monitor\n\n# Or clone manually\ngit clone https://github.com/jrrqd/verosight-monitor.git\ncp -r verosight-monitor ~/.openclaw/workspace/skills/\n```\n\n### Get Your API Key\n\n1. Sign up at [verosight.com](https://verosight.com)\n2. Go to [API Keys](https://verosight.com/dashboard/keys)\n3. Generate a new key (starts with `vlt_live_`)\n\n### Authenticate\n\n```bash\n# Exchange API key for JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\n### Your First Query\n\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=your_keyword&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## API Reference\n\n### Posts\n\n```bash\n# Search posts\nGET /v1/posts?query=KEYWORD&sources=x,instagram&limit=10&days=7\n\n# Get single post\nGET /v1/posts/:id\n\n# Get comments\nGET /v1/posts/:id/comments\n```\n\n### Analytics\n\n```bash\n# Sentiment analysis\nGET /v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\n\n# Volume over time\nGET /v1/analytics/volume?query=KEYWORD&days=7\n\n# Trending posts/profiles\nGET /v1/analytics/trending?query=KEYWORD&limit=10\n```\n\n### Profiles\n\n```bash\n# Search profiles\nGET /v1/profiles?query=ACCOUNT&source=instagram\n\n# Profile details\nGET /v1/profiles/:source/:account\n\n# Engagement stats\nGET /v1/profiles/:source/:account/stats\n```\n\n### Account\n\n```bash\n# Check balance (free)\nGET /v1/account/balance\n\n# Usage history (free)\nGET /v1/account/usage\n```\n\n## Use Cases\n\n- **Digital Reputation Management** — Monitor brand mentions and sentiment in real-time\n- **Crisis Detection** — Early warning for negative viral content\n- **Competitor Analysis** — Track competitor mentions and public perception\n- **Influencer Marketing** — Identify key voices and opinion leaders\n- **Political Monitoring** — Track public opinion on policies and events\n- **Bot Detection** — Identify coordinated inauthentic behavior networks\n\n## Project Structure\n\n```\nverosight-monitor/\n├── SKILL.md                              # OpenClaw skill instructions\n├── README.md                             # This file\n├── LICENSE                               # MIT License\n├── references/\n│   ├── sentiment-workflow.md             # Step-by-step sentiment analysis guide\n│   └── pdf-template.md                   # PDF report generation with pdfkit\n└── scripts/\n    ├── verosight-auth.sh                 # Auth helper (API key → JWT)\n    └── quick-sentiment.sh                # Quick sentiment check CLI\n```\n\n## Credit System\n\nEach API call costs credits based on the endpoint:\n\n- **Posts search** — 2 credits\n- **Sentiment analysis** — 5 credits\n- **Volume analytics** — 5 credits\n- **Trending** — 5 credits\n- **Profile search** — 2 credits\n- **Account balance** — 0 credits\n\nFree accounts start with **1,000 credits**. Failed requests (4xx/5xx) do not deduct credits.\n\n## Rate Limits\n\n- **Standard** — 60 requests/minute\n- **Pro** — 300 requests/minute\n- **Enterprise** — Custom\n\n## Contributing\n\nContributions are welcome!\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## License\n\nThis project is licensed under the MIT License — see the [LICENSE](LICENSE) file for details.\n\n## Links\n\n- [Verosight API](https://verosight.com) — API documentation and dashboard\n- [ClawHub](https://clawhub.com) — OpenClaw skill marketplace\n- [OpenClaw](https://github.com/openclaw/openclaw) — Open-source AI agent runtime\n- [GitHub](https://github.com/jrrqd/verosight-monitor) — Source code\n\n---\n\nBuilt with 🔍 by **Slameticon Digital Valley**\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7f5gtk7twvcw8bvhenbr0q5x83yqth\",\n  \"slug\": \"verosight-monitor\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1784737683566\n}\n\nFile v1.1.0:references/pdf-template.md\n\n# PDF Report Generation with pdfkit\n\nGenerate professional PDF reports with tables, charts, and formatted layouts using Node.js pdfkit.\n\n## Installation\n\n```bash\nnpm install pdfkit\n```\n\n## Basic Structure\n\n```javascript\nconst PDFDocument = require('pdfkit');\nconst fs = require('fs');\n\nconst doc = new PDFDocument({ \n  size: 'A4', \n  margin: 45,\n  info: {\n    Title: 'Report Title',\n    Author: 'SDVM',\n    Subject: 'Report Subject'\n  }\n});\n\ndoc.pipe(fs.createWriteStream('report.pdf'));\n\n// Page constants\nconst PAGE_W = 595.28;   // A4 width in points\nconst MG = 45;           // Margin\nconst CW = PAGE_W - (MG * 2);  // Content width: 505\nconst PAGE_H = 841.89;   // A4 height in points\nconst BOT = PAGE_H - 55; // Bottom limit\n\n// State\nlet pg = 1;  // Page number\nlet y = 0;   // Current Y position\n```\n\n## Page Management\n\n```javascript\nfunction newPage() {\n  doc.addPage();\n  pg++;\n  y = MG;\n  // Header\n  doc.fontSize(7).fillColor('#6B7280').text('Your Brand', MG, MG - 12);\n  doc.moveTo(MG, MG + 2).lineTo(PAGE_W - MG, MG + 2)\n    .strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n  y = MG + 12;\n}\n\nfunction footer() {\n  doc.fontSize(7).fillColor('#6B7280')\n    .text(`Page ${pg}`, MG, PAGE_H - 30, { align: 'center', width: CW });\n}\n\nfunction need(h = 60) {\n  if (y + h > BOT) { footer(); newPage(); }\n}\n```\n\n## Drawing Functions\n\n### Section Title\n\n```javascript\nfunction title(text) {\n  need(45);\n  doc.fontSize(13).fillColor('#1F2937').text(text, MG, y);\n  const tw = doc.widthOfString(text);\n  doc.moveTo(MG, y + 16).lineTo(MG + tw + 8, y + 16)\n    .strokeColor('#2563EB').lineWidth(1.5).stroke();\n  y += 28;\n}\n```\n\n### Paragraph\n\n```javascript\nfunction para(text, indent = 0) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 6);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 6;\n}\n```\n\n### Bullet List\n\n```javascript\nfunction bullet(text, indent = 18) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 5);\n  doc.fillColor('#2563EB').text('●', MG, y);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 5;\n}\n```\n\n### Info Box (measures text height FIRST, then draws box)\n\n```javascript\nfunction infoBox(text, bg = '#FEF2F2', border = '#DC2626') {\n  const pad = 12;\n  const w = CW - pad * 2;\n  doc.fontSize(9);\n  \n  // Calculate height FIRST\n  const textH = doc.heightOfString(text, { width: w, lineGap: 1 });\n  const boxH = textH + pad * 2;\n  need(boxH + 10);\n  \n  // Then draw\n  doc.fillColor(bg).rect(MG, y, CW, boxH).fill();\n  doc.rect(MG, y, CW, boxH).strokeColor(border).lineWidth(1).stroke();\n  doc.fillColor('#1F2937').text(text, MG + pad, y + pad, { width: w, lineGap: 1 });\n  y += boxH + 12;\n}\n```\n\n### Data Table (auto row height calculation)\n\n```javascript\nfunction table(headers, rows, colW) {\n  const pad = 6;\n  const fs = 8;\n  const hdrH = 24;\n  \n  doc.fontSize(fs);\n  \n  // Pre-calculate all row heights\n  const rowH = rows.map(row => {\n    let maxH = 22;\n    row.forEach((cell, ci) => {\n      const h = doc.heightOfString(cell || '', { \n        width: colW[ci] - pad * 2, \n        lineGap: 1 \n      });\n      const cellH = h + pad * 2;\n      if (cellH > maxH) maxH = cellH;\n    });\n    return maxH;\n  });\n  \n  const totalH = hdrH + rowH.reduce((a, b) => a + b, 0);\n  need(totalH + 15);\n  \n  let ty = y;\n  \n  // Draw header\n  doc.fillColor('#EFF6FF').rect(MG, ty, CW, hdrH).fill();\n  doc.rect(MG, ty, CW, hdrH).strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n  let cx = MG + pad;\n  headers.forEach((h, i) => {\n    doc.fontSize(fs).fillColor('#1F2937')\n      .text(h, cx, ty + pad + 2, { width: colW[i] - pad * 2, lineBreak: false });\n    cx += colW[i];\n  });\n  ty += hdrH;\n  \n  // Draw rows\n  rows.forEach((row, ri) => {\n    const rh = rowH[ri];\n    if (ri % 2 === 0) {\n      doc.fillColor('#F9FAFB').rect(MG, ty, CW, rh).fill();\n    }\n    doc.rect(MG, ty, CW, rh).strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n    \n    let rx = MG + pad;\n    doc.fontSize(fs).fillColor('#1F2937');\n    row.forEach((cell, ci) => {\n      doc.text(cell || '', rx, ty + pad, { \n        width: colW[ci] - pad * 2,\n        lineGap: 1\n      });\n      rx += colW[ci];\n    });\n    ty += rh;\n  });\n  \n  y = ty + 10;\n}\n```\n\n### Bar Chart\n\n```javascript\nfunction barChart(items, maxVal) {\n  const barH = 24;\n  const barMaxW = 300;\n  const lblW = 60;\n  \n  need(items.length * (barH + 10) + 15);\n  \n  items.forEach(item => {\n    const bw = Math.max(0, (item.value / maxVal) * barMaxW);\n    \n    // Label\n    doc.fontSize(9).fillColor('#1F2937')\n      .text(item.label, MG, y + 6, { width: lblW });\n    \n    // Background bar\n    doc.fillColor('#F3F4F6')\n      .rect(MG + lblW, y, barMaxW, barH).fill();\n    \n    // Value bar\n    if (bw > 0) {\n      doc.fillColor(item.color || '#2563EB')\n        .rect(MG + lblW, y, bw, barH).fill();\n    }\n    \n    // Value text\n    const valText = item.value.toLocaleString();\n    doc.fontSize(9)\n      .fillColor(bw > 55 ? '#FFFFFF' : '#1F2937')\n      .text(valText, MG + lblW + 6, y + 6, { \n        width: Math.max(bw - 12, 40) \n      });\n    \n    // Percentage (optional)\n    if (item.pct) {\n      doc.fontSize(8).fillColor('#6B7280')\n        .text(item.pct, MG + lblW + barMaxW + 10, y + 7);\n    }\n    \n    y += barH + 10;\n  });\n  \n  // Reset spacing\n  y += 5;\n}\n```\n\n## Color Palette\n\n```javascript\nconst C = {\n  red: '#DC2626',       // Danger, critical alerts\n  orange: '#EA580C',    // Warnings\n  green: '#16A34A',     // Positive, success\n  blue: '#2563EB',      // Primary, links\n  gray: '#6B7280',      // Secondary text\n  dark: '#1F2937',      // Primary text\n  lightGray: '#E5E7EB', // Borders\n  lighterGray: '#F3F4F6', // Backgrounds\n  white: '#FFFFFF',\n  headerBg: '#EFF6FF',  // Table header\n  rowAlt: '#F9FAFB',    // Alternating row\n  dangerBg: '#FEF2F2'   // Alert box\n};\n```\n\n## Common Pitfalls\n\n1. **Text overlap** — Always calculate text height BEFORE drawing boxes/containers. Use `doc.heightOfString()` first, then draw the box with that height.\n\n2. **Row height in tables** — Pre-calculate ALL row heights before drawing. Use the maximum height per row across all columns.\n\n3. **Page breaks** — Always call `need()` before drawing any multi-line element (tables, charts, info boxes).\n\n4. **Line gap** — Use `lineGap: 1` option for multi-line text to prevent crowding between lines.\n\n5. **Credit/secret info** — Remove internal API details (credits, keys, tokens) from client-facing reports.\n\n6. **Column widths** — Ensure column widths sum to content width. Test with long text to verify wrapping.\n\n7. **Font sizing** — Keep body text at 9pt minimum for readability in print.\n\n## Complete Example\n\n```javascript\nconst PDFDocument = require('pdfkit');\nconst fs = require('fs');\n\nconst doc = new PDFDocument({ size: 'A4', margin: 45 });\ndoc.pipe(fs.createWriteStream('output.pdf'));\n\nconst MG = 45, CW = 505, BOT = 786;\nlet pg = 1, y = MG;\n\n// ... include all helper functions above ...\n\n// Page 1\ntitle('Executive Summary');\ninfoBox('Status: CRITICAL — 60% negative sentiment detected across platforms.');\n\ntitle('Key Metrics');\ntable(\n  ['Metric', 'Value', 'Change', 'Status'],\n  [\n    ['Total Posts', '8,251', '+33%', 'High'],\n    ['Negative', '3,300', '+45%', 'Critical'],\n    ['Positive', '0', '-100%', 'None'],\n  ],\n  [120, 80, 80, 225]\n);\n\ntitle('Volume Trend');\nbarChart([\n  { label: 'Day 1', value: 3490, color: '#3B82F6', pct: '33%' },\n  { label: 'Day 2', value: 4646, color: '#EF4444', pct: '44%' },\n  { label: 'Day 3', value: 115, color: '#9CA3AF', pct: '1%' },\n], 4600);\n\nfooter();\ndoc.end();\n```\n\nFile v1.1.0:references/sentiment-workflow.md\n\n# Sentiment Analysis Workflow\n\nComplete workflow for conducting sentiment analysis using the Verosight API.\n\n## Step 1: Authentication\n\n```bash\n# Set your API key\nexport VEROSIGHT_API_KEY=\"vlt_live_YOUR_KEY\"\n\n# Get JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: $VEROSIGHT_API_KEY\" | jq -r '.token')\n\n# Verify token works\ncurl -s \"https://api.verosight.com/v1/account/balance\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## Step 2: Get Sentiment Data\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram,tiktok&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n### Response Fields\n\n| Field | Description |\n|-------|-------------|\n| `positive` / `negative` / `neutral` | Post counts by sentiment |\n| `positive_pct` / `negative_pct` / `neutral_pct` | Percentage breakdown |\n| `weighted_positive_pct` / `weighted_negative_pct` | Engagement-weighted percentages |\n| `sample_positive` / `sample_negative` | Sample posts with engagement data |\n| `sample_independent_negative` | Social media comments with negative sentiment |\n| `post_positive` / `post_negative` / `post_neutral` | Post-level sentiment counts |\n| `thread_positive` / `thread_negative` | Thread-level sentiment counts |\n| `independent_positive` / `independent_negative` | Independent comment sentiment |\n\n## Step 3: Get Volume Trend\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/volume?query=KEYWORD&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\nReturns daily breakdown of posts and comments by platform.\n\n## Step 4: Get High-Engagement Posts\n\n```bash\n# Negative posts from X\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x&sentiment=negative&limit=15&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n\n# All posts from specific platforms\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,threads&limit=20&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## Step 5: Compile Report\n\nUse the following structure for your report:\n\n### Report Template\n\n```markdown\n# 🔍 SDV REPORT\n## Keyword: \"[KEYWORD]\"\n**Period:** [START] – [END] | **Sources:** [PLATFORMS]\n\n---\n\n## 📊 SENTIMENT OVERVIEW\n\n| Sentiment | Count | % | Weighted |\n|-----------|-------|---|----------|\n| Positive  | X     | X%| X%       |\n| Negative  | X     | X%| X%       |\n| Neutral   | X     | X%| X%       |\n\n**Status:** [CRITICAL / HIGH / MEDIUM / LOW]\n\n## 📈 VOLUME TREND\n\n| Date | Posts | Change |\n|------|-------|--------|\n| Day 1| X     | -      |\n| Day 2| X     | +X%    |\n\n## 🔴 TOP NEGATIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes, X shares)\n   - Full quote or summary\n\n2. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 🟢 TOP POSITIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 👤 VOCAL ACCOUNTS (Negative)\n\n| Account | Platform | Engagement | Narrative |\n|---------|----------|------------|-----------|\n| @user1  | X        | 500 likes  | Topic A   |\n| @user2  | Threads  | 200 likes  | Topic B   |\n\n## 📡 PLATFORM BREAKDOWN\n\n| Platform | Volume | % | Engagement | Dominant Sentiment |\n|----------|--------|---|------------|-------------------|\n| News Portal | X | X% | Low | Factual |\n| X (Twitter) | X | X% | Medium | Opinion/criticism |\n| Threads     | X | X% | HIGH | Emotional/viral |\n\n## 💡 INSIGHTS\n\n1. [Key finding about sentiment trend]\n2. [Key finding about narrative shift]\n3. [Key finding about platform dynamics]\n\n## ⚠️ PREDICTIONS (48h)\n\n| Risk | Probability | Impact | Trigger | Timeline |\n|------|-------------|--------|---------|----------|\n| Volume spike | High | High | Event X | 0-24h |\n| Narrative shift | Medium | Medium | Statement Y | 24-48h |\n\n## 📋 RECOMMENDATIONS\n\n### Immediate (0–24h)\n- Action 1\n- Action 2\n\n### Short-term (1–7 days)\n- Action 3\n- Action 4\n\n### Medium-term (1–4 weeks)\n- Action 5\n- Action 6\n```\n\n## Interpreting Results\n\n### Sentiment Status Levels\n\n| Status | Negative % | Weighted Neg | Action |\n|--------|-----------|--------------|--------|\n| CRITICAL | >50% | >60% | Immediate crisis response |\n| HIGH | 30-50% | 40-60% | Active monitoring + counter-narrative |\n| MEDIUM | 15-30% | 20-40% | Regular monitoring |\n| LOW | <15% | <20% | Passive monitoring |\n\n### Bot Detection Indicators\n\n- Same account posting multiple times about one topic\n- Identical content across different accounts\n- New accounts with abnormally high posting frequency\n- Coordinated timing (posts within minutes of each other)\n- Low follower count with high post count\n\n### Engagement Benchmarks (Indonesian social media)\n\n| Metric | Low | Medium | High | Viral |\n|--------|-----|--------|------|-------|\n| Likes (X) | <10 | 10-100 | 100-1K | >1K |\n| Likes (Threads) | <5 | 5-50 | 50-500 | >500 |\n| Views (X) | <1K | 1K-10K | 10K-100K | >100K |\n| Shares | <5 | 5-50 | 50-500 | >500 |\n\nFile v1.1.0:skill-card.md\n\n## Description: <br>\nVerosight Monitor guides agents through Verosight API and MCP workflows for social media intelligence, sentiment analysis, trend detection, influencer identification, bot detection, and cyber monitoring across supported platforms. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[jrrqd](https://clawhub.ai/user/jrrqd) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users, developers, and analysts use this skill to configure Verosight access, query monitoring data, analyze sentiment and trends, identify influential or suspicious accounts, and assemble reports from API results. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill sends API keys, JWTs, search terms, account names, and monitoring targets to an external Verosight service. <br>\nMitigation: Use scoped or test credentials that can be rotated, avoid sensitive or regulated monitoring targets unless authorized, and confirm a lawful basis before use. <br>\nRisk: The MCP setup relies on an external package before the package and version are independently verified. <br>\nMitigation: Verify and pin the external MCP package version before enabling it in an agent environment. <br>\nRisk: Social media, darkweb, app review, and market monitoring may surface personal, confidential, or regulated information. <br>\nMitigation: Limit queries and source scopes to approved use cases, review outputs before sharing, and apply organizational privacy and compliance controls. <br>\n\n\n## Reference(s): <br>\n- [ClawHub Skill Page](https://clawhub.ai/jrrqd/skills/verosight-monitor) <br>\n- [Verosight API](https://verosight.com) <br>\n- [Verosight Documentation](https://verosight.com/docs) <br>\n- [Verosight MCP Setup](https://verosight.com/mcp) <br>\n- [Sentiment Analysis Workflow](references/sentiment-workflow.md) <br>\n- [PDF Report Template](references/pdf-template.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [guidance, markdown, code, shell commands, configuration] <br>\n**Output Format:** [Markdown guidance with API examples, JSON request and response shapes, shell commands, MCP configuration snippets, and report templates] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Produces Verosight API workflows and report scaffolding; actual results depend on user credentials, authorized monitoring targets, and Verosight service responses.] <br>\n\n## Skill Version(s): <br>\n1.1.0 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.0.2: 8 files, 13736 bytes\n\nFiles: README.md (5978b), references/pdf-template.md (7691b), references/sentiment-workflow.md (4971b), scripts/quick-sentiment.sh (877b), scripts/verosight-auth.sh (666b), skill-card.md (2878b), SKILL.md (6748b), _meta.json (136b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: verosight-monitor\ndescription: \"Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection across X (Twitter), Instagram, TikTok, YouTube, Threads, and news portals. Use when: user asks for sentiment analysis, social media monitoring, trend analysis, influencer tracking, bot detection, or mentions 'Verosight', 'social listening', 'cyber monitoring', 'digital reputation'. Covers auth setup, querying posts, analytics (sentiment/trending/volume), profile search, and report generation.\"\n---\n\n# Verosight Monitor — Social Media Intelligence Skill\n\nIntegrate Verosight API for real-time social media monitoring and digital reputation management across major platforms.\n\n## Quick Setup\n\n### 1. Get API Key\nSign up at [verosight.com](https://verosight.com) and generate an API key from the [API Keys dashboard](https://verosight.com/dashboard/keys). Keys start with `vlt_live_` (production) or `vlt_test_` (test).\n\n### 2. Authenticate\nExchange your API key for a JWT token (valid 24 hours):\n\n```bash\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\nOr use the bundled auth script:\n```bash\n./scripts/verosight-auth.sh vlt_live_YOUR_KEY\n```\n\n### 3. Query Data\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\"\n\n# Search posts\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,instagram&limit=10\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## API Endpoints\n\n### Posts\n```\nGET /v1/posts\n```\nSearch posts across platforms with filters.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated: `x,instagram,tiktok,youtube,threads,news_portal` |\n| `limit` | int | Results per page (default: 10, max: 50) |\n| `days` | int | Lookback period (1-90) |\n| `sentiment` | string | Filter: `positive`, `negative`, `neutral` |\n\n```\nGET /v1/posts/:id\n```\nGet a single post by ID.\n\n```\nGET /v1/posts/:id/comments\n```\nGet comments for a post.\n\n### Analytics\n```\nGET /v1/analytics/sentiment\n```\nSentiment analysis for a keyword. Returns positive/negative/neutral breakdown, weighted percentages, and sample posts.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated platforms |\n| `days` | int | Lookback period |\n| `limit` | int | Number of sample posts to return |\n\n```\nGET /v1/analytics/volume\n```\nPost/comment volume over time (daily breakdown).\n\n```\nGET /v1/analytics/trending\n```\nTrending posts and profiles for a keyword.\n\n### Profiles\n```\nGET /v1/profiles?query=ACCOUNT&source=instagram\n```\nSearch for social media profiles.\n\n```\nGET /v1/profiles/:source/:account\n```\nGet profile details (auto-crawls if missing).\n\n```\nGET /v1/profiles/:source/:account/stats\n```\nEngagement stats for a profile.\n\n### Search\n```\nPOST /v1/search\n```\nSemantic search across all content.\n\nBody:\n```json\n{\n  \"query\": \"keyword\",\n  \"sources\": [\"x\", \"instagram\"],\n  \"days\": 7\n}\n```\n\n### Account\n```\nGET /v1/account/balance\n```\nCheck credit balance (0 cost).\n\n```\nGET /v1/account/usage\n```\nUsage history and statistics (0 cost).\n\n## Response Format\n\nAll responses follow a standard envelope:\n\n```json\n{\n  \"data\": { ... },\n  \"meta\": {\n    \"request_id\": \"uuid\",\n    \"credits_used\": 2,\n    \"credits_remaining\": 998\n  },\n  \"pagination\": {\n    \"next_cursor\": \"base64...\",\n    \"has_more\": true,\n    \"total\": 38113\n  }\n}\n```\n\n## Workflows\n\n### Sentiment Analysis Report\n\n1. Authenticate → get JWT\n2. Query `/v1/analytics/sentiment` → get positive/negative/neutral breakdown\n3. Query `/v1/posts` with `sentiment=negative` → identify vocal accounts\n4. Query `/v1/analytics/volume` → trend over time\n5. Compile report: overview → trend → narratives → insights → recommendations\n\nFor detailed workflow, see [references/sentiment-workflow.md](references/sentiment-workflow.md).\n\n### Influencer Identification\n\n1. Query posts about target topic with high engagement\n2. Sort by likes, shares, views\n3. Cross-reference with sentiment (positive vs negative influencers)\n4. Profile top accounts for follower count and verification status\n\n### Bot Detection\n\n1. Query posts about target topic across platforms\n2. Look for patterns:\n   - Multiple posts from same account in short timeframe\n   - Identical or near-identical content across accounts\n   - Coordinated posting timing\n   - New accounts with abnormally high activity\n3. Flag suspicious accounts for manual review\n\n### PDF Report Generation\n\nGenerate professional reports with tables, charts, and formatted layouts using pdfkit (Node.js).\n\nSee [references/pdf-template.md](references/pdf-template.md) for complete guide.\n\n## Supported Platforms\n\n| Platform | Coverage |\n|----------|----------|\n| X (Twitter) | Posts, replies, engagement metrics |\n| Instagram | Posts, captions, engagement |\n| TikTok | Videos, descriptions |\n| YouTube | Videos, comments |\n| Threads | Posts, replies |\n| Facebook | Posts, pages |\n| LinkedIn | Posts, articles |\n| News Portals | Articles from Indonesian media |\n\n## Credit System\n\nEach successful API call (2xx response) costs credits. Failed calls (4xx/5xx) do not deduct credits.\n\n| Tier | Rate Limit | Starting Credits |\n|------|-----------|-----------------|\n| Standard | 60 req/min | 1,000 |\n| Pro | 300 req/min | 10,000 |\n| Enterprise | Custom | Custom |\n\nCheck balance:\n```bash\ncurl -s \"https://api.verosight.com/v1/account/balance\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## Known Limitations\n\n- News portal results dominate volume (~70%); social platforms contribute less\n- Semantic search returns broadly relevant results; source/date filters are limited\n- Instagram direct scraping often blocked; use Verosight API for Instagram data\n- Profile metadata (followers, account age) may not be available for all accounts\n\n## Bundled Resources\n\n| File | Purpose |\n|------|---------|\n| `references/sentiment-workflow.md` | Step-by-step sentiment analysis workflow with report template |\n| `references/pdf-template.md` | PDF generation guide with pdfkit (tables, charts, layout) |\n| `scripts/verosight-auth.sh` | Auth helper — exchange API key for JWT |\n| `scripts/quick-sentiment.sh` | Quick sentiment check from command line |\n\n## Links\n\n- [Verosight API](https://verosight.com)\n- [API Dashboard](https://verosight.com/dashboard)\n- [Documentation](https://verosight.com/docs)\n- [ClawHub](https://clawhub.com/skills/verosight-monitor)\n- [GitHub](https://github.com/jrrqd/verosight-monitor)\n\nFile v1.0.2:README.md\n\n# 🔍 Verosight Monitor\n\n**Social Media Intelligence Skill for OpenClaw Agents**\n\nReal-time sentiment analysis, trend detection, influencer tracking, and bot detection powered by [Verosight API](https://verosight.com).\n\n[![OpenClaw Skill](https://img.shields.io/badge/OpenClaw-Skill-2563EB?style=for-the-badge)](https://github.com/openclaw/openclaw)\n[![Version](https://img.shields.io/badge/Version-1.0.1-8B5CF6?style=for-the-badge)](https://clawhub.com/skills/verosight-monitor)\n[![License](https://img.shields.io/badge/License-MIT-22C55E?style=for-the-badge)](LICENSE)\n\n---\n\n## What Is This?\n\nVerosight Monitor is an OpenClaw skill that integrates the [Verosight API](https://verosight.com) for real-time social media intelligence. It enables AI agents to perform sentiment analysis, track trends, identify influencers, and detect bot activity across major social media platforms.\n\n### Supported Platforms\n\n- **X (Twitter)** — Posts, replies, engagement metrics\n- **Instagram** — Posts, captions, engagement\n- **TikTok** — Videos, descriptions, views\n- **YouTube** — Videos, comments, engagement\n- **Threads** — Posts, replies, engagement\n- **Facebook** — Posts, pages\n- **LinkedIn** — Posts, articles\n- **News Portals** — Indonesian media articles\n\n## Features\n\n- 📊 **Sentiment Analysis** — Positive/negative/neutral breakdown with engagement-weighted scoring\n- 📈 **Trend Detection** — Volume tracking over time with daily breakdowns\n- 👤 **Influencer Identification** — Find the most vocal and impactful accounts\n- 🤖 **Bot Detection** — Identify coordinated posting patterns and inauthentic behavior\n- 📄 **PDF Reports** — Professional reports with tables, charts, and formatted layouts\n- 🌐 **Multi-Platform** — Monitor across 8+ platforms simultaneously\n- ⚡ **Real-Time** — Live data from social media and news sources\n\n## Quick Start\n\n### Prerequisites\n\n- [OpenClaw](https://github.com/openclaw/openclaw) agent instance\n- Verosight API key ([sign up here](https://verosight.com))\n\n### Installation\n\n```bash\n# Via ClawHub (recommended)\nclawhub install verosight-monitor\n\n# Or clone manually\ngit clone https://github.com/jrrqd/verosight-monitor.git\ncp -r verosight-monitor ~/.openclaw/workspace/skills/\n```\n\n### Get Your API Key\n\n1. Sign up at [verosight.com](https://verosight.com)\n2. Go to [API Keys](https://verosight.com/dashboard/keys)\n3. Generate a new key (starts with `vlt_live_`)\n\n### Authenticate\n\n```bash\n# Exchange API key for JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\n### Your First Query\n\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=your_keyword&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## API Reference\n\n### Posts\n\n```bash\n# Search posts\nGET /v1/posts?query=KEYWORD&sources=x,instagram&limit=10&days=7\n\n# Get single post\nGET /v1/posts/:id\n\n# Get comments\nGET /v1/posts/:id/comments\n```\n\n### Analytics\n\n```bash\n# Sentiment analysis\nGET /v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\n\n# Volume over time\nGET /v1/analytics/volume?query=KEYWORD&days=7\n\n# Trending posts/profiles\nGET /v1/analytics/trending?query=KEYWORD&limit=10\n```\n\n### Profiles\n\n```bash\n# Search profiles\nGET /v1/profiles?query=ACCOUNT&source=instagram\n\n# Profile details\nGET /v1/profiles/:source/:account\n\n# Engagement stats\nGET /v1/profiles/:source/:account/stats\n```\n\n### Account\n\n```bash\n# Check balance (free)\nGET /v1/account/balance\n\n# Usage history (free)\nGET /v1/account/usage\n```\n\n## Use Cases\n\n- **Digital Reputation Management** — Monitor brand mentions and sentiment in real-time\n- **Crisis Detection** — Early warning for negative viral content\n- **Competitor Analysis** — Track competitor mentions and public perception\n- **Influencer Marketing** — Identify key voices and opinion leaders\n- **Political Monitoring** — Track public opinion on policies and events\n- **Bot Detection** — Identify coordinated inauthentic behavior networks\n\n## Project Structure\n\n```\nverosight-monitor/\n├── SKILL.md                              # OpenClaw skill instructions\n├── README.md                             # This file\n├── LICENSE                               # MIT License\n├── references/\n│   ├── sentiment-workflow.md             # Step-by-step sentiment analysis guide\n│   └── pdf-template.md                   # PDF report generation with pdfkit\n└── scripts/\n    ├── verosight-auth.sh                 # Auth helper (API key → JWT)\n    └── quick-sentiment.sh                # Quick sentiment check CLI\n```\n\n## Credit System\n\nEach API call costs credits based on the endpoint:\n\n- **Posts search** — 2 credits\n- **Sentiment analysis** — 5 credits\n- **Volume analytics** — 5 credits\n- **Trending** — 5 credits\n- **Profile search** — 2 credits\n- **Account balance** — 0 credits\n\nFree accounts start with **1,000 credits**. Failed requests (4xx/5xx) do not deduct credits.\n\n## Rate Limits\n\n- **Standard** — 60 requests/minute\n- **Pro** — 300 requests/minute\n- **Enterprise** — Custom\n\n## Contributing\n\nContributions are welcome!\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## License\n\nThis project is licensed under the MIT License — see the [LICENSE](LICENSE) file for details.\n\n## Links\n\n- [Verosight API](https://verosight.com) — API documentation and dashboard\n- [ClawHub](https://clawhub.com) — OpenClaw skill marketplace\n- [OpenClaw](https://github.com/openclaw/openclaw) — Open-source AI agent runtime\n- [GitHub](https://github.com/jrrqd/verosight-monitor) — Source code\n\n---\n\nBuilt with 🔍 by **Slameticon Digital Valley**\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn7f5gtk7twvcw8bvhenbr0q5x83yqth\",\n  \"slug\": \"verosight-monitor\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1774930550907\n}\n\nFile v1.0.2:references/pdf-template.md\n\n# PDF Report Generation with pdfkit\n\nGenerate professional PDF reports with tables, charts, and formatted layouts using Node.js pdfkit.\n\n## Installation\n\n```bash\nnpm install pdfkit\n```\n\n## Basic Structure\n\n```javascript\nconst PDFDocument = require('pdfkit');\nconst fs = require('fs');\n\nconst doc = new PDFDocument({ \n  size: 'A4', \n  margin: 45,\n  info: {\n    Title: 'Report Title',\n    Author: 'SDVM',\n    Subject: 'Report Subject'\n  }\n});\n\ndoc.pipe(fs.createWriteStream('report.pdf'));\n\n// Page constants\nconst PAGE_W = 595.28;   // A4 width in points\nconst MG = 45;           // Margin\nconst CW = PAGE_W - (MG * 2);  // Content width: 505\nconst PAGE_H = 841.89;   // A4 height in points\nconst BOT = PAGE_H - 55; // Bottom limit\n\n// State\nlet pg = 1;  // Page number\nlet y = 0;   // Current Y position\n```\n\n## Page Management\n\n```javascript\nfunction newPage() {\n  doc.addPage();\n  pg++;\n  y = MG;\n  // Header\n  doc.fontSize(7).fillColor('#6B7280').text('Your Brand', MG, MG - 12);\n  doc.moveTo(MG, MG + 2).lineTo(PAGE_W - MG, MG + 2)\n    .strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n  y = MG + 12;\n}\n\nfunction footer() {\n  doc.fontSize(7).fillColor('#6B7280')\n    .text(`Page ${pg}`, MG, PAGE_H - 30, { align: 'center', width: CW });\n}\n\nfunction need(h = 60) {\n  if (y + h > BOT) { footer(); newPage(); }\n}\n```\n\n## Drawing Functions\n\n### Section Title\n\n```javascript\nfunction title(text) {\n  need(45);\n  doc.fontSize(13).fillColor('#1F2937').text(text, MG, y);\n  const tw = doc.widthOfString(text);\n  doc.moveTo(MG, y + 16).lineTo(MG + tw + 8, y + 16)\n    .strokeColor('#2563EB').lineWidth(1.5).stroke();\n  y += 28;\n}\n```\n\n### Paragraph\n\n```javascript\nfunction para(text, indent = 0) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 6);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 6;\n}\n```\n\n### Bullet List\n\n```javascript\nfunction bullet(text, indent = 18) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 5);\n  doc.fillColor('#2563EB').text('●', MG, y);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 5;\n}\n```\n\n### Info Box (measures text height FIRST, then draws box)\n\n```javascript\nfunction infoBox(text, bg = '#FEF2F2', border = '#DC2626') {\n  const pad = 12;\n  const w = CW - pad * 2;\n  doc.fontSize(9);\n  \n  // Calculate height FIRST\n  const textH = doc.heightOfString(text, { width: w, lineGap: 1 });\n  const boxH = textH + pad * 2;\n  need(boxH + 10);\n  \n  // Then draw\n  doc.fillColor(bg).rect(MG, y, CW, boxH).fill();\n  doc.rect(MG, y, CW, boxH).strokeColor(border).lineWidth(1).stroke();\n  doc.fillColor('#1F2937').text(text, MG + pad, y + pad, { width: w, lineGap: 1 });\n  y += boxH + 12;\n}\n```\n\n### Data Table (auto row height calculation)\n\n```javascript\nfunction table(headers, rows, colW) {\n  const pad = 6;\n  const fs = 8;\n  const hdrH = 24;\n  \n  doc.fontSize(fs);\n  \n  // Pre-calculate all row heights\n  const rowH = rows.map(row => {\n    let maxH = 22;\n    row.forEach((cell, ci) => {\n      const h = doc.heightOfString(cell || '', { \n        width: colW[ci] - pad * 2, \n        lineGap: 1 \n      });\n      const cellH = h + pad * 2;\n      if (cellH > maxH) maxH = cellH;\n    });\n    return maxH;\n  });\n  \n  const totalH = hdrH + rowH.reduce((a, b) => a + b, 0);\n  need(totalH + 15);\n  \n  let ty = y;\n  \n  // Draw header\n  doc.fillColor('#EFF6FF').rect(MG, ty, CW, hdrH).fill();\n  doc.rect(MG, ty, CW, hdrH).strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n  let cx = MG + pad;\n  headers.forEach((h, i) => {\n    doc.fontSize(fs).fillColor('#1F2937')\n      .text(h, cx, ty + pad + 2, { width: colW[i] - pad * 2, lineBreak: false });\n    cx += colW[i];\n  });\n  ty += hdrH;\n  \n  // Draw rows\n  rows.forEach((row, ri) => {\n    const rh = rowH[ri];\n    if (ri % 2 === 0) {\n      doc.fillColor('#F9FAFB').rect(MG, ty, CW, rh).fill();\n    }\n    doc.rect(MG, ty, CW, rh).strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n    \n    let rx = MG + pad;\n    doc.fontSize(fs).fillColor('#1F2937');\n    row.forEach((cell, ci) => {\n      doc.text(cell || '', rx, ty + pad, { \n        width: colW[ci] - pad * 2,\n        lineGap: 1\n      });\n      rx += colW[ci];\n    });\n    ty += rh;\n  });\n  \n  y = ty + 10;\n}\n```\n\n### Bar Chart\n\n```javascript\nfunction barChart(items, maxVal) {\n  const barH = 24;\n  const barMaxW = 300;\n  const lblW = 60;\n  \n  need(items.length * (barH + 10) + 15);\n  \n  items.forEach(item => {\n    const bw = Math.max(0, (item.value / maxVal) * barMaxW);\n    \n    // Label\n    doc.fontSize(9).fillColor('#1F2937')\n      .text(item.label, MG, y + 6, { width: lblW });\n    \n    // Background bar\n    doc.fillColor('#F3F4F6')\n      .rect(MG + lblW, y, barMaxW, barH).fill();\n    \n    // Value bar\n    if (bw > 0) {\n      doc.fillColor(item.color || '#2563EB')\n        .rect(MG + lblW, y, bw, barH).fill();\n    }\n    \n    // Value text\n    const valText = item.value.toLocaleString();\n    doc.fontSize(9)\n      .fillColor(bw > 55 ? '#FFFFFF' : '#1F2937')\n      .text(valText, MG + lblW + 6, y + 6, { \n        width: Math.max(bw - 12, 40) \n      });\n    \n    // Percentage (optional)\n    if (item.pct) {\n      doc.fontSize(8).fillColor('#6B7280')\n        .text(item.pct, MG + lblW + barMaxW + 10, y + 7);\n    }\n    \n    y += barH + 10;\n  });\n  \n  // Reset spacing\n  y += 5;\n}\n```\n\n## Color Palette\n\n```javascript\nconst C = {\n  red: '#DC2626',       // Danger, critical alerts\n  orange: '#EA580C',    // Warnings\n  green: '#16A34A',     // Positive, success\n  blue: '#2563EB',      // Primary, links\n  gray: '#6B7280',      // Secondary text\n  dark: '#1F2937',      // Primary text\n  lightGray: '#E5E7EB', // Borders\n  lighterGray: '#F3F4F6', // Backgrounds\n  white: '#FFFFFF',\n  headerBg: '#EFF6FF',  // Table header\n  rowAlt: '#F9FAFB',    // Alternating row\n  dangerBg: '#FEF2F2'   // Alert box\n};\n```\n\n## Common Pitfalls\n\n1. **Text overlap** — Always calculate text height BEFORE drawing boxes/containers. Use `doc.heightOfString()` first, then draw the box with that height.\n\n2. **Row height in tables** — Pre-calculate ALL row heights before drawing. Use the maximum height per row across all columns.\n\n3. **Page breaks** — Always call `need()` before drawing any multi-line element (tables, charts, info boxes).\n\n4. **Line gap** — Use `lineGap: 1` option for multi-line text to prevent crowding between lines.\n\n5. **Credit/secret info** — Remove internal API details (credits, keys, tokens) from client-facing reports.\n\n6. **Column widths** — Ensure column widths sum to content width. Test with long text to verify wrapping.\n\n7. **Font sizing** — Keep body text at 9pt minimum for readability in print.\n\n## Complete Example\n\n```javascript\nconst PDFDocument = require('pdfkit');\nconst fs = require('fs');\n\nconst doc = new PDFDocument({ size: 'A4', margin: 45 });\ndoc.pipe(fs.createWriteStream('output.pdf'));\n\nconst MG = 45, CW = 505, BOT = 786;\nlet pg = 1, y = MG;\n\n// ... include all helper functions above ...\n\n// Page 1\ntitle('Executive Summary');\ninfoBox('Status: CRITICAL — 60% negative sentiment detected across platforms.');\n\ntitle('Key Metrics');\ntable(\n  ['Metric', 'Value', 'Change', 'Status'],\n  [\n    ['Total Posts', '8,251', '+33%', 'High'],\n    ['Negative', '3,300', '+45%', 'Critical'],\n    ['Positive', '0', '-100%', 'None'],\n  ],\n  [120, 80, 80, 225]\n);\n\ntitle('Volume Trend');\nbarChart([\n  { label: 'Day 1', value: 3490, color: '#3B82F6', pct: '33%' },\n  { label: 'Day 2', value: 4646, color: '#EF4444', pct: '44%' },\n  { label: 'Day 3', value: 115, color: '#9CA3AF', pct: '1%' },\n], 4600);\n\nfooter();\ndoc.end();\n```\n\nFile v1.0.2:references/sentiment-workflow.md\n\n# Sentiment Analysis Workflow\n\nComplete workflow for conducting sentiment analysis using the Verosight API.\n\n## Step 1: Authentication\n\n```bash\n# Set your API key\nexport VEROSIGHT_API_KEY=\"vlt_live_YOUR_KEY\"\n\n# Get JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: $VEROSIGHT_API_KEY\" | jq -r '.token')\n\n# Verify token works\ncurl -s \"https://api.verosight.com/v1/account/balance\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## Step 2: Get Sentiment Data\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram,tiktok&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n### Response Fields\n\n| Field | Description |\n|-------|-------------|\n| `positive` / `negative` / `neutral` | Post counts by sentiment |\n| `positive_pct` / `negative_pct` / `neutral_pct` | Percentage breakdown |\n| `weighted_positive_pct` / `weighted_negative_pct` | Engagement-weighted percentages |\n| `sample_positive` / `sample_negative` | Sample posts with engagement data |\n| `sample_independent_negative` | Social media comments with negative sentiment |\n| `post_positive` / `post_negative` / `post_neutral` | Post-level sentiment counts |\n| `thread_positive` / `thread_negative` | Thread-level sentiment counts |\n| `independent_positive` / `independent_negative` | Independent comment sentiment |\n\n## Step 3: Get Volume Trend\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/volume?query=KEYWORD&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\nReturns daily breakdown of posts and comments by platform.\n\n## Step 4: Get High-Engagement Posts\n\n```bash\n# Negative posts from X\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x&sentiment=negative&limit=15&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n\n# All posts from specific platforms\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,threads&limit=20&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## Step 5: Compile Report\n\nUse the following structure for your report:\n\n### Report Template\n\n```markdown\n# 🔍 SDV REPORT\n## Keyword: \"[KEYWORD]\"\n**Period:** [START] – [END] | **Sources:** [PLATFORMS]\n\n---\n\n## 📊 SENTIMENT OVERVIEW\n\n| Sentiment | Count | % | Weighted |\n|-----------|-------|---|----------|\n| Positive  | X     | X%| X%       |\n| Negative  | X     | X%| X%       |\n| Neutral   | X     | X%| X%       |\n\n**Status:** [CRITICAL / HIGH / MEDIUM / LOW]\n\n## 📈 VOLUME TREND\n\n| Date | Posts | Change |\n|------|-------|--------|\n| Day 1| X     | -      |\n| Day 2| X     | +X%    |\n\n## 🔴 TOP NEGATIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes, X shares)\n   - Full quote or summary\n\n2. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 🟢 TOP POSITIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 👤 VOCAL ACCOUNTS (Negative)\n\n| Account | Platform | Engagement | Narrative |\n|---------|----------|------------|-----------|\n| @user1  | X        | 500 likes  | Topic A   |\n| @user2  | Threads  | 200 likes  | Topic B   |\n\n## 📡 PLATFORM BREAKDOWN\n\n| Platform | Volume | % | Engagement | Dominant Sentiment |\n|----------|--------|---|------------|-------------------|\n| News Portal | X | X% | Low | Factual |\n| X (Twitter) | X | X% | Medium | Opinion/criticism |\n| Threads     | X | X% | HIGH | Emotional/viral |\n\n## 💡 INSIGHTS\n\n1. [Key finding about sentiment trend]\n2. [Key finding about narrative shift]\n3. [Key finding about platform dynamics]\n\n## ⚠️ PREDICTIONS (48h)\n\n| Risk | Probability | Impact | Trigger | Timeline |\n|------|-------------|--------|---------|----------|\n| Volume spike | High | High | Event X | 0-24h |\n| Narrative shift | Medium | Medium | Statement Y | 24-48h |\n\n## 📋 RECOMMENDATIONS\n\n### Immediate (0–24h)\n- Action 1\n- Action 2\n\n### Short-term (1–7 days)\n- Action 3\n- Action 4\n\n### Medium-term (1–4 weeks)\n- Action 5\n- Action 6\n```\n\n## Interpreting Results\n\n### Sentiment Status Levels\n\n| Status | Negative % | Weighted Neg | Action |\n|--------|-----------|--------------|--------|\n| CRITICAL | >50% | >60% | Immediate crisis response |\n| HIGH | 30-50% | 40-60% | Active monitoring + counter-narrative |\n| MEDIUM | 15-30% | 20-40% | Regular monitoring |\n| LOW | <15% | <20% | Passive monitoring |\n\n### Bot Detection Indicators\n\n- Same account posting multiple times about one topic\n- Identical content across different accounts\n- New accounts with abnormally high posting frequency\n- Coordinated timing (posts within minutes of each other)\n- Low follower count with high post count\n\n### Engagement Benchmarks (Indonesian social media)\n\n| Metric | Low | Medium | High | Viral |\n|--------|-----|--------|------|-------|\n| Likes (X) | <10 | 10-100 | 100-1K | >1K |\n| Likes (Threads) | <5 | 5-50 | 50-500 | >500 |\n| Views (X) | <1K | 1K-10K | 10K-100K | >100K |\n| Shares | <5 | 5-50 | 50-500 | >500 |\n\nFile v1.0.2:skill-card.md\n\n## Description: <br>\nVerosight Monitor integrates the Verosight API so agents can perform social media intelligence and cyber monitoring across major social, video, thread, and news sources. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[jrrqd](https://clawhub.ai/user/jrrqd) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and developers use this skill to connect agents to Verosight for sentiment analysis, trend monitoring, influencer discovery, bot-detection workflows, and report generation. It is suited to approved social listening, digital reputation, and cyber monitoring tasks that require credentialed API access. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: API keys and JWTs may be exposed when passed directly on shared command lines, copied into prompts, or retained in shell history. <br>\nMitigation: Use test or limited-scope keys where possible, pass credentials through protected environment variables, avoid shared terminals, and rotate credentials after exposure. <br>\nRisk: Search terms, platform selections, returned posts, and generated reports may contain sensitive monitoring data or personal information. <br>\nMitigation: Run only approved monitoring, minimize retained data, restrict report access, and treat returned posts and reports as sensitive outputs. <br>\nRisk: Sentiment, trend, influencer, and bot-detection outputs can be incomplete or misleading if source coverage is uneven or automated classifications are wrong. <br>\nMitigation: Use the results as decision support, manually review high-impact findings, and document source coverage and uncertainty in reports. <br>\n\n\n## Reference(s): <br>\n- [ClawHub Skill Listing](https://clawhub.ai/jrrqd/verosight-monitor) <br>\n- [Verosight API](https://verosight.com) <br>\n- [Verosight Documentation](https://verosight.com/docs) <br>\n- [Sentiment Analysis Workflow](references/sentiment-workflow.md) <br>\n- [PDF Report Generation with pdfkit](references/pdf-template.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with inline shell commands, API examples, JSON response descriptions, and report templates] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May produce API requests, analysis summaries, monitoring reports, and PDF-generation code snippets for agent use.] <br>\n\n## Skill Version(s): <br>\n1.0.2 (source: ClawHub release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.0.1: 7 files, 12459 bytes\n\nFiles: README.md (6470b), references/pdf-template.md (7691b), references/sentiment-workflow.md (4971b), scripts/quick-sentiment.sh (877b), scripts/verosight-auth.sh (666b), SKILL.md (6748b), _meta.json (136b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: verosight-monitor\ndescription: \"Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection across X (Twitter), Instagram, TikTok, YouTube, Threads, and news portals. Use when: user asks for sentiment analysis, social media monitoring, trend analysis, influencer tracking, bot detection, or mentions 'Verosight', 'social listening', 'cyber monitoring', 'digital reputation'. Covers auth setup, querying posts, analytics (sentiment/trending/volume), profile search, and report generation.\"\n---\n\n# Verosight Monitor — Social Media Intelligence Skill\n\nIntegrate Verosight API for real-time social media monitoring and digital reputation management across major platforms.\n\n## Quick Setup\n\n### 1. Get API Key\nSign up at [verosight.com](https://verosight.com) and generate an API key from the [API Keys dashboard](https://verosight.com/dashboard/keys). Keys start with `vlt_live_` (production) or `vlt_test_` (test).\n\n### 2. Authenticate\nExchange your API key for a JWT token (valid 24 hours):\n\n```bash\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\nOr use the bundled auth script:\n```bash\n./scripts/verosight-auth.sh vlt_live_YOUR_KEY\n```\n\n### 3. Query Data\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\"\n\n# Search posts\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,instagram&limit=10\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## API Endpoints\n\n### Posts\n```\nGET /v1/posts\n```\nSearch posts across platforms with filters.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated: `x,instagram,tiktok,youtube,threads,news_portal` |\n| `limit` | int | Results per page (default: 10, max: 50) |\n| `days` | int | Lookback period (1-90) |\n| `sentiment` | string | Filter: `positive`, `negative`, `neutral` |\n\n```\nGET /v1/posts/:id\n```\nGet a single post by ID.\n\n```\nGET /v1/posts/:id/comments\n```\nGet comments for a post.\n\n### Analytics\n```\nGET /v1/analytics/sentiment\n```\nSentiment analysis for a keyword. Returns positive/negative/neutral breakdown, weighted percentages, and sample posts.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated platforms |\n| `days` | int | Lookback period |\n| `limit` | int | Number of sample posts to return |\n\n```\nGET /v1/analytics/volume\n```\nPost/comment volume over time (daily breakdown).\n\n```\nGET /v1/analytics/trending\n```\nTrending posts and profiles for a keyword.\n\n### Profiles\n```\nGET /v1/profiles?query=ACCOUNT&source=instagram\n```\nSearch for social media profiles.\n\n```\nGET /v1/profiles/:source/:account\n```\nGet profile details (auto-crawls if missing).\n\n```\nGET /v1/profiles/:source/:account/stats\n```\nEngagement stats for a profile.\n\n### Search\n```\nPOST /v1/search\n```\nSemantic search across all content.\n\nBody:\n```json\n{\n  \"query\": \"keyword\",\n  \"sources\": [\"x\", \"instagram\"],\n  \"days\": 7\n}\n```\n\n### Account\n```\nGET /v1/account/balance\n```\nCheck credit balance (0 cost).\n\n```\nGET /v1/account/usage\n```\nUsage history and statistics (0 cost).\n\n## Response Format\n\nAll responses follow a standard envelope:\n\n```json\n{\n  \"data\": { ... },\n  \"meta\": {\n    \"request_id\": \"uuid\",\n    \"credits_used\": 2,\n    \"credits_remaining\": 998\n  },\n  \"pagination\": {\n    \"next_cursor\": \"base64...\",\n    \"has_more\": true,\n    \"total\": 38113\n  }\n}\n```\n\n## Workflows\n\n### Sentiment Analysis Report\n\n1. Authenticate → get JWT\n2. Query `/v1/analytics/sentiment` → get positive/negative/neutral breakdown\n3. Query `/v1/posts` with `sentiment=negative` → identify vocal accounts\n4. Query `/v1/analytics/volume` → trend over time\n5. Compile report: overview → trend → narratives → insights → recommendations\n\nFor detailed workflow, see [references/sentiment-workflow.md](references/sentiment-workflow.md).\n\n### Influencer Identification\n\n1. Query posts about target topic with high engagement\n2. Sort by likes, shares, views\n3. Cross-reference with sentiment (positive vs negative influencers)\n4. Profile top accounts for follower count and verification status\n\n### Bot Detection\n\n1. Query posts about target topic across platforms\n2. Look for patterns:\n   - Multiple posts from same account in short timeframe\n   - Identical or near-identical content across accounts\n   - Coordinated posting timing\n   - New accounts with abnormally high activity\n3. Flag suspicious accounts for manual review\n\n### PDF Report Generation\n\nGenerate professional reports with tables, charts, and formatted layouts using pdfkit (Node.js).\n\nSee [references/pdf-template.md](references/pdf-template.md) for complete guide.\n\n## Supported Platforms\n\n| Platform | Coverage |\n|----------|----------|\n| X (Twitter) | Posts, replies, engagement metrics |\n| Instagram | Posts, captions, engagement |\n| TikTok | Videos, descriptions |\n| YouTube | Videos, comments |\n| Threads | Posts, replies |\n| Facebook | Posts, pages |\n| LinkedIn | Posts, articles |\n| News Portals | Articles from Indonesian media |\n\n## Credit System\n\nEach successful API call (2xx response) costs credits. Failed calls (4xx/5xx) do not deduct credits.\n\n| Tier | Rate Limit | Starting Credits |\n|------|-----------|-----------------|\n| Standard | 60 req/min | 1,000 |\n| Pro | 300 req/min | 10,000 |\n| Enterprise | Custom | Custom |\n\nCheck balance:\n```bash\ncurl -s \"https://api.verosight.com/v1/account/balance\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## Known Limitations\n\n- News portal results dominate volume (~70%); social platforms contribute less\n- Semantic search returns broadly relevant results; source/date filters are limited\n- Instagram direct scraping often blocked; use Verosight API for Instagram data\n- Profile metadata (followers, account age) may not be available for all accounts\n\n## Bundled Resources\n\n| File | Purpose |\n|------|---------|\n| `references/sentiment-workflow.md` | Step-by-step sentiment analysis workflow with report template |\n| `references/pdf-template.md` | PDF generation guide with pdfkit (tables, charts, layout) |\n| `scripts/verosight-auth.sh` | Auth helper — exchange API key for JWT |\n| `scripts/quick-sentiment.sh` | Quick sentiment check from command line |\n\n## Links\n\n- [Verosight API](https://verosight.com)\n- [API Dashboard](https://verosight.com/dashboard)\n- [Documentation](https://verosight.com/docs)\n- [ClawHub](https://clawhub.com/skills/verosight-monitor)\n- [GitHub](https://github.com/jrrqd/verosight-monitor)\n\nFile v1.0.1:README.md\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/OpenClaw-Skill-2563EB?style=for-the-badge\" alt=\"OpenClaw Skill\" />\n  <img src=\"https://img.shields.io/badge/Version-1.0.0-8B5CF6?style=for-the-badge\" alt=\"v1.0.0\" />\n  <img src=\"https://img.shields.io/badge/License-MIT-22C55E?style=for-the-badge\" alt=\"MIT License\" />\n</p>\n\n<h1 align=\"center\">🔍 Verosight Monitor</h1>\n\n<p align=\"center\">\n  <strong>Social Media Intelligence Skill for OpenClaw Agents</strong><br/>\n  Real-time sentiment analysis, trend detection, influencer tracking, and bot detection<br/>\n  powered by <a href=\"https://verosight.com\">Verosight API</a>.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://clawhub.com/skills/verosight-monitor\">ClawHub</a> ·\n  <a href=\"https://verosight.com\">Verosight API</a> ·\n  <a href=\"https://github.com/openclaw/openclaw\">OpenClaw</a>\n</p>\n\n---\n\n## What Is This?\n\nVerosight Monitor is an OpenClaw skill that integrates the [Verosight API](https://verosight.com) for real-time social media intelligence. It enables AI agents to perform sentiment analysis, track trends, identify influencers, and detect bot activity across major social media platforms.\n\n### Supported Platforms\n\n| Platform | Data Available |\n|----------|---------------|\n| **X (Twitter)** | Posts, replies, engagement metrics |\n| **Instagram** | Posts, captions, engagement |\n| **TikTok** | Videos, descriptions, views |\n| **YouTube** | Videos, comments, engagement |\n| **Threads** | Posts, replies, engagement |\n| **Facebook** | Posts, pages |\n| **LinkedIn** | Posts, articles |\n| **News Portals** | Indonesian media articles |\n\n## Features\n\n- 📊 **Sentiment Analysis** — Positive/negative/neutral breakdown with engagement-weighted scoring\n- 📈 **Trend Detection** — Volume tracking over time with daily breakdowns\n- 👤 **Influencer Identification** — Find the most vocal and impactful accounts\n- 🤖 **Bot Detection** — Identify coordinated posting patterns and inauthentic behavior\n- 📄 **PDF Reports** — Professional reports with tables, charts, and formatted layouts\n- 🌐 **Multi-Platform** — Monitor across 8+ platforms simultaneously\n- ⚡ **Real-Time** — Live data from social media and news sources\n\n## Quick Start\n\n### Prerequisites\n\n- [OpenClaw](https://github.com/openclaw/openclaw) agent instance\n- Verosight API key ([sign up here](https://verosight.com))\n\n### Installation\n\n```bash\n# Via ClawHub (recommended)\nclawhub install verosight-monitor\n\n# Or clone manually\ngit clone https://github.com/jrrqd/verosight-monitor.git\ncp -r verosight-monitor ~/.openclaw/workspace/skills/\n```\n\n### Get Your API Key\n\n1. Sign up at [verosight.com](https://verosight.com)\n2. Go to [API Keys](https://verosight.com/dashboard/keys)\n3. Generate a new key (starts with `vlt_live_`)\n\n### Authenticate\n\n```bash\n# Exchange API key for JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\n### Your First Query\n\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=your_keyword&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## API Reference\n\n### Posts\n\n```bash\n# Search posts\nGET /v1/posts?query=KEYWORD&sources=x,instagram&limit=10&days=7\n\n# Get single post\nGET /v1/posts/:id\n\n# Get comments\nGET /v1/posts/:id/comments\n```\n\n### Analytics\n\n```bash\n# Sentiment analysis\nGET /v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\n\n# Volume over time\nGET /v1/analytics/volume?query=KEYWORD&days=7\n\n# Trending posts/profiles\nGET /v1/analytics/trending?query=KEYWORD&limit=10\n```\n\n### Profiles\n\n```bash\n# Search profiles\nGET /v1/profiles?query=ACCOUNT&source=instagram\n\n# Profile details\nGET /v1/profiles/:source/:account\n\n# Engagement stats\nGET /v1/profiles/:source/:account/stats\n```\n\n### Account\n\n```bash\n# Check balance (free)\nGET /v1/account/balance\n\n# Usage history (free)\nGET /v1/account/usage\n```\n\n## Use Cases\n\n| Use Case | Description |\n|----------|-------------|\n| **Digital Reputation Management** | Monitor brand mentions and sentiment in real-time |\n| **Crisis Detection** | Early warning for negative viral content |\n| **Competitor Analysis** | Track competitor mentions and public perception |\n| **Influencer Marketing** | Identify key voices and opinion leaders |\n| **Political Monitoring** | Track public opinion on policies and events |\n| **Bot Detection** | Identify coordinated inauthentic behavior networks |\n\n## Project Structure\n\n```\nverosight-monitor/\n├── SKILL.md                              # OpenClaw skill instructions\n├── README.md                             # This file\n├── LICENSE                               # MIT License\n├── references/\n│   ├── sentiment-workflow.md             # Step-by-step sentiment analysis guide\n│   └── pdf-template.md                   # PDF report generation with pdfkit\n└── scripts/\n    ├── verosight-auth.sh                 # Auth helper (API key → JWT)\n    └── quick-sentiment.sh                # Quick sentiment check CLI\n```\n\n## Credit System\n\nEach API call costs credits based on the endpoint:\n\n| Endpoint | Cost |\n|----------|------|\n| Posts search | 2 credits |\n| Sentiment analysis | 5 credits |\n| Volume analytics | 5 credits |\n| Trending | 5 credits |\n| Profile search | 2 credits |\n| Account balance | 0 credits |\n\nFree accounts start with **1,000 credits**. Failed requests (4xx/5xx) do not deduct credits.\n\n## Rate Limits\n\n| Tier | Limit |\n|------|-------|\n| Standard | 60 requests/minute |\n| Pro | 300 requests/minute |\n| Enterprise | Custom |\n\n## Contributing\n\nContributions are welcome! Please:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## License\n\nThis project is licensed under the MIT License — see the [LICENSE](LICENSE) file for details.\n\n## Links\n\n- [Verosight API](https://verosight.com) — API documentation and dashboard\n- [ClawHub](https://clawhub.com) — OpenClaw skill marketplace\n- [OpenClaw](https://github.com/openclaw/openclaw) — Open-source AI agent runtime\n- [Slameticon Digital Valley](https://slameticon.com) — Cyber monitoring platform\n\n---\n\n<p align=\"center\">\n  Built with 🔍 by <strong>Slameticon Digital Valley</strong>\n</p>\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7f5gtk7twvcw8bvhenbr0q5x83yqth\",\n  \"slug\": \"verosight-monitor\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1774930274100\n}\n\nFile v1.0.1:references/pdf-template.md\n\n# PDF Report Generation with pdfkit\n\nGenerate professional PDF reports with tables, charts, and formatted layouts using Node.js pdfkit.\n\n## Installation\n\n```bash\nnpm install pdfkit\n```\n\n## Basic Structure\n\n```javascript\nconst PDFDocument = require('pdfkit');\nconst fs = require('fs');\n\nconst doc = new PDFDocument({ \n  size: 'A4', \n  margin: 45,\n  info: {\n    Title: 'Report Title',\n    Author: 'SDVM',\n    Subject: 'Report Subject'\n  }\n});\n\ndoc.pipe(fs.createWriteStream('report.pdf'));\n\n// Page constants\nconst PAGE_W = 595.28;   // A4 width in points\nconst MG = 45;           // Margin\nconst CW = PAGE_W - (MG * 2);  // Content width: 505\nconst PAGE_H = 841.89;   // A4 height in points\nconst BOT = PAGE_H - 55; // Bottom limit\n\n// State\nlet pg = 1;  // Page number\nlet y = 0;   // Current Y position\n```\n\n## Page Management\n\n```javascript\nfunction newPage() {\n  doc.addPage();\n  pg++;\n  y = MG;\n  // Header\n  doc.fontSize(7).fillColor('#6B7280').text('Your Brand', MG, MG - 12);\n  doc.moveTo(MG, MG + 2).lineTo(PAGE_W - MG, MG + 2)\n    .strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n  y = MG + 12;\n}\n\nfunction footer() {\n  doc.fontSize(7).fillColor('#6B7280')\n    .text(`Page ${pg}`, MG, PAGE_H - 30, { align: 'center', width: CW });\n}\n\nfunction need(h = 60) {\n  if (y + h > BOT) { footer(); newPage(); }\n}\n```\n\n## Drawing Functions\n\n### Section Title\n\n```javascript\nfunction title(text) {\n  need(45);\n  doc.fontSize(13).fillColor('#1F2937').text(text, MG, y);\n  const tw = doc.widthOfString(text);\n  doc.moveTo(MG, y + 16).lineTo(MG + tw + 8, y + 16)\n    .strokeColor('#2563EB').lineWidth(1.5).stroke();\n  y += 28;\n}\n```\n\n### Paragraph\n\n```javascript\nfunction para(text, indent = 0) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 6);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 6;\n}\n```\n\n### Bullet List\n\n```javascript\nfunction bullet(text, indent = 18) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 5);\n  doc.fillColor('#2563EB').text('●', MG, y);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 5;\n}\n```\n\n### Info Box (measures text height FIRST, then draws box)\n\n```javascript\nfunction infoBox(text, bg = '#FEF2F2', border = '#DC2626') {\n  const pad = 12;\n  const w = CW - pad * 2;\n  doc.fontSize(9);\n  \n  // Calculate height FIRST\n  const textH = doc.heightOfString(text, { width: w, lineGap: 1 });\n  const boxH = textH + pad * 2;\n  need(boxH + 10);\n  \n  // Then draw\n  doc.fillColor(bg).rect(MG, y, CW, boxH).fill();\n  doc.rect(MG, y, CW, boxH).strokeColor(border).lineWidth(1).stroke();\n  doc.fillColor('#1F2937').text(text, MG + pad, y + pad, { width: w, lineGap: 1 });\n  y += boxH + 12;\n}\n```\n\n### Data Table (auto row height calculation)\n\n```javascript\nfunction table(headers, rows, colW) {\n  const pad = 6;\n  const fs = 8;\n  const hdrH = 24;\n  \n  doc.fontSize(fs);\n  \n  // Pre-calculate all row heights\n  const rowH = rows.map(row => {\n    let maxH = 22;\n    row.forEach((cell, ci) => {\n      const h = doc.heightOfString(cell || '', { \n        width: colW[ci] - pad * 2, \n        lineGap: 1 \n      });\n      const cellH = h + pad * 2;\n      if (cellH > maxH) maxH = cellH;\n    });\n    return maxH;\n  });\n  \n  const totalH = hdrH + rowH.reduce((a, b) => a + b, 0);\n  need(totalH + 15);\n  \n  let ty = y;\n  \n  // Draw header\n  doc.fillColor('#EFF6FF').rect(MG, ty, CW, hdrH).fill();\n  doc.rect(MG, ty, CW, hdrH).strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n  let cx = MG + pad;\n  headers.forEach((h, i) => {\n    doc.fontSize(fs).fillColor('#1F2937')\n      .text(h, cx, ty + pad + 2, { width: colW[i] - pad * 2, lineBreak: false });\n    cx += colW[i];\n  });\n  ty += hdrH;\n  \n  // Draw rows\n  rows.forEach((row, ri) => {\n    const rh = rowH[ri];\n    if (ri % 2 === 0) {\n      doc.fillColor('#F9FAFB').rect(MG, ty, CW, rh).fill();\n    }\n    doc.rect(MG, ty, CW, rh).strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n    \n    let rx = MG + pad;\n    doc.fontSize(fs).fillColor('#1F2937');\n    row.forEach((cell, ci) => {\n      doc.text(cell || '', rx, ty + pad, { \n        width: colW[ci] - pad * 2,\n        lineGap: 1\n      });\n      rx += colW[ci];\n    });\n    ty += rh;\n  });\n  \n  y = ty + 10;\n}\n```\n\n### Bar Chart\n\n```javascript\nfunction barChart(items, maxVal) {\n  const barH = 24;\n  const barMaxW = 300;\n  const lblW = 60;\n  \n  need(items.length * (barH + 10) + 15);\n  \n  items.forEach(item => {\n    const bw = Math.max(0, (item.value / maxVal) * barMaxW);\n    \n    // Label\n    doc.fontSize(9).fillColor('#1F2937')\n      .text(item.label, MG, y + 6, { width: lblW });\n    \n    // Background bar\n    doc.fillColor('#F3F4F6')\n      .rect(MG + lblW, y, barMaxW, barH).fill();\n    \n    // Value bar\n    if (bw > 0) {\n      doc.fillColor(item.color || '#2563EB')\n        .rect(MG + lblW, y, bw, barH).fill();\n    }\n    \n    // Value text\n    const valText = item.value.toLocaleString();\n    doc.fontSize(9)\n      .fillColor(bw > 55 ? '#FFFFFF' : '#1F2937')\n      .text(valText, MG + lblW + 6, y + 6, { \n        width: Math.max(bw - 12, 40) \n      });\n    \n    // Percentage (optional)\n    if (item.pct) {\n      doc.fontSize(8).fillColor('#6B7280')\n        .text(item.pct, MG + lblW + barMaxW + 10, y + 7);\n    }\n    \n    y += barH + 10;\n  });\n  \n  // Reset spacing\n  y += 5;\n}\n```\n\n## Color Palette\n\n```javascript\nconst C = {\n  red: '#DC2626',       // Danger, critical alerts\n  orange: '#EA580C',    // Warnings\n  green: '#16A34A',     // Positive, success\n  blue: '#2563EB',      // Primary, links\n  gray: '#6B7280',      // Secondary text\n  dark: '#1F2937',      // Primary text\n  lightGray: '#E5E7EB', // Borders\n  lighterGray: '#F3F4F6', // Backgrounds\n  white: '#FFFFFF',\n  headerBg: '#EFF6FF',  // Table header\n  rowAlt: '#F9FAFB',    // Alternating row\n  dangerBg: '#FEF2F2'   // Alert box\n};\n```\n\n## Common Pitfalls\n\n1. **Text overlap** — Always calculate text height BEFORE drawing boxes/containers. Use `doc.heightOfString()` first, then draw the box with that height.\n\n2. **Row height in tables** — Pre-calculate ALL row heights before drawing. Use the maximum height per row across all columns.\n\n3. **Page breaks** — Always call `need()` before drawing any multi-line element (tables, charts, info boxes).\n\n4. **Line gap** — Use `lineGap: 1` option for multi-line text to prevent crowding between lines.\n\n5. **Credit/secret info** — Remove internal API details (credits, keys, tokens) from client-facing reports.\n\n6. **Column widths** — Ensure column widths sum to content width. Test with long text to verify wrapping.\n\n7. **Font sizing** — Keep body text at 9pt minimum for readability in print.\n\n## Complete Example\n\n```javascript\nconst PDFDocument = require('pdfkit');\nconst fs = require('fs');\n\nconst doc = new PDFDocument({ size: 'A4', margin: 45 });\ndoc.pipe(fs.createWriteStream('output.pdf'));\n\nconst MG = 45, CW = 505, BOT = 786;\nlet pg = 1, y = MG;\n\n// ... include all helper functions above ...\n\n// Page 1\ntitle('Executive Summary');\ninfoBox('Status: CRITICAL — 60% negative sentiment detected across platforms.');\n\ntitle('Key Metrics');\ntable(\n  ['Metric', 'Value', 'Change', 'Status'],\n  [\n    ['Total Posts', '8,251', '+33%', 'High'],\n    ['Negative', '3,300', '+45%', 'Critical'],\n    ['Positive', '0', '-100%', 'None'],\n  ],\n  [120, 80, 80, 225]\n);\n\ntitle('Volume Trend');\nbarChart([\n  { label: 'Day 1', value: 3490, color: '#3B82F6', pct: '33%' },\n  { label: 'Day 2', value: 4646, color: '#EF4444', pct: '44%' },\n  { label: 'Day 3', value: 115, color: '#9CA3AF', pct: '1%' },\n], 4600);\n\nfooter();\ndoc.end();\n```\n\nFile v1.0.1:references/sentiment-workflow.md\n\n# Sentiment Analysis Workflow\n\nComplete workflow for conducting sentiment analysis using the Verosight API.\n\n## Step 1: Authentication\n\n```bash\n# Set your API key\nexport VEROSIGHT_API_KEY=\"vlt_live_YOUR_KEY\"\n\n# Get JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: $VEROSIGHT_API_KEY\" | jq -r '.token')\n\n# Verify token works\ncurl -s \"https://api.verosight.com/v1/account/balance\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## Step 2: Get Sentiment Data\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram,tiktok&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n### Response Fields\n\n| Field | Description |\n|-------|-------------|\n| `positive` / `negative` / `neutral` | Post counts by sentiment |\n| `positive_pct` / `negative_pct` / `neutral_pct` | Percentage breakdown |\n| `weighted_positive_pct` / `weighted_negative_pct` | Engagement-weighted percentages |\n| `sample_positive` / `sample_negative` | Sample posts with engagement data |\n| `sample_independent_negative` | Social media comments with negative sentiment |\n| `post_positive` / `post_negative` / `post_neutral` | Post-level sentiment counts |\n| `thread_positive` / `thread_negative` | Thread-level sentiment counts |\n| `independent_positive` / `independent_negative` | Independent comment sentiment |\n\n## Step 3: Get Volume Trend\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/volume?query=KEYWORD&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\nReturns daily breakdown of posts and comments by platform.\n\n## Step 4: Get High-Engagement Posts\n\n```bash\n# Negative posts from X\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x&sentiment=negative&limit=15&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n\n# All posts from specific platforms\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,threads&limit=20&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## Step 5: Compile Report\n\nUse the following structure for your report:\n\n### Report Template\n\n```markdown\n# 🔍 SDV REPORT\n## Keyword: \"[KEYWORD]\"\n**Period:** [START] – [END] | **Sources:** [PLATFORMS]\n\n---\n\n## 📊 SENTIMENT OVERVIEW\n\n| Sentiment | Count | % | Weighted |\n|-----------|-------|---|----------|\n| Positive  | X     | X%| X%       |\n| Negative  | X     | X%| X%       |\n| Neutral   | X     | X%| X%       |\n\n**Status:** [CRITICAL / HIGH / MEDIUM / LOW]\n\n## 📈 VOLUME TREND\n\n| Date | Posts | Change |\n|------|-------|--------|\n| Day 1| X     | -      |\n| Day 2| X     | +X%    |\n\n## 🔴 TOP NEGATIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes, X shares)\n   - Full quote or summary\n\n2. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 🟢 TOP POSITIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 👤 VOCAL ACCOUNTS (Negative)\n\n| Account | Platform | Engagement | Narrative |\n|---------|----------|------------|-----------|\n| @user1  | X        | 500 likes  | Topic A   |\n| @user2  | Threads  | 200 likes  | Topic B   |\n\n## 📡 PLATFORM BREAKDOWN\n\n| Platform | Volume | % | Engagement | Dominant Sentiment |\n|----------|--------|---|------------|-------------------|\n| News Portal | X | X% | Low | Factual |\n| X (Twitter) | X | X% | Medium | Opinion/criticism |\n| Threads     | X | X% | HIGH | Emotional/viral |\n\n## 💡 INSIGHTS\n\n1. [Key finding about sentiment trend]\n2. [Key finding about narrative shift]\n3. [Key finding about platform dynamics]\n\n## ⚠️ PREDICTIONS (48h)\n\n| Risk | Probabil\n\nArchive v1.0.0: 7 files, 8240 bytes\n\nFiles: README.md (3442b), references/pdf-template.md (4040b), references/sentiment-workflow.md (2429b), scripts/quick-sentiment.sh (877b), scripts/verosight-auth.sh (666b), SKILL.md (3996b), _meta.json (136b)","readmeExcerpt":"Skill: Verosight Monitor Owner: jrrqd Summary: Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection... Tags: latest:1.1.2 Version history: v1.1.2 | 2026-07-22T16:47:53.462Z | user Added MCP server support, 14+ platforms (Reddit, Darkweb, Capital Market), 30 MCP tools v1.1.1 | 2026-07-22T16:44:57.357Z | user Added ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"JWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')"},{"language":"bash","snippet":"./scripts/verosight-auth.sh vlt_live_YOUR_KEY"},{"language":"bash","snippet":"curl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\""},{"language":"bash","snippet":"curl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,instagram&limit=10\" \\\n  -H \"Authorization: Bearer $JWT\""},{"language":"bash","snippet":"# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\"\n\n# Search posts\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,instagram&limit=10\" \\\n  -H \"Authorization: Bearer $JWT\""},{"language":"text","snippet":"GET /v1/posts"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: verosight-monitor\ndescription: \"Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection across X (Twitter), Instagram, TikTok, YouTube, Threads, and news portals. Use when: user asks for sentiment analysis, social media monitoring, trend analysis, influencer tracking, bot detection, or mentions 'Verosight', 'social listening', 'cyber monitoring', 'digital reputation'. Covers auth setup, querying posts, analytics (sentiment/trending/volume), profile search, and report generation.\"\n---\n\n# Verosight Monitor — Social Media Intelligence Skill\n\nIntegrate Verosight API for real-time social media monitoring and digital reputation management across major platforms.\n\n## Quick Setup\n\n### 1. Get API Key\nSign up at [verosight.com](https://verosight.com) and generate an API key from the [API Keys dashboard](https://verosight.com/dashboard/keys). Keys start with `vlt_live_` (production) or `vlt_test_` (test).\n\n### 2. Authenticate\nExchange your API key for a JWT token (valid 24 hours):\n\n```bash\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\nOr use the bundled auth script:\n```bash\n./scripts/verosight-auth.sh vlt_live_YOUR_KEY\n```\n\n### 3. Query Data\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\"\n\n# Search posts\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,instagram&limit=10\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## API Endpoints\n\n### Posts\n```\nGET /v1/posts\n```\nSearch posts across platforms with filters.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated: `x,instagram,tiktok,youtube,threads,news_portal` |\n| `limit` | int | Results per page (default: 10, max: 50) |\n| `days` | int | Lookback period (1-90) |\n| `sentiment` | string | Filter: `positive`, `negative`, `neutral` |\n\n```\nGET /v1/posts/:id\n```\nGet a single post by ID.\n\n```\nGET /v1/posts/:id/comments\n```\nGet comments for a post.\n\n### Analytics\n```\nGET /v1/analytics/sentiment\n```\nSentiment analysis for a keyword. Returns positive/negative/neutral breakdown, weighted percentages, and sample posts.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `query` | string | Search keyword |\n| `sources` | string | Comma-separated platforms |\n| `days` | int | Lookback period |\n| `limit` | int | Number of sample posts to return |\n\n```\nGET /v1/analytics/volume\n```\nPost/comment volume over time (daily breakdown).\n\n```\nGET /v1/analytics/trending\n```\nTrending posts and profiles for a keyword.\n\n### Profiles\n```\nGET /v1/profiles?query=ACCOUNT&source=instagram\n```\nSearch for social media profiles.\n\n```\nGET /v1/profiles/:source/:account\n```\nGet profile details (auto-crawls if missing)."},{"path":"README.md","content":"# 🔍 Verosight Monitor\n\n**Social Media Intelligence Skill for OpenClaw Agents**\n\nReal-time sentiment analysis, trend detection, influencer tracking, and bot detection powered by [Verosight API](https://verosight.com).\n\n[![OpenClaw Skill](https://img.shields.io/badge/OpenClaw-Skill-2563EB?style=for-the-badge)](https://github.com/openclaw/openclaw)\n[![Version](https://img.shields.io/badge/Version-1.0.1-8B5CF6?style=for-the-badge)](https://clawhub.com/skills/verosight-monitor)\n[![License](https://img.shields.io/badge/License-MIT-22C55E?style=for-the-badge)](LICENSE)\n\n---\n\n## What Is This?\n\nVerosight Monitor is an OpenClaw skill that integrates the [Verosight API](https://verosight.com) for real-time social media intelligence. It enables AI agents to perform sentiment analysis, track trends, identify influencers, and detect bot activity across major social media platforms.\n\n### Supported Platforms\n\n- **X (Twitter)** — Posts, replies, engagement metrics\n- **Instagram** — Posts, captions, engagement\n- **TikTok** — Videos, descriptions, views\n- **YouTube** — Videos, comments, engagement\n- **Threads** — Posts, replies, engagement\n- **Facebook** — Posts, pages\n- **LinkedIn** — Posts, articles\n- **News Portals** — Indonesian media articles\n\n## Features\n\n- 📊 **Sentiment Analysis** — Positive/negative/neutral breakdown with engagement-weighted scoring\n- 📈 **Trend Detection** — Volume tracking over time with daily breakdowns\n- 👤 **Influencer Identification** — Find the most vocal and impactful accounts\n- 🤖 **Bot Detection** — Identify coordinated posting patterns and inauthentic behavior\n- 📄 **PDF Reports** — Professional reports with tables, charts, and formatted layouts\n- 🌐 **Multi-Platform** — Monitor across 8+ platforms simultaneously\n- ⚡ **Real-Time** — Live data from social media and news sources\n\n## Quick Start\n\n### Prerequisites\n\n- [OpenClaw](https://github.com/openclaw/openclaw) agent instance\n- Verosight API key ([sign up here](https://verosight.com))\n\n### Installation\n\n```bash\n# Via ClawHub (recommended)\nclawhub install verosight-monitor\n\n# Or clone manually\ngit clone https://github.com/jrrqd/verosight-monitor.git\ncp -r verosight-monitor ~/.openclaw/workspace/skills/\n```\n\n### Get Your API Key\n\n1. Sign up at [verosight.com](https://verosight.com)\n2. Go to [API Keys](https://verosight.com/dashboard/keys)\n3. Generate a new key (starts with `vlt_live_`)\n\n### Authenticate\n\n```bash\n# Exchange API key for JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: vlt_live_YOUR_KEY\" | jq -r '.token')\n```\n\n### Your First Query\n\n```bash\n# Sentiment analysis\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=your_keyword&sources=x,instagram&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## API Reference\n\n### Posts\n\n```bash\n# Search posts\nGET /v1/posts?query=KEYWORD&sources=x,instagram&limit=10&days=7\n\n# Get single post\nGET /v1/posts/:id\n\n# Get comments\nGET /v1/posts/:id/comments\n```\n\n##"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7f5gtk7twvcw8bvhenbr0q5x83yqth\",\n  \"slug\": \"verosight-monitor\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1784738873462\n}"},{"path":"references/pdf-template.md","content":"# PDF Report Generation with pdfkit\n\nGenerate professional PDF reports with tables, charts, and formatted layouts using Node.js pdfkit.\n\n## Installation\n\n```bash\nnpm install pdfkit\n```\n\n## Basic Structure\n\n```javascript\nconst PDFDocument = require('pdfkit');\nconst fs = require('fs');\n\nconst doc = new PDFDocument({ \n  size: 'A4', \n  margin: 45,\n  info: {\n    Title: 'Report Title',\n    Author: 'SDVM',\n    Subject: 'Report Subject'\n  }\n});\n\ndoc.pipe(fs.createWriteStream('report.pdf'));\n\n// Page constants\nconst PAGE_W = 595.28;   // A4 width in points\nconst MG = 45;           // Margin\nconst CW = PAGE_W - (MG * 2);  // Content width: 505\nconst PAGE_H = 841.89;   // A4 height in points\nconst BOT = PAGE_H - 55; // Bottom limit\n\n// State\nlet pg = 1;  // Page number\nlet y = 0;   // Current Y position\n```\n\n## Page Management\n\n```javascript\nfunction newPage() {\n  doc.addPage();\n  pg++;\n  y = MG;\n  // Header\n  doc.fontSize(7).fillColor('#6B7280').text('Your Brand', MG, MG - 12);\n  doc.moveTo(MG, MG + 2).lineTo(PAGE_W - MG, MG + 2)\n    .strokeColor('#E5E7EB').lineWidth(0.5).stroke();\n  y = MG + 12;\n}\n\nfunction footer() {\n  doc.fontSize(7).fillColor('#6B7280')\n    .text(`Page ${pg}`, MG, PAGE_H - 30, { align: 'center', width: CW });\n}\n\nfunction need(h = 60) {\n  if (y + h > BOT) { footer(); newPage(); }\n}\n```\n\n## Drawing Functions\n\n### Section Title\n\n```javascript\nfunction title(text) {\n  need(45);\n  doc.fontSize(13).fillColor('#1F2937').text(text, MG, y);\n  const tw = doc.widthOfString(text);\n  doc.moveTo(MG, y + 16).lineTo(MG + tw + 8, y + 16)\n    .strokeColor('#2563EB').lineWidth(1.5).stroke();\n  y += 28;\n}\n```\n\n### Paragraph\n\n```javascript\nfunction para(text, indent = 0) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 6);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 6;\n}\n```\n\n### Bullet List\n\n```javascript\nfunction bullet(text, indent = 18) {\n  const w = CW - indent;\n  doc.fontSize(9);\n  const h = doc.heightOfString(text, { width: w });\n  need(h + 5);\n  doc.fillColor('#2563EB').text('●', MG, y);\n  doc.fillColor('#1F2937').text(text, MG + indent, y, { width: w, lineGap: 1 });\n  y += h + 5;\n}\n```\n\n### Info Box (measures text height FIRST, then draws box)\n\n```javascript\nfunction infoBox(text, bg = '#FEF2F2', border = '#DC2626') {\n  const pad = 12;\n  const w = CW - pad * 2;\n  doc.fontSize(9);\n  \n  // Calculate height FIRST\n  const textH = doc.heightOfString(text, { width: w, lineGap: 1 });\n  const boxH = textH + pad * 2;\n  need(boxH + 10);\n  \n  // Then draw\n  doc.fillColor(bg).rect(MG, y, CW, boxH).fill();\n  doc.rect(MG, y, CW, boxH).strokeColor(border).lineWidth(1).stroke();\n  doc.fillColor('#1F2937').text(text, MG + pad, y + pad, { width: w, lineGap: 1 });\n  y += boxH + 12;\n}\n```\n\n### Data Table (auto row height calculation)\n\n```javascript\nfunction table(headers, rows, colW) {\n  const pad = 6;\n  const fs = 8;\n  const hdrH = 24;\n  \n  doc.fontSize(fs);\n "},{"path":"references/sentiment-workflow.md","content":"# Sentiment Analysis Workflow\n\nComplete workflow for conducting sentiment analysis using the Verosight API.\n\n## Step 1: Authentication\n\n```bash\n# Set your API key\nexport VEROSIGHT_API_KEY=\"vlt_live_YOUR_KEY\"\n\n# Get JWT token (valid 24h)\nJWT=$(curl -s -X POST \"https://api.verosight.com/v1/auth/token\" \\\n  -H \"X-API-Key: $VEROSIGHT_API_KEY\" | jq -r '.token')\n\n# Verify token works\ncurl -s \"https://api.verosight.com/v1/account/balance\" \\\n  -H \"Authorization: Bearer $JWT\"\n```\n\n## Step 2: Get Sentiment Data\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/sentiment?query=KEYWORD&sources=x,instagram,tiktok&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n### Response Fields\n\n| Field | Description |\n|-------|-------------|\n| `positive` / `negative` / `neutral` | Post counts by sentiment |\n| `positive_pct` / `negative_pct` / `neutral_pct` | Percentage breakdown |\n| `weighted_positive_pct` / `weighted_negative_pct` | Engagement-weighted percentages |\n| `sample_positive` / `sample_negative` | Sample posts with engagement data |\n| `sample_independent_negative` | Social media comments with negative sentiment |\n| `post_positive` / `post_negative` / `post_neutral` | Post-level sentiment counts |\n| `thread_positive` / `thread_negative` | Thread-level sentiment counts |\n| `independent_positive` / `independent_negative` | Independent comment sentiment |\n\n## Step 3: Get Volume Trend\n\n```bash\ncurl -s \"https://api.verosight.com/v1/analytics/volume?query=KEYWORD&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\nReturns daily breakdown of posts and comments by platform.\n\n## Step 4: Get High-Engagement Posts\n\n```bash\n# Negative posts from X\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x&sentiment=negative&limit=15&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n\n# All posts from specific platforms\ncurl -s \"https://api.verosight.com/v1/posts?query=KEYWORD&sources=x,threads&limit=20&days=7\" \\\n  -H \"Authorization: Bearer $JWT\" | jq .\n```\n\n## Step 5: Compile Report\n\nUse the following structure for your report:\n\n### Report Template\n\n```markdown\n# 🔍 SDV REPORT\n## Keyword: \"[KEYWORD]\"\n**Period:** [START] – [END] | **Sources:** [PLATFORMS]\n\n---\n\n## 📊 SENTIMENT OVERVIEW\n\n| Sentiment | Count | % | Weighted |\n|-----------|-------|---|----------|\n| Positive  | X     | X%| X%       |\n| Negative  | X     | X%| X%       |\n| Neutral   | X     | X%| X%       |\n\n**Status:** [CRITICAL / HIGH / MEDIUM / LOW]\n\n## 📈 VOLUME TREND\n\n| Date | Posts | Change |\n|------|-------|--------|\n| Day 1| X     | -      |\n| Day 2| X     | +X%    |\n\n## 🔴 TOP NEGATIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes, X shares)\n   - Full quote or summary\n\n2. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 🟢 TOP POSITIVE NARRATIVES\n\n1. **[Narrative title]** — @account (Platform, X likes)\n   - Full quote or summary\n\n## 👤 VOCAL ACCOUNTS (Negative)\n\n| Account | Platform | Engagement | Narrative |\n|---------|----"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection... Skill: Verosight Monitor Owner: jrrqd Summary: Integrate Verosight API for social media intelligence and cyber monitoring. Sentiment analysis, trend detection, influencer identification, and bot detection... Tags: latest:1.1.2 Version history: v1.1.2 | 2026-07-22T16:47:53.462Z | user Added MCP server support, 14+ platforms (Reddit, Darkweb, Capital Market), 30 MCP tools v1.1.1 | 2026-07-22T16:44:57.357Z | user Added","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1193,"uniquenessScore":46,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T06:51:12.695Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T06:51:12.695Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T09:08:55.010Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}